De bestaande staat van pakketten is weggegooid

Dus ik heb een PLSQL-procedure prima uitgevoerd en zonder fouten gecompileerd. Ik heb één wijziging in mijn procedure aangebracht en deze compileert nog steeds prima, maar nu krijg ik de volgende foutmelding als ik deze uitvoer:

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP"
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP"
ORA-06512: at "SCHEMA.XP_ST_002180", line 141
ORA-06512: at line 1

Om het even welke ideeën wat dit zou kunnen zijn? De verandering die ik heb aangebracht was zo onbelangrijk dat ik betwijfel of het deze fout had kunnen veroorzaken. Bij voorbaat dank voor uw hulp!

10

3 antwoord

Wanneer een sessie gebruik maakt van een pakket, behoudt deze sessie enige status van het pakket. Als dat pakket opnieuw wordt gecompileerd, krijgt de volgende keer dat dezelfde sessie naar het pakket verwijst, die foutmelding.

Om dit te voorkomen, ontkoppel je elke sessie die mogelijk het pakket heeft gebruikt of laat je de sessie een DBMS_SESSION.RESET_PACKAGE doen om de pakketstatus te resetten.

23
toegevoegd
@YogeshJindal het lijkt erop dat je iets anders zegt dan darrelinjz. Hij schreef dat je het RESET_PACKAGE moet uitvoeren tijdens elke sessie, na het wijzigen van het pakket om de fout te voorkomen.
toegevoegd de auteur pauloya, de bron
@YogeshJindal Wat ik lees is dat elke sessie deze opdracht moet uitvoeren, wat logisch is na het lezen van wat de opdracht doet, RESET_PACKAGE : " Deze procedure zorgt ervoor dat alle pakketten in deze sessie worden verwijderd. Het zou geen invloed moeten hebben op andere sessies in de database, dus het uitvoeren vanuit een testvenster heeft geen invloed op andere sessies.
toegevoegd de auteur pauloya, de bron
Beste start van een antwoord voor dit probleem. Het zou goed zijn om dit een beetje verder gedragen te zien om het kernprobleem te verklaren en waarom de fout optreedt.
toegevoegd de auteur Andrew Martinez, de bron
Bedankt darreljnz, de oplossing werkte goed voor mij. Maar aanvankelijk begreep ik niet wat u aan het bidden was. Dus ik ga je oplossing een beetje verduidelijken voor anderen. Open een nieuw testvenster in pl/sql en plak "Begin sys.dbms_session.reset_package; end;" en druk op F9 om het uit te voeren en verander dan uw pakket of hercompileer het pakket en nu krijgen we geen fouten in onze applicaties
toegevoegd de auteur Yogesh Jindal, de bron
@PauloManuelSantos Ik denk dat hij zegt dat alle sessies worden verbroken of dat deze opdracht wordt uitgevoerd vanuit een sessie om de status van het pakket opnieuw in te stellen.
toegevoegd de auteur Yogesh Jindal, de bron

Als u een pakketspecificatie opnieuw compileert, worden alle afhankelijke objecten ongeldig gemaakt. Een afhankelijk object is elke weergave, pakketspecificatie, verpakkingseenheid, functie of procedure die verwijst naar een van de verklaringen in de opnieuw gecompileerde pakketspecificatie.

Ook, zoals aangegeven door darreljnz, bevatten sessies meestal verwijzingen naar de status van pakketten waartoe ze toegang hebben gehad, waardoor een ORA-04068: bestaande status van pakketten is weggegooid de volgende keer dat de sessie probeert te verwijzen naar de pakket.

Dit laatste gedrag is een echte hindernis en maakt het noodzakelijk om code te schrijven om opnieuw te proberen of om alle actieve sessies te sluiten na het installeren van een nieuwe versie van een pakket (het effectief opnieuw opstarten van de toepassing/service). Kort gezegd: het maakt het moeilijker om hotfixes te installeren.

4
toegevoegd

Gebruik pragma serially_reusable in uw pakket en zijn hoofdtekst.

3
toegevoegd
wat doet het, waarom is dit een oplossing? geef wat meer informatie alstublieft
toegevoegd de auteur TecHunter, de bron