sql >> Database >  >> RDS >> Oracle

ORA-04061:bestaande status van pakketinhoud PACKAGE.NAME is ongeldig gemaakt, blijft bestaan

Oracle doet dit omdat het opnieuw compileren van een PL/SQL-pakket alle gebruikte sessievariabelen ongeldig maakt.

Er is niet veel dat we kunnen doen om dit te voorkomen, behalve door goede implementatiepraktijken te gebruiken. Implementeer geen wijzigingen terwijl de database in gebruik is, zorg ervoor dat alle verbindingen correct zijn losgekoppeld, enz. Makkelijker gezegd dan gedaan in dit tijdperk van CI/CD, geen downtime en andere opwindende innovaties.

Er is dus één ding achter in het kluisje:pragma serially_reusable; . Deze instructie houdt in dat de status van het pakket behouden blijft voor de duur van een enkele serveraanroep . Als we bijvoorbeeld een PL/SQL-blok hebben dat driemaal een SR-procedure aanroept, zullen alle variabelen die door die procedure zijn gewijzigd, de waarde over de drie aanroepen behouden. Maar de volgende keer dat we het blok uitvoeren - in dezelfde sessie - zijn de variabelen teruggezet naar hun beginwaarden.

Er zijn verschillende beperkingen aan serieel herbruikbare PL/SQL - het kan bijvoorbeeld niet worden gebruikt in SQL-query's. Maar de grote aantrekkingskracht vanuit jouw perspectief is dat er geen ORA-04068 of ORA-04061 fouten meer zijn. Geen sessiestatus, niets om ongeldig te maken.

pragma serially_reusable moet worden aangegeven op pakketniveau en zowel in de body als in de specificatie. U moet er dus zeker van zijn dat geen van de verpakte procedures de status bij alle serveraanroepen hoeft te behouden.



  1. MySQL integer unsigned rekenkundige problemen?

  2. lopende balans berekenen in oracle-query

  3. F# Verbinding maken met online MySQL DB query uitvoeren

  4. Hoe een willekeurige sub-tekenreeks te selecteren, gescheiden door coma(,) Van een tekenreeks