Sql 在Oracle中使用另一个存储过程调用存储过程
有人知道一种从另一个存储过程中调用存储过程的方法吗?如果是,你会怎么做 以下是我的测试代码:Sql 在Oracle中使用另一个存储过程调用存储过程,sql,oracle,stored-procedures,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_OUT
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;
当然,您只需从SP内部调用它,没有特殊语法 例: 如果过程与执行过程所在的架构不同,则需要在其前面加上架构名称
PROCEDURE some_sp
AS
BEGIN
other_schema.some_other_sp('parm1', 10, 20.42);
END;
@迈克尔·洛克伍德-你不需要在任何地方使用关键词“呼叫”。您只需要直接提到过程调用 就是
Begin
proc1(input1, input2);
end;
/
而不是
Begin
call proc1(input1, input2);
end;
/
要从SQLPlus命令行调用该过程,请尝试以下操作之一:
CALL test_sp_1();
EXEC test_sp_1
存储过程按编码方式工作。问题在于最后一行,它无法调用任何一个存储过程 SQL*Plus中有三个选项:
调用
,执行
,以及一个异常的PL/SQL块
call
似乎是一个SQL关键字,并记录在SQL参考中。语法图表明,即使没有参数传递给调用例程,也需要parentesis
CALL test_sp_1();
匿名PL/SQL块是不在命名过程、函数、触发器等内部的PL/SQL。它可用于调用您的过程
BEGIN
test_sp_1;
END;
/
Exec
是一个SQL*Plus命令,是上述匿名块的快捷方式EXEC
将作为BEGIN传递给数据库服务器;结束代码>
完整示例:
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>
从另一个过程调用一个过程:
一个用于正常程序:
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或output cursor调用过程:
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;
不过,当我尝试使用CALL sp_1运行该程序时,非常感谢;我得到以下错误。从命令中的第21行开始出错:CALL test_sp_1错误报告:SQL错误:ORA-06576:不是有效的函数或过程名06576。00000-“不是有效的函数或过程名称”*原因:找不到要调用的函数(如果存在INTO子句)或过程(如果语句没有INTO子句)*操作:更改语句以调用函数或procedure@Michael洛克伍德-你能在原始问题中发布你的代码吗?另外,如果使用SQL*PLus之类的工具调用函数,则需要将返回值赋给变量。@ML:当调用不起作用(不是有效的PL/SQL语句)且dcp已向您演示了如何正确执行时,为什么还要尝试使用CALL?谢谢!我一直试图在过程名称前面加上EXEC
或EXECUTE
,因为(我认为)独立调用该过程是必要的,但出现了一个错误。我没有意识到在另一个过程中,我可以直接按名称调用该过程,而不需要前面的命令。该调用在任何PL/SQL之外,并且试图测试存储过程。
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;