complete guide pl sql exception handling with examples
Denne opplæringen forklarer håndtering av PL SQL-unntak og relaterte konsepter som typer unntak, brukerdefinerte og systemdefinerte unntak, hvordan du kan opprette et unntak, etc:
I PL / SQL Datetime Format av PL / SQL-serien , vi lærte om noen nyttige funksjoner rundt Datetime, Timestamp og Interval
I denne artikkelen vil vi diskutere håndtering av unntak i PL SQL. Vi skal også utforske fordelene med unntak og hvordan vi kan heve dem.
La oss starte med læringene !!
Hva du vil lære:
PL SQL Unntakshåndtering
En feil eller en advarselshendelse kalles et unntak. Det oppstår under kjøring av PL / SQL-programmet. PL / SQL har mekanismer for å håndtere disse eksepsjonelle forholdene ved hjelp av EXCEPTION-kodeblokken der det er definert hvordan man skal motvirke feiltilstanden.
Det er to typer unntak. De er oppført nedenfor:
- Brukerdefinerte unntak.
- Systemdefinerte unntak.
Noen av de populære systemdefinerte unntakene er tomt for minne og divisjon med null, har navn som henholdsvis STORAGE_ERROR og ZERO_DIVIDE. Brukerdefinerte unntak er deklarert i en pakke, underprogram eller i erklæringsdelen av PL / SQL-kodeblokken og skal tildeles navn.
Når et unntak oppstår, stoppes den naturlige utførelsesflyten, og deretter peker utførelsen til unntaksdelen av PL / SQL-koden. Mens de systemdefinerte unntakene kastes som standard, må de brukerdefinerte eksplisitt kastes av RAISE-nøkkelordet.
Dermed hjelper unntakshåndteringen med å håndtere feilene som oppstår under kjøring av løpetiden, og ikke mens du kompilerer programmet.
Fordeler med unntakshåndtering
Fordelene er listet opp nedenfor:
- Hvis koden vår ikke har unntaksbehandling, må vi verifisere feil i utførelsen hver gang vi utfører en uttalelse.
- Hvis vi unngår unntakshåndtering i koden vår, blir de faktiske feilene savnet, noe som gir opphav til noen andre feil.
- Unntakshåndteringen gjør det mulig å hoppe over flere bekreftelser i koden.
- Det gir bedre lesbarhet for koden ved å isolere feilbehandlerne i koden.
Syntaksen for håndtering av unntak:
DECLARE <> BEGIN < > EXCEPTION <> WHEN excp1 THEN <> WHEN excp2 THEN <> ........ WHEN others THEN <> END;
Standard unntaket utføres med NÅR andre SÅ.
La oss se på en tabell som heter BORGER .
SELECT * FROM CITIZEN;
Vi har laget CITIZEN-tabellen ved hjelp av SQL-setningen gitt nedenfor.
CREATE TABLE CITIZEN ( ID INT NOT NULL, NAME VARCHAR (15) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) );
Sett inn verdier i denne tabellen med SQL-setninger gitt nedenfor:
INSERT INTO CITIZEN VALUES (1, 'ZAKS', 14); INSERT INTO CITIZEN VALUES (8, 'RANNY', 75); INSERT INTO CITIZEN VALUES (5, 'TOM', 37);
Koding Implementering med unntakshåndtering:
DECLARE citizen_id citizen.id%type; citizen_name citizen.name%type; citizen_age citizen.age%type := 9; BEGIN SELECT id, name INTO citizen_id, citizen_name FROM citizen WHERE age = citizen_age; DBMS_OUTPUT.PUT_LINE ('Citizen id is: '|| citizen_id); DBMS_OUTPUT.PUT_LINE ('Citizen name is: '|| citizen_name); EXCEPTION WHEN no_data_found THEN dbms_output.put_line ('No citizen detail found'); WHEN others THEN dbms_output.put_line ('Errors'); END; /
Resultatet av ovennevnte kode:
I den ovennevnte koden, da det ikke er noen borgere med fylte 9 år i CITIZEN-tabellen, heves et kjøretidsunntak.
Hev unntak i PL / SQL
Et unntak kan tas opp av utviklerne eksplisitt ved hjelp av nøkkelordet RAISE.
Syntaksen for unntaksheving:
DECLARE exception_n EXCEPTION; BEGIN IF condition THEN RAISE exception_n; END IF; EXCEPTION WHEN exception_n THEN <>; END;
Her er unntaket_n navnet på unntaket vi hevder. På denne måten kan vi heve både brukerdefinerte og systemdefinerte unntak.
Brukerdefinert unntak
Utviklerne kan bygge sine egne unntak og bruke dem til å håndtere feil. De kan opprettes i erklæringsdelen av et underprogram og kan kun nås i det underprogrammet.
Et unntak som er opprettet på pakkenivå kan brukes når pakken er tilgjengelig. Et brukerdefinert unntak kan heves ved å bruke RAISE-nøkkelordet.
Syntaksen for en brukerdefinert feil er:
DECLARE exception_n EXCEPTION;
Her, den unntak_n er navnet på unntaket vi hevder. Dermed kan vi erklære et unntak ved å gi et navn etterfulgt av unntak nøkkelordet. Et unntak kan erklæres på samme måte som variabler blir deklarert. Et unntak er imidlertid en uventet tilstand og ikke et dataelement.
Unntakets omfang i PL / SQL:
Reglene for omfang for unntak fra PL / SQL er oppført nedenfor:
- Et unntak kan ikke erklæres mer enn én gang i samme kodeblokk. Men vi kan erklære det samme unntaket i to forskjellige kodeblokker.
- Et unntak deklarert i en kodeblokk er lokalt i den blokken og globalt for hver underblokk.
- Hvis vi igjen erklærer et globalt unntak i en underblokk, overstyrer den lokale erklæringen.
La oss igjen vurdere en tabell som heter CITIZEN.
Kodeimplementering med brukerdefinerte unntak:
DECLARE firstexception EXCEPTION; j NUMBER; BEGIN FOR j IN (SELECT * FROM CITIZEN) LOOP IF j.ID = 8 THEN RAISE firstexception; END IF; END LOOP; EXCEPTION WHEN firstexception THEN dbms_output.put_line ('Citizen with ID 8 already exist in table.'); END; /
Resultatet av ovennevnte kode:
Forhåndsdefinert unntak
I strid med databaseregler eller å gå utover den systemavhengige terskelen, kastes et internt unntak automatisk. Alle disse feilene har et unikt nummer, og hvert unntak er definert som et navn. For eksempel, PL / SQL kaster NO_DATA_FOUND forhåndsdefinert unntak når et SELECT-spørsmål ikke henter rader.
Alle de forhåndsdefinerte unntakene fra PL / SQL er erklært i STANDARD-pakken som omhandler PL / SQL-miljøet.
Unntak | Oracle-feil | SQL-KODE | Beskrivelse |
---|---|---|---|
FEIL NUMMER | TID - 01722 | -1722 | Dette unntaket heves hvis konvertering til en tegnstreng til et nummer ikke går, siden strengen representerer et ugyldig tall. |
ACCESS_INTO_NULL | NÅ - 06530 | -6530 | Dette unntaket heves hvis et nullobjekt naturlig tildeles en verdi. |
CASE_NOT_FOUND | NÅ - 06592 | -6592 | Dette unntaket heves hvis ingen av alternativene i WHEN-klausulen er valgt og det ikke eksisterer en ELSE-klausul. |
COLLECTION_IS_NULL | NÅ - 06531 | -6531 | Dette unntaket heves når koden prøver å bruke innsamlingsmetoder unntatt EXISTS til en nestet tabell eller varray som ikke er initialisert. Det kan også heves hvis koden vår prøver å tilordne verdier til en nestet tabell eller variasjon som ikke er initialisert. |
DUP_VAL_ON_INDEX | TID - 00001 | -1 | Dette unntaket heves hvis dupliserte verdier er forsøkt lagret i en kolonne som er begrenset av en unik indeks. |
CURSOR_ALREADY_OPEN | NÅ - 06511 | -6511 | Dette unntaket heves hvis koden vår prøver å åpne en allerede åpen markør. |
INVALID_CURSOR | TID - 01001 | -1001 | Dette unntaket heves hvis vi prøver å gjøre noen operasjoner på markører som ikke er tillatt. For eksempel å prøve å lukke en allerede lukket markør. |
LOGIN_DENIED | TID - 01017 | -1017 | Dette unntaket heves hvis programmet prøvde å logge på databasen med et feil brukernavn og passord. |
INGEN DATA FUNNET | TID - 01403 | 100 | Dette unntaket heves hvis et SELECT-spørsmål ikke henter rader. |
NOT_LOGGED_ON | TID - 01012 | -1012 | Dette unntaket heves hvis vi prøver å utføre en databaseoperasjon uten å koble til den. |
PROGRAM_ERROR | TID - 06501 | -6501 | Dette unntaket heves hvis PL / SQL-programmet har opplevd en intern feil. |
ROWTYPE_MISMATCH | TID - 06504 | -6504 | Dette unntaket heves hvis en markør prøver å returnere verdier til en variabel med inkompatibel datatype. |
SELF_IS_NULL | NÅ - 30625 | -30625 | Dette unntaket heves hvis en medlemsmetode kalles uten å initialisere objekttypen. |
STORAGE_ERROR | NÅ - 06500 | -6500 | Dette unntaket heves hvis PL / SQL-programmet gikk tom for minne eller minnet ble ødelagt under kjøring. |
TOO_MANY_ROWS | TID - 01422 | -1422 | Dette unntaket heves hvis et SELECT-spørsmål henter flere rader. |
SUBSCRIPT_BEYOND_COUNT | NÅ - 06533 | -6533 | Dette unntaket heves hvis et abonnement er mer enn det totale antallet antall elementer i samlingen. |
SUBSCRIPT_OUTSIDE_LIMIT | NÅ - 06532 | -6532 | Dette unntaket heves hvis et abonnement er utenfor terskelområdet. |
SYS_INVALID_ROWID | ORA-01410 | -1410 | Dette unntaket heves hvis konvertering til en tegnstreng til en universell rad-ID ikke går fordi tegnstrengen representerer en ugyldig rad-ID. |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 | Dette unntaket heves hvis Oracle venter på en ressurs. |
VALUE_ERROR | ORA-06502 | -6502 | Dette unntaket heves hvis det oppstår en matematisk, konverterings-, avkuttingsfeil i programmet vårt. |
ZERO_DIVIDE | ORA-01476 | -1476 | Dette unntaket heves hvis vi prøver å dele et tall med 0. |
Ofte stilte spørsmål og svar
Q # 1) Hva er et forhåndsdefinert unntak i PL / SQL?
Svar: Et forhåndsdefinert unntak blir kastet av PL / SQL automatisk hvis det er et brudd på databasens regler av et program.
Q # 2) Hva håndteres PL / SQL-unntak, og hvorfor er det nødvendig?
Svar: En feil eller uventet hendelse i programmet kalles et unntak. Det stopper den normale gjennomføringen av programmet. I PL / SQL håndteres unntaket innenfor en UNNTATNING-blokk i koden, og riktig handling mot unntaket er beskrevet inne i den blokken.
Q # 3) Hva menes med unntakshåndtering?
Svar: Det er metoden for å svare på uventede hendelser som kan oppstå mens du utfører koden.
Q # 4) Hva er de to formene for feilhåndtering?
Svar: De to formene for feilhåndtering inkluderer kompileringsfeil og kjøretidsfeil . Kjøretidsfeilen skjer under utførelsen av programmet på grunn av feil data eller logikk. Kompileringstidsfeilene blir fanget opp under utarbeidelsen av koden vår.
Q # 5) Hva er forskjellen mellom feil og unntak?
hvordan lage java åpne jar-filer
Svar: Unntak er hendelser som håndteres ved hjelp av prøve / fangstblokk og kan oppstå både i kompileringstid og kjøretid for programutførelsen. Feilene, derimot, oppstår bare på kjøretiden.
Konklusjon
I denne veiledningen har vi diskutert i detalj noen grunnleggende konsepter for PL / SQL som er essensielle for å håndtere unntakene i programmene våre.
Vi har dekket følgende emner listet opp nedenfor:
- Unntak.
- Typer unntak.
- Noen forhåndsdefinerte unntak.
I neste opplæring skal vi diskutere PL / SQL-transaksjoner, OOPS-konsepter og mange flere tilknyttede emner.
Anbefalt lesing
- C # Exception Handling Tutorial med kodeeksempler
- Java-unntak og unntakshåndtering med eksempler
- PL SQL-pakke: Oracle PL / SQL-pakkeveiledning med eksempler
- Unntakshåndtering i C ++
- PL SQL Tutorial for nybegynnere med eksempler Hva er PL / SQL
- PL SQL-opplæringsveiledning med eksempler