Leser spørsmålstid igjen. Denne gangen et Oracle spørsmål og "hva skal jeg gjøre hvis du ser ora-06512 feil". Jeg må innrømme at Oracle ikke er min ting, men jeg kjenner en vennlig DBA som bor i Oracle, og var villig til å hjelpe meg med å svare på dette spørsmålet mot en stor kopp kaffe.
Oracle er et databasebehandlingssystem som har eksistert i førti år i ulike former. Det brukte opprinnelig noe som kalles SCOTT-skjemaet, oppkalt etter en av de opprinnelige ansatte i Oracle. Du logget deg til Oracle for første gang med brukernavnet 'scott' og passordet 'tiger' som er oppkalt etter Scotts katt. Nå er det flere skjemaer brukt avhengig av hva du bruker Oracle for.
Hvis du vil lære mer om Oracle, er denne siden veldig nyttig.
Å fikse Ora-06512-feil
Tilsynelatende er en ora-06512-feil en generell unntaksfeil som forteller deg hvor noe går galt, ikke hva som går galt.
For eksempel kan feilsyntaxen lese:
ORA-01422: Eksakt henting returnerer mer enn ønsket antall rader
ORA-06512: på "DATABASE_NAME", linje 66
ORA-06512: på linje 1
Den første linjen forteller deg hva slags feil som skjer, i så fall returnerer spørringen flere data enn spørringen forventer, slik at den ikke vet hvordan man skal håndtere den. 'ORA-01422' -koden er den faktiske feilkoden du må se på. ORA-06512 er bare den generelle feilkoden.
Den andre linjen forteller deg hvor feilen oppstår. DATABASE_NAME kommer til å være hvilken database du jobber med på den tiden. Linje 66 er linjen der feilen oppstår, og er linjen du må sjekke for å rette feilen.
Den tredje linjen i feilsyntaxen forteller deg hvor samtalen kommer fra. Sjekk linje ett, og du vil se et anrop til DATABASE_NAME.
For å fikse denne feilen må du løse problemet forårsaket av ORA-01422, som er "eksakt henting returnerer mer enn ønsket antall rader", eller du må legge til en unntakshåndterer for å fortelle Oracle å ignorere det. Ettersom kjerneproblemet alltid er å foretrekke, er dette veien å gå.
Det er to ting du kan gjøre. Hvis du forventer at spørringen skal returnere mer enn en enkelt rad, kan du endre det slik at det ikke blir overrasket. Hvis du bare forventer at spørringen skal returnere en enkelt rad, kan du endre det også.
Forvente mer enn en enkelt rad:
for X i (velg * fra t hvor ...)
sløyfe
- behandle X-posten her
ende sløyfe;
Dette bør utrydde feilen i databasespørsmål der mer enn én rad skulle returneres.
Hvis du bare forventer at en enkelt rad skal returneres, kan du prøve:
begynne
velg * til ....
fra t hvor ....
prosess….
unntak
når NO_DATA_FOUND da
Feilhåndteringskode når ingen registrering er funnet
når TOO_MANY_ROWS da
Feilhåndteringskode når du finner for mange poster
slutt;
Denne andre metoden skal levere bare en rad uten å kaste opp 'ORA-01422: eksakt retur returnerer mer enn ønsket antall rader' -feil og dermed den opprinnelige ORA-06512-feilen.
Du kan også finjustere spørringen, slik at den bare returnerer den første raden i et svar på flere rader. Dette kan fungere hvis du ikke har full kontroll over databasen eller ikke vil rote med ting for mye, men trenger fortsatt et svar.
erklære
c1 markør for å velge * fra t hvor ...
begynne
åpne c1;
hente c1 inn i ..
hvis (c1% ikke funnet) da
Feilhåndtering for ingen registrering funnet
slutt om;
lukk c1;
slutt;
Jeg fikk ikke se denne endelige i aksjon, men jeg er sikker på at i tilfeller der flere avkastninger kan bli funnet, men du bare vil ha en enkelt rad tilbake og ingen feil, vil dette fungere.
Jeg vet litt SQL, nok til å skrive en grunnleggende velgstand, men jeg må innrømme at Oracle kastet meg. Selv om det er PL / SQL, er det lignende, fant jeg meg selv tapt. PL / SQL er Oracle's Procedural Language Extension til SQL som tilsynelatende tillater det å gjøre mange flere klare ting enn vanilje SQL. Jeg fant denne PL / SQL FAQen nyttig når du prøver å lære om Oracle, det kan også hjelpe deg.
Som jeg tidligere har nevnt, er jeg ingen DBA og vet lite om bestemte databaser. Jeg har gjort mitt beste for å formidle hva min kompis viste meg i løpet av kort tid på sitt skrivebord og i etterfølgende e-post. Hvis jeg har fått noe drastisk galt, gi meg beskjed i kommentarfeltet.