2009-03-09 6 views
8

Welche Situationen führen dazu, dass Oracle-Pakete ungültig werden?

Wir haben ein Paket, das eine Abhängigkeit von einem anderen Paket ist, manchmal Änderungen am "Eltern" -Paket bewirkt, dass das abhängige Paket ungültig wird, aber manchmal nicht.

Es hat uns vorher überrascht.

Es wäre sehr nützlich, einfach zu verstehen, was die Invalidierung verursacht, so dass ich es vorhersagen/planen könnte.

+1

Welche Version? Es unterscheidet sich tatsächlich von Version zu Version. –

+0

Das ist die Oracle apps Version, afaik. Es gibt kein RDBMS mit diesem Bezeichner. Wählen Sie * aus v $ Version wird Ihnen sagen. –

Antwort

12

Wenn Sie ein beliebiges Objekt ändern, auf das ein Paket angewiesen ist (z. B. Tabellen, Ansichten, Trigger, andere Pakete), wird das Paket automatisch als ungültig markiert. Wie oben bereits erwähnt, ist Oracle schlau genug, das Paket neu zu kompilieren, wenn es zum ersten Mal verwendet wird.

Wenn Sie sich darüber Gedanken machen, führen Sie bei jeder Schemaänderung (z. B. Tabellen, Ansichten, Trigger, Prozeduren) eine DBMS_UTILITY.compile_schema aus (oder lassen Sie dies von Ihrem DBA durchführen). Dies wird zwingen, alle Pakete zu kompilieren und Sie wissen zu lassen, wo oder ob es Fehler gibt, bevor Sie sie auf die harte Tour finden.

+5

Warnung: DBMS_UTILITY.COMPILE_SCHEMA() wird seit Oracle8i und seit 9i definitiv nicht mehr empfohlen. Wir können damit durchkommen, aber hier sind zuverlässigere Alternativen. Siehe meine Antwort zu diesem anderen Thread http://stackoverflow.com/questions/3200202/trigger-is-invalid-in-oracle/3200439#3200439 – APC

1

Wenn Sie versuchen, ein ungültiges Oracle-Paket auszuführen, versucht Oracle, es zu kompilieren. Nur wenn es nach dem Kompilieren von Oracle ungültig bleibt, wird eine Ausnahme ausgelöst.

2

Zusätzlich zur Antwort von Thomas Jones-Low wird ein abhängiges Objekt möglicherweise nicht als ungültig markiert, wenn Sie nur das Paket BODY ändern.

Sobald jedoch die Paketspezifikation geändert wird, muss dies geschehen.

3

BTW, wenn ich über die Situation völlig falsch bin ... Entschuldigungen im Voraus

überrascht?

nicht sicher, was die Auswirkungen, die ...

Hat etwas Pause in der Produktion?

Was genau passiert ist?

Der Grund, warum ich frage, ist, weil das Verständnis der Auswirkungen jeder möglichen Änderung viel schwieriger ist, als mit dem Ergebnis umzugehen. Warum wird die Annullierung zu einem Problem? Meine Vermutung ist, weil Sie einen Fehler "Existierender Zustand des Pakets wurde verworfen" in Ihrer Anwendung haben. Ist das das REAL Problem?

Wieder vermute ich, dass es ist, und wenn ja, lassen Sie uns nur mit dem statt der Liste der Änderungen beschäftigen, die, wie ich einen Kommentar einfüge, versionsspezifisch ist. (11g verfolgt die Abhängigkeit bis hinunter zu der Spalte einer Tabelle anstelle der Tabelle als Ganzes).

Dies könnte nicht wie ein wichtiger Fehler für Sie erscheinen Wenn Sie nicht Paketstatus verwenden. Wenn Sie das wären, wäre das ein wichtiger Fehler und Sie wären nicht überrascht gewesen, also ich vermute, Sie sind nicht.

Da du nicht bist, ist dieser Fehler in Ordnung zu ignorieren. Da Sie sie ignorieren können, können Sie Ihre Clientanwendung so programmieren, dass sie diesen Fehler ignoriert und Ihren Anruf erneut versucht, da Oracle Ihr Paket für Sie neu kompiliert, wie andere bereits erwähnt haben. Dies ist eine lohnende Übung.Denn anstatt jede mögliche Sache zu kennen, um die du dich sorgen musst, wenn du eine Veränderung machst, und dann im Notfall-Fix vergisst du eines davon, deine App wird es einfach handhaben und ohne Sorgen weitermachen.

+0

Es ist schade, dass es kein Pragma oder etwas für "mir egal ist Paketstatusänderung " –

+1

Es gibt ein Pragma,' SERIALLY_REUSABLE', das die Anforderung erfüllt, aber auf eine etwas andere Weise, indem es den Paketstatus bei jedem Aufruf neu initialisiert. –

3

Ich stimme Thomas Jones-Low aber es gibt ein paar Probleme mit langen Sitzungen und Neukompilierung zu tun.

Wenn Sie ein Paket in einer Sitzung referenzieren und dieses Paket (oder ein abhängiges Paket) während derselben Sitzung neu kompiliert wird, erhalten Sie den Oracle-Fehler "ORA-06508: PL/SQL: Programmeinheit konnte nicht gefunden werden "

Sobald Sie das Paket in einer Sitzung referenziert haben, können Sie das Paket im Allgemeinen nicht ändern, ohne es für diese Sitzung ungültig zu machen. Dies ist ein besonderes Problem für Entwicklungsumgebungen, in denen Pakete häufig geändert werden, aber auch ein Problem für Produktionsumgebungen, in denen Sie einen kleinen Patch ausführen möchten, ohne die gesamte Umgebung zu beeinträchtigen. Beachten Sie, dass dieser Fehler auch dann auftritt, wenn die geänderten Pakete keine Fehler enthalten.

5

Oder können Sie die folgende Tabelle abfragen, um zu sehen, was Sie

Abhängigkeiten haben
select * 
    from dba_dependencies 
    where name = 'YOUR_PACKAGE' 
    and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself 
    and owner = USER --- Or can be set to any user 

Dadurch werden alle Abhängigkeiten zeigen. Für Ihre Objekte fragen Sie user_dependencies ab.

Verwandte Themen