sql >> Databasteknik >  >> RDS >> Oracle

ORA-04061:befintligt tillstånd för paketets innehåll PACKAGE.NAME har ogiltigförklarats kvarstår

Oracle gör detta eftersom omkompilering av ett PL/SQL-paket ogiltigförklarar alla sessionsvariabler som används.

Det finns inte mycket vi kan göra för att undvika detta, förutom genom att använda goda distributionsmetoder. Implementera inte ändringar medan databasen används, se till att alla anslutningar är ordentligt bortkopplade, etc. Lättare sagt än gjort i denna tid av CI/CD, noll driftstopp och andra spännande innovationer.

Så det finns en sak på baksidan av skåpet:pragma serially_reusable; . Denna instruktion betyder att paketets tillstånd bibehålls under ett enda serveranrop . Om vi ​​till exempel har ett PL/SQL-block som anropar en SR-procedur tre gånger kommer alla variabler som ändras av den proceduren att ha värdet över de tre anropen. Men nästa gång vi kör blocket - i samma session - kommer variablerna att ha återställts till sina startvärden.

Det finns flera begränsningar för seriell återanvändbar PL/SQL - till exempel kan den inte användas i SQL-frågor. Men den stora attraktionen ur ditt perspektiv är inga fler ORA-04068- eller ORA-04061-fel. Inget sessionstillstånd, inget att ogiltigförklara.

pragma serially_reusable måste deklareras på förpackningsnivå, och i kroppen såväl som spec. Så du måste vara säker på att ingen av de paketerade procedurerna behöver bibehålla status över serveranrop.



  1. Massinlägg eller uppdatering för tabeller med bifogade fält

  2. PDO-fråga på sammanfogade tabeller när kolumnnamnen är desamma

  3. Använda främmande nycklar för att ersätta kontrollbegränsning

  4. MySQL DELETE FROM med subquery som villkor