【问题标题】:How to call a stored procedure in pl/sql developer如何在pl/sql developer中调用存储过程
【发布时间】:2021-12-15 07:36:14
【问题描述】:

我是新手,有一个简单的问题。

我在 pl/sql developer 中创建了一个类似的过程

CREATE OR REPLACE PROCEDURE myproc2 AS
BEGIN
  SELECT cd_desc des, cd_value cd FROM v_codes WHERE cd_type='CVS02'
END;

现在我想调用该过程并查看输出,但是当我运行它时

BEGIN 
   myproc2; 
  END; 

在 Pl/sql 中我收到一条错误消息,指出对象 myproc2 无效

如何在 PL/SQL 中调用存储过程?

【问题讨论】:

  • 在使用BEGIN之前的数据类型定义变量后,需要使用INTO子句如INTO des, cd将列返回给变量。并且不要忘记用分号结束 SQL 语句。

标签: oracle plsql


【解决方案1】:

你称它为正确,但过程是错误。如果您检查它的状态,它是无效

在 PL/SQL 中,SELECT 需要 INTO

CREATE OR REPLACE PROCEDURE myproc2 AS
  l_cd_desc   v_codes.cd_desc%type;
  l_cd_value  v_codes.cd_value%type;
BEGIN
  SELECT v.cd_desc, v.cd_value 
    INTO l_cd_desc, l_cd_value
  FROM v_codes v
  WHERE v.cd_type = 'CVS02';
END;

注意可能的NO_DATA_FOUNDTOO_MANY_ROWS 异常。


此外,虽然它现在可以正常运行(我猜),但您将看不到任何东西,因为您不知道接下来要做什么。例如,您可以选择显示您获取的值。在这种情况下,添加

  <snip>
  WHERE v.cd_type = 'CVS02';

  dbms_output.put_line(l_cd_desc ||', '|| l_cd_value);
END;

不要忘记启用服务器输出。


正如你评论的那样,你得到了too_many_rows。如何处理?这取决于你想做什么。一种选择是切换到光标FOR 循环;现在你不需要局部变量并且 - 因为没有 SELECT 语句本身 - 也没有 INTO 子句:

CREATE OR REPLACE PROCEDURE myproc2
AS
BEGIN
   FOR cur_r IN (SELECT v.cd_desc, v.cd_value
                   FROM v_codes v
                  WHERE v.cd_type = 'CVS02')
   LOOP
      DBMS_OUTPUT.put_line (cur_r.cd_desc || ', ' || cur_r.cd_value);
   END LOOP;
END;

【讨论】:

  • 是的,我得到了太多行异常如何处理
  • 您可以创建一个异常处理部分,或切换到例如一个光标 FOR 循环(如我的示例所示;看看)。
【解决方案2】:

Oracle SQL Developer 的一大优点是 GUI,它可以为您做事。

您可以打开工作表并以传统方式运行它:

BEGIN
  PROCEDURENAME(PARAM);
END;

或者您也可以使用 GUI,找到带有 (View-&gt;) Find DB object 的对象,找到它,单击它并使用工具栏中的 green arrow。它将为您在过程中使用的任何参数打开一个 UI。

【讨论】:

    【解决方案3】:

    在 SQL Developer 中,如果您想查看输出,则可以返回一个游标:

    CREATE OR REPLACE PROCEDURE myproc2(
      o_cursor OUT SYS_REFCURSOR
    )
    AS
    BEGIN
      OPEN o_cursor FOR
      SELECT cd_desc AS des,
             cd_value AS cd
      FROM   v_codes
      WHERE cd_type='CVS02'; -- You need a ; statement terminator here.
    END;
    /
    

    那么你可以使用:

    -- Declare a cursor bind variable
    VARIABLE cur SYS_REFCURSOR;
    
    BEGIN
      -- Call the cursor outputting into the bind variable.
      myproc2(:cur);
    END;
    /
    
    -- Print the cursor
    PRINT :cur;
    

    并将其作为脚本运行(使用 F5)。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2022-01-18
      • 2017-04-13
      • 2021-11-08
      • 2018-04-05
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多