sql >> Database teknologi >  >> RDS >> Oracle

ORA-04061:Eksisterende tilstand for pakkens krop PACKAGE.NAME er blevet ugyldiggjort, fortsætter

Oracle gør dette, fordi genkompilering af en PL/SQL-pakke ugyldiggør eventuelle sessionsvariabler i brug.

Der er ikke meget, vi kan gøre for at undgå dette, undtagen ved at bruge god implementeringspraksis. Implementer ikke ændringer, mens databasen er i brug, sørg for at alle forbindelser er korrekt afbrudt osv. Lettere sagt end gjort i denne tidsalder med CI/CD, ingen nedetid og andre spændende innovationer.

Så der er én ting bag i skabet:pragma serially_reusable; . Denne instruktion betyder, at pakkens tilstand opretholdes i varigheden af ​​et enkelt serverkald . Hvis vi for eksempel har en PL/SQL-blok, der kalder en SR-procedure tre gange, vil enhver variabel, der ændres af denne procedure, hovedværdien på tværs af de tre kald. Men næste gang vi kører blokken - i samme session - vil variablerne være blevet nulstillet til deres startværdier.

Der er flere begrænsninger for serielt genanvendelig PL/SQL - for eksempel kan det ikke bruges i SQL-forespørgsler. Men den store attraktion fra dit perspektiv er ikke flere ORA-04068- eller ORA-04061-fejl. Ingen sessionstilstand, intet at ugyldiggøre.

pragma serially_reusable skal deklareres på pakkeniveau og i brødteksten samt spec. Så du skal være sikker på, at ingen af ​​de pakkede procedurer behøver at opretholde tilstanden på tværs af serverkald.



  1. Python 3 og mysql gennem SQLAlchemy

  2. Det mislykkes at indsætte en JSON-kodet værdi med specielle tegn i mySQL

  3. indstil automatisk stignings startværdi for mysql-tabel

  4. Hvor slemt er det at ignorere Oracle DUP_VAL_ON_INDEX undtagelse?