2010-08-05 211 views
28

有誰知道存在一種方式,或者甚至有可能從另一個方法調用存儲過程?如果是這樣,你會怎麼做?在Oracle中與另一個存儲過程調用存儲過程

這裏是我的測試代碼:

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; 

回答

38

你的存儲過程的工作作爲編碼。問題在於最後一行,它無法調用任何一個存儲過程。

SQL * Plus中的三種選擇是:callexec和一個有害的PL/SQL塊。

call似乎是一個SQL關鍵字,並在SQL參考中進行了說明。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG語法圖表明即使沒有參數傳遞給調用例程,也需要parentesis。

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> 
13

當然,你剛剛從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; 
+0

感謝您的CALL sp_1; 我收到以下錯誤。 錯誤的命令開始行21: CALL test_sp_1 錯誤報告: SQL錯誤:ORA-06576:不是有效的函數或過程名 06576. 00000 - 「不是有效的函數或過程名」 *原因:可能找不到函數(如果存在INTO子句)或 過程(如果語句沒有INTO子句)調用 。 *操作:更改語句以調用函數或過程 – electricsheep 2010-08-05 13:55:38

+0

@Michael Lockwood - 您可以在原始問題中發佈代碼嗎?另外,如果您使用SQL * PLus等工具調用函數,則需要將返回值分配給變量。 – dcp 2010-08-05 13:57:51

+0

@ML:當CALL不起作用時(爲不是有效的PL/SQL語句),爲什麼還要嘗試使用CALL並且dcp向您展示瞭如何正確執行它? – 2010-08-05 14:04:07

2

@Michael Lockwood - 你不需要在任何地方使用關鍵字「CALL」。你只需要直接提到過程調用。

也就是說

Begin 
    proc1(input1, input2); 
end; 
/

,而不是

Begin 
    call proc1(input1, input2); 
end; 
/
+0

查看他的代碼以及問題的修訂歷史,我沒有看到他在PL/SQL中使用調用的地方。該調用不在任何PL/SQL之外,並且嘗試測試存儲過程。 – 2010-08-05 20:48:22

2

從sqlplus命令行調用的程序,請嘗試以下之一:

CALL test_sp_1(); 
EXEC test_sp_1 
2

調用另一個過程一個過程:

一個一個正常的程序:

CREATE OR REPLACE SP_1() AS 
BEGIN 
/* BODY */ 
END SP_1; 

調用過程SP_1 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; 
+0

對於oracle而言很重要。 – 2013-08-21 11:50:52

+0

Sirve igual si es number el out?是否需要輸出? – 2017-11-22 14:28:27