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

ORA-06508:PL/SQL:Nelze najít volanou programovou jednotku

Mám podezření, že hlásíte pouze poslední chybu v zásobníku, jako je tento:

ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "schema.package" has been invalidated
ORA-04065: not executed, altered or dropped package body "schema.package"
ORA-06508: PL/SQL: could not find program unit being called: "schema.package"

Pokud ano, je to proto, že váš balíček je ve stavu:

Hodnoty proměnných, konstant a kurzorů, které balíček deklaruje (ve své specifikaci nebo těle), zahrnují jeho packagestate . Pokud balíček PL/SQL deklaruje alespoň jednu proměnnou, konstantu nebo kurzor, pak je balíček stavový; jinak je bez státní příslušnosti .

Při rekompilaci se stav ztratí:

Pokud je tělo konkretizovaného, ​​stavového balíčku rekompilováno (buď explicitně, s "ALTER PACKAGE Statement" nebo implicitně), pak další vyvolání podprogramu v balíčku způsobí, že Oracle Database zruší stávající stav balíčku a vyvolá výjimkuORA-04068.

Poté, co PL/SQL vyvolá výjimku, odkaz na balíček způsobí, že databáze Oracle znovu vytvoří instanci balíčku, který se znovu inicializuje...

Tomu se nevyhnete, pokud má váš balíček stav. Myslím si, že je poměrně vzácné skutečně potřebovat, aby byl balíček stavový, takže byste měli znovu navštívit cokoli, co jste v balíčku deklarovali, ale mimo funkci nebo proceduru, abyste zjistili, zda je to na této úrovni skutečně potřeba. Vzhledem k tomu, že jste na 10g, to zahrnuje konstanty, nejen proměnné a kurzory.

Ale poslední odstavec z citované dokumentace znamená, že při příštím odkazu na balíček ve stejné relaci se chyba nezobrazí a bude fungovat jako obvykle (dokud znovu nezkompilujete).



  1. Vyhrazená uložená procedura pro získání nejnovějšího stavu záloh databáze

  2. Jak se rozhodnu, kdy použít pravá spojení/levá spojení nebo vnitřní spojení Nebo jak určit, která tabulka je na které straně?

  3. Existuje způsob, jak zakázat aktualizace/mazání, ale přesto umožnit spouštěčům je provádět?

  4. Příklady LOG10() v SQL Server