代码之家  ›  专栏  ›  技术社区  ›  sanrns

如何使用select语句编写Oracle过程(特别是在SQL Developer上)?

  •  1
  • sanrns  · 技术社区  · 7 年前

    我一直在尝试使用以下语法:

    create or replace PROCEDURE Getmarketdetails2(data OUT varchar2)
    IS
    BEGIN
    
      SELECT *
      into data
      from  dual;
    
    END Getmarketdetails2;
    

    但是当我试图用下面的exec语句执行时,它给了我一个错误

    Declare a Varchar2;
    exec Getmarketdetails2(a);
    

    错误: PLS-00103:在期望“其他内容”时遇到符号“文件结束”。

    原因: 通常是PL/SQL编译错误。

    如果有人能帮我摆脱这一悬而未决的局面,我将不胜感激!我已经尝试了很多,找到了一个基本的指南来创建一个简单的Oracle存储过程并在SQL Developer中执行它,但没有一个能回答这个问题!!

    4 回复  |  直到 7 年前
        1
  •  2
  •   MT0    7 年前

    DECLARE
      a VARCHAR2(4000);          -- Give it a size
    BEGIN                        -- Begin the anonymous PL/SQL block
      Getmarketdetails2(a);      -- Call the procedure
      DBMS_OUTPUT.PUT_LINE( a ); -- Output the value
    END;                         -- End the anonymous PL/SQL block
    /                            -- End the PL/SQL statement
    

    或:

    VARIABLE a VARCHAR2(4000);   -- Create a bind variable
    EXEC Getmarketdetails2(:a);  -- Execute the procedure using the bind variable
    PRINT a                      -- Print the bind variable
    
        2
  •  1
  •   a_horse_with_no_name    7 年前

    假设是最新的Oracle版本,您可以使用 dbms_sql.return_result()

    create or replace PROCEDURE Getmarketdetails2
    IS
      c1 SYS_REFCURSOR;  
    BEGIN
    
      OPEN c1 FOR 
      SELECT *
      from  dual;
      DBMS_SQL.RETURN_RESULT(c1);
    
    END Getmarketdetails2;
    /
    

    然后简单地运行

    exec Getmarketdetails2
    

    唯一的缺点是SQL Developer只将结果显示为文本,而不是适当的结果网格。

        3
  •  1
  •   Mitch3091    7 年前

    这是我在Oracle中返回光标的方式

    PROCEDURE GetAllData (P_CURSOR OUT SYS_REFCURSOR)
    IS
    BEGIN
    
      OPEN P_CURSOR FOR
        SELECT *
        FROM TABLE ;
    
    END GetAllData ;
    
        4
  •  0
  •   a_horse_with_no_name    7 年前
    Declare a Varchar2; 
    exec Getmarketdetails2(a);
    

    Declare 
      a Varchar2(10); 
    Begin
      Getmarketdetails2(a);
    End;