sql >> Databáze >  >> RDS >> Oracle

ORA-04061:Stávající stav těla balíčku PACKAGE.NAME byl zrušen a přetrvává

Oracle to dělá, protože překompilování balíčku PL/SQL znehodnotí všechny používané proměnné relace.

Nemůžeme udělat mnoho, abychom se tomu vyhnuli, kromě použití osvědčených postupů nasazení. Nenasazujte změny, když je databáze používána, ujistěte se, že všechna připojení jsou správně odpojena atd. V tomto věku CI/CD, nulových prostojů a dalších vzrušujících inovací je to jednodušší.

Takže v zadní části skříňky je jedna věc:pragma serially_reusable; . Tato instrukce znamená, že stav balíčku je udržován po dobu jednoho volání serveru . Například pokud máme blok PL/SQL, který volá proceduru SR třikrát, všechny proměnné pozměněné touto procedurou budou udržovat hodnotu ve všech třech voláních. Ale až příště spustíme blok – ve stejné relaci – proměnné budou resetovány na své počáteční hodnoty.

Sériově opakovaně použitelné PL/SQL má několik omezení – například jej nelze použít v dotazech SQL. Ale velkým lákadlem z vašeho pohledu už nejsou chyby ORA-04068 nebo ORA-04061. Žádný stav relace, nic ke zrušení platnosti.

pragma serially_reusable musí být deklarováno na úrovni balíčku a v těle, stejně jako spec. Takže si musíte být jisti, že žádná ze zabalených procedur nemusí udržovat stav během volání serveru.



  1. Proč se pro tento dotaz nepoužívá index NLSSORT?

  2. Jak zajistit, aby vaše přístupové databáze byly ultra rychlé!

  3. Mohu použít klíčové slovo Postgres jako alias ve vybraném seznamu?

  4. Náhodná chyba:#1045 Nelze se přihlásit k serveru MySQL