Reader vragenuur opnieuw. Dit keer een Oracle-vraag en 'wat te doen als je ora-06512-fouten ziet'. Ik moet toegeven dat Oracle niet mijn ding is, maar ik ken een vriendelijke DBA die in Oracle woont en bereid was me te helpen deze vraag te beantwoorden in ruil voor een grote kop koffie.
Oracle is een databasebeheersysteem dat al veertig jaar in verschillende vormen bestaat. Het gebruikte oorspronkelijk het SCOTT-schema, genoemd naar een van de oorspronkelijke werknemers van Oracle. Je hebt zelfs voor de eerste keer ingelogd bij Oracle met de gebruikersnaam 'scott' en het wachtwoord 'tiger' dat naar de kat van Scott is genoemd. Nu zijn er verschillende schema's gebruikt, afhankelijk van waar je Oracle voor gebruikt.
Als u meer wilt weten over Oracle, is deze pagina erg handig.
Ora-06512 fouten herstellen
Blijkbaar is een ora-06512-fout een algemene uitzonderingsfout die u vertelt waar iets fout gaat en niet wat er mis gaat.
De foutsyntaxis kan bijvoorbeeld luiden:
ORA-01422: exact ophalen levert meer op dan het gevraagde aantal rijen
ORA-06512: bij "DATABASE_NAME", regel 66
ORA-06512: op regel 1
De eerste regel vertelt u welk type fout zich voordoet, in dit geval retourneert de query meer gegevens dan de query verwacht, zodat deze niet weet hoe deze moet worden verwerkt. De 'ORA-01422'-code is de daadwerkelijke foutcode waarnaar u moet kijken. De ORA-06512 is gewoon de algemene foutcode.
De tweede regel vertelt u waar de fout zich voordoet. De DATABASE_NAME wordt de database waarin u op dat moment werkt. Lijn 66 is de regel waar de fout zich voordoet en is de regel die u moet controleren om de fout te corrigeren.
De derde regel in de foutsyntaxis vertelt u waar het gesprek vandaan komt. Vink regel één aan en je ziet een oproep naar DATABASE_NAME.
Om deze fout te verhelpen, moet u het probleem oplossen dat is veroorzaakt door ORA-01422, dat is 'exact ophalen retourneert meer dan het gevraagde aantal rijen' of u moet een uitzonderingshandler toevoegen om Oracle te laten negeren. Als het oplossen van het kernprobleem altijd de voorkeur heeft, is dit de manier om te gaan.
Er zijn twee dingen die je kunt doen. Als u verwacht dat de query meer dan één rij retourneert, kunt u deze aanpassen zodat deze niet verrast wordt. Als u alleen verwacht dat de query één enkele rij retourneert, kunt u deze ook voor die rij wijzigen.
Verwacht meer dan één rij:
voor X in (selecteer * vanaf t waar ...)
lus
- verwerk hier het X-record
eindlus;
Dit zou de fout in databasequery's moeten verwijderen waarin meer dan één rij zou worden geretourneerd.
Als u alleen verwacht dat een enkele rij wordt geretourneerd, kunt u het volgende proberen:
beginnen
selecteer * in ....
van t waar ....
werkwijze….
uitzondering
wanneer NO_DATA_FOUND dan
foutafhandelingscode wanneer er geen record is gevonden
wanneer TOO_MANY_ROWS dan
foutafhandelingscode wanneer er te veel records zijn gevonden
einde;
Deze tweede methode zou alleen de enkele rij moeten opleveren zonder de 'ORA-01422: exacte ophalen haalt meer dan gevraagde aantal rijen' fout op te geven en daarmee de originele ORA-06512-fout.
U kunt de query ook zo aanpassen dat deze alleen de eerste rij van een antwoord met meerdere rijen retourneert. Dit kan werken als u geen volledige controle over de database hebt of niet te veel wilt knoeien met dingen, maar nog steeds een antwoord nodig hebt.
verklaren
c1 cursor voor select * van t waar ...
beginnen
open c1;
c1 ophalen in ..
als (c1% niet gevonden) dan
foutafhandeling voor geen record gevonden
stop als;
sluit c1;
einde;
Ik kreeg deze laatste actie niet te zien, maar ik ben er zeker van dat in omstandigheden waarin meerdere retourzendingen kunnen worden gevonden, maar u slechts één rij retour en geen fouten wilt, dit zal werken.
Ik ken een beetje SQL, genoeg om een eenvoudige selecte stelling te schrijven, maar ik moet toegeven dat Oracle me heeft gegooid. Hoewel het PL / SQL is, is het vergelijkbaar, ik merkte dat ik verdwaald was. PL / SQL is de Procedural Language-uitbreiding van Oracle voor SQL, waarmee het blijkbaar veel slimmere dingen kan doen dan vanilla SQL. Ik vond deze PL / SQL-veelgestelde vraag nuttig bij het leren over Oracle, het kan u ook helpen.
Zoals ik eerder heb gezegd, ben ik geen DBA en weet ik heel weinig over specifieke databases. Ik heb mijn best gedaan om te laten zien wat mijn buddy me liet zien tijdens mijn korte tijd achter zijn bureau en in de daaropvolgende e-mails. Als ik iets drastisch verkeerd heb gedaan, laat het me dan weten in de comments.