Sådan Fix Ora-06512 fejl

Læser spørgsmålet igen. Denne gang et Oracle spørgsmål og 'hvad skal man gøre, hvis man ser ora-06512 fejl'. Jeg må indrømme, at Oracle ikke er min ting, men jeg kender en venlig DBA, der bor i Oracle og var villig til at hjælpe mig med at svare på dette spørgsmål i stedet for en stor kop kaffe.

Oracle er et database management system, der har eksisteret i fyrre år i forskellige former. Det anvendte oprindeligt noget, der hedder SCOTT-skemaet, opkaldt efter en af ​​de oprindelige medarbejdere i Oracle. Du har endda logget ind på Oracle for første gang med brugernavnet 'scott' og adgangskoden 'tiger', der er opkaldt efter Scotts kat. Nu er der flere skemaer brugt afhængigt af, hvad du bruger Oracle til.

Hvis du vil lære mere om Oracle, er denne side meget nyttig.

Løsning af Ora-06512 fejl

Tilsyneladende er en ora-06512-fejl en generel undtagelsesfejl, der fortæller dig, hvor noget går galt, ikke hvad der går galt.

F.eks. Kan fejlsyntaxen læse:

ORA-01422: Eksakt hentning vender mere end det ønskede antal rækker

ORA-06512: ved "DATABASE_NAME", linje 66

ORA-06512: på linje 1

Den første linje fortæller dig, hvilken type fejl der sker. I dette tilfælde returnerer forespørgslen flere data end spørgsmålet forventer, så det ved ikke, hvordan man håndterer det. 'ORA-01422' -koden er den faktiske fejlkode, du skal se på. ORA-06512 er bare den generelle fejlkode.

Den anden linje fortæller dig, hvor fejlen opstår. DATABASE_NAME kommer til at være den database, du arbejder på på det tidspunkt. Linje 66 er den linje, hvor fejlen sker, og er den linje, du skal kontrollere for at rette fejlen.

Den tredje linje i fejlsyntaxen fortæller dig, hvor opkaldet kommer fra. Tjek linie 1, og du vil se et opkald til DATABASE_NAME.

For at rette op på denne fejl skal du løse problemet, der skyldes ORA-01422, hvilket er 'nøjagtig hente returnerer mere end det ønskede antal rækker', eller du skal tilføje en undtagelseshandler for at fortælle Oracle at ignorere det. Da fastsættelse af kernemålet altid er at foretrække, er det vejen at gå.

Der er to ting, du kan gøre. Hvis du forventer, at forespørgslen skal returnere mere end en enkelt række, kan du ændre det, så det bliver ikke overrasket. Hvis du kun forventer, at forespørgslen skal returnere en enkelt række, kan du også ændre det for det.

Forvente mere end en enkelt række:

for X i (vælg * fra t hvor ...)

løkke

- behandle X-posten her

ende sløjfe

Dette bør udrydde fejlen i database forespørgsler, hvor mere end en række ville blive returneret.

Hvis du kun forventer en enkelt række, der skal returneres, kan du prøve:

begynde

vælg * til ....

fra t hvor ....

behandle….

undtagelse

når NO_DATA_FOUND derefter

fejlhåndteringskode, når der ikke er fundet nogen rekord

når TOO_MANY_ROWS derefter

fejlhåndteringskode, når der findes for mange poster

ende;

Denne anden metode skal kun levere den enkelte række uden at kaste 'ORA-01422: Den eksakte hente returnerer mere end det ønskede antal rækker' fejl og dermed den oprindelige ORA-06512 fejl.

Du kan også finjustere forespørgslen, så den kun returnerer den første række i et multipel række svar. Dette kan virke, hvis du ikke har fuldstændig kontrol over databasen eller ikke vil forstyrre ting for meget, men stadig brug for et svar.

erklære

c1 markør for at vælge * fra t hvor ...

begynde

åben c1;

hent c1 i ..

hvis (c1% ikke fundet) derefter

fejlhåndtering uden nogen registrering fundet

Afslut Hvis;

tæt c1;

ende;

Jeg fik ikke se denne endelige i aktion, men jeg er sikker på, at det i tilfælde, hvor flere afkast kan findes, men du kun ønsker en enkelt række retur og ingen fejl, vil det fungere.

Jeg kender en lille SQL, nok til at skrive en grundlæggende valgopgørelse, men jeg må indrømme, at Oracle smed mig. Selv om det er PL / SQL, er det lignende, fandt jeg mig selv tabt. PL / SQL er Oracle's Procedural Language extension til SQL, som tilsyneladende gør det muligt at gøre mange flere kloge ting end vanilla SQL. Jeg fandt denne PL / SQL FAQ nyttig, når du forsøger at lære om Oracle, det kan også hjælpe dig.

Som jeg tidligere har nævnt, er jeg ingen DBA og ved meget lidt om specifikke databaser. Jeg har gjort mit bedste for at formidle, hvad min kompis viste mig i min korte tid på hans skrivebord og i efterfølgende e-mails. Hvis jeg har fået noget drastisk forkert, så lad mig vide i kommentarfeltet.

Se Også