如何调用只有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;

但是我无法调用它

我尝试了以下代码片段:

  1. EXEC GREETINGS();
  2. EXEC GREETINGS;
  3. 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 快捷方式,它对括号不那么挑剔,无论有无括号都给出相同的错误消息他们。

variable and print 是 SQL*Plus 命令,在其他环境中可能不受支持。)