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)
@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)
归档时间: |
|
查看次数: |
179475 次 |
最近记录: |