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.