在Oracle中使用另一个调用存储过程

ele*_*eep 35 sql oracle stored-procedures

有没有人知道从另一个方面调用存储过程的方式,或者即使它可能的方式?如果是这样,你会怎么做?

这是我的测试代码:

SET SERVEROUTPUT ON;

DROP PROCEDURE test_sp_1;
DROP PROCEDURE test_sp;

CREATE PROCEDURE test_sp
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Test works');
END;
/

CREATE PROCEDURE test_sp_1
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Testing');
    test_sp;
END;
/

CALL test_sp_1;
Run Code Online (Sandbox Code Playgroud)

Sha*_*nce 46

您的存储过程按编码方式工作.问题出在最后一行,它无法调用您的任何存储过程.

在SQL*Plus三种选择是:call,exec,和anoymous PL/SQL块.

call似乎是一个SQL关键字,并在SQL Reference中有记录.http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG语法图表明,即使没有参数传递给调用例程,也需要进行肠胃外给药.

CALL test_sp_1();
Run Code Online (Sandbox Code Playgroud)

匿名PL/SQL块是不在命名过程,函数,触发器等内的PL/SQL.它可用于调用您的过程.

BEGIN
    test_sp_1;
END;
/
Run Code Online (Sandbox Code Playgroud)

Exec是一个SQL*Plus命令,它是上述匿名块的快捷方式.EXEC <procedure_name>将作为传递给DB服务器BEGIN <procedure_name>; END;

完整示例:

SQL> SET SERVEROUTPUT ON
SQL> CREATE OR REPLACE PROCEDURE test_sp 
  2  AS 
  3  BEGIN 
  4      DBMS_OUTPUT.PUT_LINE('Test works'); 
  5  END;
  6  /

Procedure created.

SQL> CREATE OR REPLACE PROCEDURE test_sp_1 
  2  AS
  3  BEGIN
  4      DBMS_OUTPUT.PUT_LINE('Testing'); 
  5      test_sp; 
  6  END;
  7  /

Procedure created.

SQL> CALL test_sp_1();
Testing
Test works

Call completed.

SQL> exec test_sp_1
Testing
Test works

PL/SQL procedure successfully completed.

SQL> begin
  2      test_sp_1;
  3  end;
  4  /
Testing
Test works

PL/SQL procedure successfully completed.

SQL> 
Run Code Online (Sandbox Code Playgroud)


dcp*_*dcp 14

当然,你只是在SP内部调用它,没有特殊的语法.

例如:

   PROCEDURE some_sp
   AS
   BEGIN
      some_other_sp('parm1', 10, 20.42);
   END;
Run Code Online (Sandbox Code Playgroud)

如果该过程与执行过程所在的模式不同,则需要在其前面加上模式名称.

   PROCEDURE some_sp
   AS
   BEGIN
      other_schema.some_other_sp('parm1', 10, 20.42);
   END;
Run Code Online (Sandbox Code Playgroud)


Raj*_*thi 5

@Michael Lockwood - 您不需要在任何地方使用关键字“CALL”。您只需要直接提及过程调用即可。

那是

Begin
   proc1(input1, input2);
end;
/
Run Code Online (Sandbox Code Playgroud)

代替

Begin
   call proc1(input1, input2);
end;
/
Run Code Online (Sandbox Code Playgroud)