如何在pl/sql developer中调用存储过程

Posted

技术标签:

【中文标题】如何在pl/sql developer中调用存储过程【英文标题】:How to call a stored procedure in 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 语句。 【参考方案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)。

【讨论】:

以上是关于如何在pl/sql developer中调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql developer中如何调试存储过程

PL/SQL Developer 如何记住密码

在 PL/SQL Developer 中通过电子邮件发送查询结果

PL/SQL Developer 中执行过程的问题

PL/SQL Developer 查询中程序停止响应

如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程