Så här fixar du Ora-06512-fel

Reader frågestund igen. Denna gång en Oracle fråga och "Vad ska man göra om du ser ora-06512 fel". Jag måste erkänna att Oracle inte är min sak, men jag vet en vänlig DBA som bor i Oracle och var villig att hjälpa mig att svara på den här frågan i stället för en stor kopp kaffe.

Oracle är ett databasstyrningssystem som har funnits i fyrtio år i olika former. Det använde ursprungligen något som kallades SCOTT-schemat, uppkallat efter en av de ursprungliga anställda i Oracle. Du loggade till Oracle för första gången med användarnamnet "scott" och lösenordet "tiger" som heter Scotts katt. Nu finns det flera scheman som används beroende på vad du använder Oracle för.

Om du vill lära dig mer om Oracle är den här sidan väldigt användbar.

Åtgärda Ora-06512-fel

Tydligen är ett ora-06512-fel ett allmänt undantagsfel som berättar om var något går fel, inte vad som går fel.

Felsyntaxen kan till exempel läsa:

ORA-01422: Exakt hämtning returnerar mer än önskat antal rader

ORA-06512: vid "DATABASE_NAME", rad 66

ORA-06512: vid linje 1

Den första raden berättar vilken typ av fel som händer. I det här fallet returnerar frågan mer data än vad förfrågan förväntar sig, så det vet inte hur man hanterar det. 'ORA-01422' -koden är den faktiska felkoden du behöver titta på. ORA-06512 är bara den allmänna felkoden.

Den andra raden berättar om var felet inträffar. DATABASE_NAME kommer att vara vilken databas du arbetar på då. Linje 66 är linjen där felet händer och är den linje du behöver kontrollera för att korrigera felet.

Den tredje raden i felsyntaxen berättar om var samtalet kommer ifrån. Kontrollera linje ett och du kommer att se ett samtal till DATABASE_NAME.

För att åtgärda detta fel måste du åtgärda problemet som orsakats av ORA-01422, vilket är "exakt hämtningsavkastning mer än önskat antal rader" eller du måste lägga till en undantagshanterare för att berätta för Oracle att ignorera det. Att fixa kärnproblemet är alltid att föredra, det här är vägen att gå.

Det finns två saker du kan göra. Om du förväntar dig att frågan returnerar mer än en enda rad, kan du ändra det så det blir inte förvånat. Om du bara förväntar dig att frågan returneras en enda rad, kan du ändra det också.

Förväntar sig mer än en enda rad:

för X i (välj * från t där ...)

slinga

- bearbeta X-posten här

ändslinga;

Detta bör utrota felet i databasfrågor där mer än en rad skulle returneras.

Om du bara räknar med att en enda rad ska returneras kan du försöka:

Börja

välj * till ....

från t där ....

bearbeta….

undantag

när NO_DATA_FOUND då

felhanteringskod när ingen post hittades

när TOO_MANY_ROWS då

felhanteringskod när alltför många poster hittas

slutet;

Den här andra metoden ska bara ge den enda raden utan att kasta upp "ORA-01422: Exakt återhämtning returnerar mer än önskat antal rader" -fel och därför det ursprungliga ORA-06512-felet.

Du kan också finjustera frågan så att den bara returnerar den första raden i ett multipelradsvar. Det här kan fungera om du inte har fullständig kontroll över databasen eller inte vill röra med saker för mycket men behöver fortfarande ett svar.

förklara

c1 markör för välj * från t där ...

Börja

öppen c1;

hämta c1 in i ..

om (c1% notfound) då

felhantering för ingen rekord hittades

sluta om

nära c1;

slutet;

Jag fick inte se den här sista i åtgärd men jag är säker på att under omständigheter där flera avkastningar kan hittas, men du bara vill ha en enda rad tillbaka och inga fel, kommer det att fungera.

Jag vet lite SQL, tillräckligt för att skriva ett grundläggande valda uttalande, men jag måste erkänna att Oracle slängde mig. Även om det är PL / SQL så är det liknande, jag fann mig själv förlorad. PL / SQL är Oracles Procedural Language-förlängning till SQL vilket tydligen tillåter det att göra många mer kloka saker än vanilla SQL. Jag hittade denna PL / SQL FAQ som är användbar när du försöker lära mig om Oracle, det kan också hjälpa dig.

Som jag har nämnt tidigare är jag ingen DBA och vet väldigt lite om specifika databaser. Jag har gjort mitt bästa för att förmedla vad min kompis visade mig under min korta tid vid sitt skrivbord och i efterföljande e-postmeddelanden. Om jag har fått något drastiskt fel, låt mig veta i kommentarfältet.

Se Även