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

ORA-06508:PL/SQL:kunne ikke finde den programenhed, der kaldes

Jeg formoder, at du kun rapporterer den sidste fejl i en stak som denne:

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"

Hvis ja, er det fordi din pakke er stateful:

Værdierne af variablerne, konstanterne og markørerne, som en pakke erklærer (i enten dens specifikation eller krop) omfatter dens pakketilstand . Hvis en PL/SQL-pakke erklærer mindst én variabel, konstant eller markør, så er pakken stateful; ellers er den statsløs .

Når du omkompilerer, går tilstanden tabt:

Hvis brødteksten af ​​en instansieret, stateful pakke er rekompileret (enten eksplicit med "ALTER PACKAGE Statement" eller implicit), får næste påkaldelse af et underprogram i pakken Oracle Database til at kassere den eksisterende pakketilstand og hæve exceptionORA-04068.

Efter at PL/SQL har rejst undtagelsen, får en reference til pakken Oracle Database til at gen-instantiere pakken, hvilket re-initialiserer...

Du kan ikke undgå dette, hvis din pakke har tilstand. Jeg tror dog, det er ret sjældent, at man virkelig har brug for en pakke for at være stateful, så du bør gense alt, hvad du har deklareret i pakken, men uden for en funktion eller procedure, for at se, om det virkelig er nødvendigt på det niveau. Da du dog er på 10g, inkluderer det konstanter, ikke kun variabler og markører.

Men det sidste afsnit fra den citerede dokumentation betyder, at næste gang du refererer til pakken i samme session, får du ikke fejlen, og den vil fungere som normalt (indtil du kompilerer igen).



  1. Konstruktøren SQLiteOpenHelper() er udefineret

  2. ORDER BY-elementer skal vises i valglisten, hvis sætningen indeholder en UNION-, INTERSECT- eller EXCEPT-operator (SQL-server)

  3. DATEDIFF-funktion i Oracle

  4. SQL Server ROWCOUNT_BIG()