Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中使用另一个存储过程调用存储过程_Sql_Oracle_Stored Procedures - Fatal编程技术网

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;