如何仅使用OUT参数调用存储过程?

时间:2019-04-29 20:32:14

标签: oracle stored-procedures oracle11g call

我已经在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;

3 个答案:

答案 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快捷方式,它对括号的要求不那么苛刻,并且无论是否带有括号都给出相同的错误消息。

({variableprint是SQL * Plus命令,在其他环境中可能不受支持。)