我已经在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;
答案 0 :(得分:2)
该过程需要一个参数,所以-提供它。
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
答案 1 :(得分:0)
过程主体没有问题。您可以这样拨打电话:
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
答案 2 :(得分:0)
关于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快捷方式,它对括号的要求不那么苛刻,并且无论是否带有括号都给出相同的错误消息。