如何在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_FOUND
或TOO_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->) 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中调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章