2013-10-15 20 views
11

我使用Oracle 10g和蟾蜍11.5。我正在嘗試從匿名塊調用api。ORA-06508:PL/SQL:無法找到程序單元被稱爲

如果我加入dbms_output.put_line,然後嘗試執行匿名塊之後重新編譯API,它顯示誤差

"ORA-06508: PL/SQL: could not find program unit being called". 

但是如果我結束當前會話,並打開一個新的會話,那麼匿名塊將執行沒有錯誤。

由於這個問題,我重新連接的會話每次我進行了更改API。 如果可以通過在蟾蜍或數據庫級別進行任何配置來解決此問題,任何人都可以提供幫助。

+2

你是不是也得到一些像'現有的包狀態已被丟棄「?如果在同一場會議上再次運行,它應該可以工作。但是這意味着你的包有一些狀態,即在包中而不是在過程中聲明的變量(並且與'dbms_output'無關)。 –

回答

21

我懷疑你只報告了最後一個錯誤的堆棧是這樣的:

ORA-04068: existing state of packages has been discarded 
ORA-04061: existing state of package body "schema.package" has been invalidated 
ORA-04065: not executed, altered or dropped package body "schema.package" 
ORA-06508: PL/SQL: could not find program unit being called: "schema.package" 

如果是這樣,那是因爲your package is stateful

的變量,常量和遊標的值該 聲明(在任一其規格或身體)的軟件包包括其包 狀態。如果PL/SQL包聲明的至少一個變量,常量 或光標,然後所述包裝是狀態;否則,它是無狀態

當你重新編譯狀態丟失:

如果一個實例,狀態包的身體重新編譯(或 明確,用「ALTER PACKAGE聲明」,或隱式)時, 下一次調用該程序包中的子程序會導致Oracle Database 放棄現有程序包狀態並引發異常 ORA-04068。

之後PL/SQL引發異常,到包的引用導致 Oracle數據庫重新實例化的組件,這將重新初始化 它...

你不能,如果避免這種你的軟件包有狀態。我認爲確實需要一個包來保持狀態是非常罕見的,所以你應該重新訪問你在包中聲明的任何東西,但是在函數或過程之外,看看它是否真的需要這個層次。既然你使用了10g,那麼包括常量,而不僅僅是變量和遊標。

但是從引用文檔中的最後一段意味着下次你在同一個會話引用包的時候,你不會得到錯誤,它會工作正常(直到你重新編譯)。

+0

完全同意你的看法。我可以關心那些虛數。只要運行該死的proc。我試過從一個叫anon塊中除外,並且它必須在這個魔術標誌清除之前運行完成。刺激! –

3

。我通過將程序包級別的全局變量移除來解決了我的問題,因爲在我的情況下沒有影響。

原始腳本

create or replace PACKAGE BODY APPLICATION_VALIDATION AS 

V_ERROR_NAME varchar2(200) := ''; 

PROCEDURE APP_ERROR_X47_VALIDATION ( PROCESS_ID IN VARCHAR2) AS BEGIN 
    ------ rules for validation... END APP_ERROR_X47_VALIDATION ; 

/* Some more code 
*/ 

END APPLICATION_VALIDATION;/

改寫沒有全局變量V_ERROR_NAME相同,並在封裝級移到程序作爲

修改代碼

create or replace PACKAGE BODY APPLICATION_VALIDATION AS 

PROCEDURE APP_ERROR_X47_VALIDATION ( PROCESS_ID IN VARCHAR2) AS 

**V_ERROR_NAME varchar2(200) := '';** 

BEGIN 
    ------ rules for validation... END APP_ERROR_X47_VALIDATION ; 

/* Some more code 
*/ 

END APPLICATION_VALIDATION;/