2015-10-04 63 views
0

下面被保存在一個文件中的代碼proc1.sql調用另一個過程

DECLARE 
    B VARCHAR2(25); 
    C NUMBER; 

PROCEDURE Get_manager_detailS(NO IN NUMBER,NAME OUT VARCHAR2,SAL1 OUT NUMBER) 
IS 
BEGIN 
    SELECT ENAME, SAL 
    INTO NAME, SAL1 
    FROM EMP 
    WHERE EMPNO = NO; 
END; 
BEGIN 
Get_manager_detailS(7900,B,C); 
DBMS_OUTPUT.PUT_LINE(B); 
DBMS_OUTPUT.PUT_LINE(C); 
END; 
/

這個程序存儲在另一個文件proc3.sql

PROCEDURE Test_Procedure() 
IS 
BEGIN 
b varchar2(25); 
c number; 
DBMS_OUTPUT.PUT_LINE('CALLING'); 
Get_manager_details(7900,b,c); 
END; 

當我運行它命名爲一個程序在sqlplus中,它顯示錯誤

SP2-0734 UNKNOWN命令開始過程..其餘的線路被忽略。 SP2-0042 UNKNOWN COMMAND「IS」..忽略行。

回答

1

您的第一個塊是您聲明過程的匿名塊 - 您只能在匿名塊內調用過程Get_manager_details。您不能從Test_Procedure撥打Get_manager_details,因爲沒有這樣的程序。你需要創建過程Get_manager_details第一

Create or replace procedure Get_manager_details .... 

然後你可以運行

Create or replace procedure Test_Procedure .... 

,否則將無法編譯。

-1

如果您試圖調用test_procedure中的過程get_manager_details,那麼您首先需要創建測試過程。 添加創建或替換過程test_procedure。 然後,在創建test_procedure後,您可以在一個匿名塊中執行它,該塊將調用get_manager_details過程。

2

創建過程/函數與匿名塊

  • 存儲過程/函數總是開始CREATE OR REPLACE ...,並結束;

    CREATE OR REPLACE作爲存儲函數和過程隱含的聲明,因此你不必寫了聲明塊

  • 匿名塊與DECLARE開始內部,並與結束結束;

至於保存在proc1.sql碼的碼/塊。

  • 您的聲明錯位。您應該的 程序
  • 結束後,將其置於開始用CREATE OR REPLACE PROCEDURE程序

試塊:

-- DECLARE    
    -- B VARCHAR2(25); 
    -- C NUMBER; 

    CREATE OR REPLACE PROCEDURE Get_manager_detailS(NO IN NUMBER, 
                NAME OUT VARCHAR2, 
                SAL1 OUT NUMBER) 
    IS 
    BEGIN 
     SELECT ENAME, SAL 
     INTO NAME, SAL1 
     FROM EMP 
      WHERE EMPNO = NO; 
    END; -- end of procedure 

    /

    DECLARE -- start of anonymous block    
     B VARCHAR2(25); 
     C NUMBER; 
    BEGIN 
     Get_manager_detailS(7900,B,C); 
     DBMS_OUTPUT.PUT_LINE(B); 
     DBMS_OUTPUT.PUT_LINE(C); 
    END; 

至於將調用get_manager_details程序的過程。其將與匿名塊一樣,唯一的區別將是它被存儲

基於你已經做了什麼

  • 如果您不會在您的過程中聲明參數,那麼就不需要括號,因此請將其刪除。

  • 如果你沒有輸出參數,將捕獲你的程序的結果,你可以使用DBMS_OUTPUT.PUT_LINE因爲你已經在 匿名塊使用上述

  • 變量聲明應該在IS關鍵字之後和BEGIN聲明之前完成,因爲正如我上面提到的CREATE OR REPLACE ... IS是存儲函數的隱式聲明和 個程序

試試這個:

CREATE OR REPLACE PROCEDURE Test_Procedure 
    IS -- always start with CREATE OR REPLACE 
     b varchar2(25); 
     c number; 

    BEGIN 
    -- b varchar2(25); misplaced declarations 
    -- c number; 
     DBMS_OUTPUT.PUT_LINE('CALLING'); 
     Get_manager_details(7900,b,c); 
     DBMS_OUTPUT.PUT_LINE(B); -- displays the results b 
     DBMS_OUTPUT.PUT_LINE(C); -- and c 

    END; 

很抱歉的長期職位。

希望這幫助。

CHEERS

相關問題