如何调用只有OUT参数的存储过程?
How to call stored procedure with only OUT parameter?
我在 Oracle 11g 中创建了一个存储过程:
CREATE OR REPLACE PROCEDURE greetings(cnt OUT VARCHAR2)
AS
BEGIN
SELECT COUNT(*)
INTO cnt
FROM SYS.all_tables;
END greetings;
但是我无法调用它
我尝试了以下代码片段:
EXEC GREETINGS();
EXEC GREETINGS;
CALL GREETINGS;
该过程需要一个参数,所以 - 提供它。
SQL> CREATE OR REPLACE PROCEDURE greetings(cnt OUT VARCHAR2)
2 AS
3 BEGIN
4 SELECT COUNT(*)
5 INTO cnt
6 FROM SYS.all_tables;
7 END greetings;
8 /
Procedure created.
一个适用于任何地方的选项是使用匿名 PL/SQL 块:
SQL> set serveroutput on
SQL> declare
2 l_cnt number;
3 begin
4 greetings(l_cnt);
5 dbms_output.put_line(l_cnt);
6 end;
7 /
87
PL/SQL procedure successfully completed.
另一个在 SQL*Plus(或任何其他能够模拟它的工具)中工作:
SQL> var l_cnt number;
SQL> exec greetings(:l_cnt);
PL/SQL procedure successfully completed.
SQL> print l_cnt;
L_CNT
----------
87
程序体没有问题。你可以这样调用:
SQL> var nmr number;
SQL> exec greetings(:nmr);
PL/SQL procedure successfully completed
nmr
------------------------------------------
306 -- > <a numeric value returns in string format>
Oracle 不关心将数值分配给字符串。执行直接打印结果,但只要你想,你可以再次调用 variable(nmr) 的值,并打印为
SQL> print nmr
nmr
---------
306
关于call
的例子,在EXECUTE recognizes a stored procedure, CALL does not中有解释。从语法文档中看并不明显,但它确实需要括号,所以它(相当无益)拒绝了整个事情并给人的印象是 greetings
是问题所在,但实际上不是:
SQL> call greetings;
call greetings
*
ERROR at line 1:
ORA-06576: not a valid function or procedure name
在使用强制括号时,您会遇到真正的问题:
SQL> call greetings();
call greetings()
*
ERROR at line 1:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'GREETINGS'
正如其他人所指出的,您缺少参数。
SQL> var n number
SQL>
SQL> call greetings(:n);
Call completed.
SQL> print :n
N
----------
134
execute
只是 PL/SQL 块 begin xxx; end;
的便捷 SQL*Plus 快捷方式,它对括号不那么挑剔,无论有无括号都给出相同的错误消息他们。
我在 Oracle 11g 中创建了一个存储过程:
CREATE OR REPLACE PROCEDURE greetings(cnt OUT VARCHAR2)
AS
BEGIN
SELECT COUNT(*)
INTO cnt
FROM SYS.all_tables;
END greetings;
但是我无法调用它
我尝试了以下代码片段:
EXEC GREETINGS();
EXEC GREETINGS;
CALL GREETINGS;
该过程需要一个参数,所以 - 提供它。
SQL> CREATE OR REPLACE PROCEDURE greetings(cnt OUT VARCHAR2)
2 AS
3 BEGIN
4 SELECT COUNT(*)
5 INTO cnt
6 FROM SYS.all_tables;
7 END greetings;
8 /
Procedure created.
一个适用于任何地方的选项是使用匿名 PL/SQL 块:
SQL> set serveroutput on
SQL> declare
2 l_cnt number;
3 begin
4 greetings(l_cnt);
5 dbms_output.put_line(l_cnt);
6 end;
7 /
87
PL/SQL procedure successfully completed.
另一个在 SQL*Plus(或任何其他能够模拟它的工具)中工作:
SQL> var l_cnt number;
SQL> exec greetings(:l_cnt);
PL/SQL procedure successfully completed.
SQL> print l_cnt;
L_CNT
----------
87
程序体没有问题。你可以这样调用:
SQL> var nmr number;
SQL> exec greetings(:nmr);
PL/SQL procedure successfully completed
nmr
------------------------------------------
306 -- > <a numeric value returns in string format>
Oracle 不关心将数值分配给字符串。执行直接打印结果,但只要你想,你可以再次调用 variable(nmr) 的值,并打印为
SQL> print nmr
nmr
---------
306
关于call
的例子,在EXECUTE recognizes a stored procedure, CALL does not中有解释。从语法文档中看并不明显,但它确实需要括号,所以它(相当无益)拒绝了整个事情并给人的印象是 greetings
是问题所在,但实际上不是:
SQL> call greetings;
call greetings
*
ERROR at line 1:
ORA-06576: not a valid function or procedure name
在使用强制括号时,您会遇到真正的问题:
SQL> call greetings();
call greetings()
*
ERROR at line 1:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'GREETINGS'
正如其他人所指出的,您缺少参数。
SQL> var n number
SQL>
SQL> call greetings(:n);
Call completed.
SQL> print :n
N
----------
134
execute
只是 PL/SQL 块 begin xxx; end;
的便捷 SQL*Plus 快捷方式,它对括号不那么挑剔,无论有无括号都给出相同的错误消息他们。