是否有人知道从另一个内部调用存储过程的方式,或者即使它可能的方式?如果是这样,你会怎么做?
这是我的测试代码:
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;
答案 0 :(得分:46)
您的存储过程按编码方式工作。问题出在最后一行,它无法调用任何一个存储过程。
SQL * Plus中的三个选项是:call
,exec
和一个令人厌恶的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();
匿名PL / SQL块是不在命名过程,函数,触发器等内的PL / SQL。它可用于调用您的过程。
BEGIN
test_sp_1;
END;
/
Exec
是一个SQL * Plus命令,它是上述匿名块的快捷方式。 EXEC <procedure_name>
将作为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>
答案 1 :(得分:14)
当然,你只是在SP中调用它,没有特殊的语法。
例如:
PROCEDURE some_sp
AS
BEGIN
some_other_sp('parm1', 10, 20.42);
END;
如果该过程与执行过程所在的模式不同,则需要在其前面加上模式名称。
PROCEDURE some_sp
AS
BEGIN
other_schema.some_other_sp('parm1', 10, 20.42);
END;
答案 2 :(得分:2)
@Michael Lockwood - 您无需在任何地方使用关键字“CALL”。您只需要直接提及过程调用。
那是
Begin
proc1(input1, input2);
end;
/
而不是
Begin
call proc1(input1, input2);
end;
/
答案 3 :(得分:2)
要从SQLPlus命令行调用该过程,请尝试以下方法之一:
CALL test_sp_1();
EXEC test_sp_1
答案 4 :(得分:2)
从另一个程序调用一个程序:
正常程序之一:
CREATE OR REPLACE SP_1() AS
BEGIN
/* BODY */
END SP_1;
从SP_2调用程序SP_1:
CREATE OR REPLACE SP_2() AS
BEGIN
/* CALL PROCEDURE SP_1 */
SP_1();
END SP_2;
使用REFCURSOR或输出光标调用过程:
CREATE OR REPLACE SP_1
(
oCurSp1 OUT SYS_REFCURSOR
) AS
BEGIN
/*BODY */
END SP_1;
调用程序SP_1,它将返回REFCURSOR作为输出参数
CREATE OR REPLACE SP_2
(
oCurSp2 OUT SYS_REFCURSOR
) AS `enter code here`
BEGIN
/* CALL PROCEDURE SP_1 WITH REF CURSOR AS OUTPUT PARAMETER */
SP_1(oCurSp2);
END SP_2;