2013-11-29 53 views
2

表結構:得到錯誤而執行包

Name  Null Type   
---------- ---- ------------ 
DPT_NO   NUMBER  
SALARY   NUMBER(10) 
PERIOD   VARCHAR2(10) 
START_DATE  DATE   
END_DATE  DATE  

套餐:

CREATE OR REPLACE package body salary_sal AS 
    PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE) IS 
    c_sal salary.salary%TYPE; 
    BEGIN 
     SELECT salary INTO c_sal 
     FROM salary 
     WHERE c_dpt_no= 108; 
     dbms_output.put_line('Salary: '|| c_sal); 
    END find_sal; 
END salary_sal; 

而上面我執行我得到以下錯誤

Error: PL/SQL: Compilation unit analysis terminated 
Error(1,14): PLS-00201: identifier 'SALARY_SAL' must be declared 
Error(1,14): PLS-00304: cannot compile body of 'SALARY_SAL' without its specification. 

回答

3

您遺漏了包的聲明。這個想法是將包的聲明(如果你願意的話)分開(「header」),所以其他包/程序/函數可以從主體(實現)對它進行編譯。

在你的情況,你需要這樣的:現在

CREATE OR REPLACE package salary_sal AS 
    PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE); 
END salary_sal; 

,一旦包裝聲明,您可以創建它的身上:

CREATE OR REPLACE package body salary_sal AS 
    PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE) IS 
    c_sal salary.salary%TYPE; 
    BEGIN 
     SELECT salary INTO c_sal 
     FROM salary 
     WHERE c_dpt_no= 108; 
     dbms_output.put_line('Salary: '|| c_sal); 
    END find_sal; 
END salary_sal; 
+0

這兩個包將分別執行? – ram

+0

這是兩個不同的陳述。這樣,您可以創建一次包(「標題」)並多次更改正文(「實現」),而不必根據它打破/重新編譯其他包。 – Mureinik

+0

爲什麼我們在這裏申報另一個包? – ram

0

包需要一個規範(即一個單獨的接口定義),如錯誤消息所述。您必須在封裝體的定義(即其實現)之前添加一些內容:

CREATE OR REPLACE package salary_sal AS 
    PROCEDURE find_sal(c_dpt_no salary.dpt_no%TYPE); 
END salary_sal; 
/
+0

在哪裏添加您的答案,我的意思是在包或正文部分? – ram

+0

我不清楚你的意思是「包裝部分」。在你的代碼中'CREATE OR REPLACE package body salary_sal ...'之前添加。它與身體是分開的,但需要它。 – halfbit

+0

如何執行包? – ram

0

您neeed創建一個包規格然後只有你可以創建一個包體。

您需要執行包,即執行包中的存儲過程,函數等。