2013-10-15 4 views
11

Ich benutze Orakel 10g und Kröte 11.5. Ich versuche eine API aus einem anonymen Block zu rufen.ORA-06508: PL/SQL: Programmeinheit konnte nicht gefunden werden

Wenn ich die api neu kompilieren nach dbms_output.put_line Hinzufügen und dann versuchen, den anonymen Block auszuführen, es zeigt Fehler als

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

aber wenn ich aktuelle Sitzung zu beenden und öffnen Sie eine neue Sitzung, dann wird der anonyme Block wird ausgeführt, ohne den Fehler.

Aufgrund dieses Problems, ich bin gemacht, um die Sitzung immer wieder zu verbinden, wenn ich eine Änderung an API. Kann jemand helfen, wenn dieses Problem gelöst werden kann, indem irgendwelche Konfigurationen in Kröte oder Datenbank-Ebene vorgenommen werden.

+2

Sind Sie auch immer etwas, wie 'existierender Paketstatus wurde verworfen '? Wenn es so ein zweites Mal in der gleichen Sitzung läuft, sollte es funktionieren. Aber das würde bedeuten, dass Ihr Paket einen Zustand hat, d. H. Eine Variable, die im Paket deklariert ist, und nicht in einer Prozedur (und nichts mit dem "dbms_output" zu tun hat). –

Antwort

21

Ich vermute, dass Sie nur den letzten Fehler in einem Stapel wie diese Berichterstattung:

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" 

Wenn ja, das ist, weil your package is stateful:

Die Werte der Variablen, Konstanten und Cursor dass ein Paket deklariert (in seiner Spezifikation oder seinem Körper) sein Paket Staat. Wenn ein PL/SQL-Paket mindestens eine Variable, Konstante, oder den Cursor deklariert, ist das Paket stateful; ansonsten ist es statesless.

Wenn Sie neu kompilieren der Staat verloren:

Wenn der Körper eines instanziiert, Stateful Paket neu kompiliert wird (entweder explizit mit dem „PAKET Statement ALTER“ oder implizit), der Der nächste Aufruf eines Unterprogramms im Paket bewirkt, dass die Oracle-Datenbank den vorhandenen Paketstatus verwirft und die Ausnahme ORA-04068 auslöst.

Nach PL/SQL die Ausnahme auslöst, ein Verweis auf das Paket verursacht Oracle Database, das Paket neu zu instanziieren, die neu initialisiert es ...

Sie können dies nicht vermeiden, wenn Ihr Paket hat Status. Ich denke, es ist ziemlich selten, dass ein Paket wirklich statusbehaftet sein muss. Sie sollten also alles, was Sie im Paket deklariert haben, nochmals überprüfen, aber außerhalb einer Funktion oder Prozedur, um zu sehen, ob es auf dieser Ebene wirklich benötigt wird. Da Sie auf 10g sind, enthält das jedoch Konstanten, nicht nur Variablen und Cursor.

Aber der letzte Absatz aus der zitierten Dokumentation bedeutet, dass Sie das nächste Mal, wenn Sie das Paket in der gleichen Sitzung referenzieren, den Fehler nicht erhalten und es wie normal funktioniert (bis Sie erneut kompilieren).

+0

Stimme völlig mit Ihnen überein. Ich könnte mich in die imaginären Zahlen darüber einmischen. Mach einfach den verdammten Prozess. Ich habe versucht, es aus einem Calling Anon Block herauszunehmen und es muss absolut zur Vollendung laufen, bevor diese magische Flagge sich klären wird. Irritierend! –

3

Basierend auf früheren Antworten.Ich habe mein Problem gelöst, indem ich die globale Variable auf Paketebene zu Prozedur entfernt habe, da es in meinem Fall keine Auswirkungen gab.

Original-Skript war

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;/

die gleiche Rewritten ohne globale Variable V_ERROR_NAME und bewegt unter Paketebene zu Verfahren wie

Modified-Code

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;/
Verwandte Themen