En feiltilstand under en programkjøring kalles et unntak i PL /SQL. PL /SQL støtter programmerere å fange slike forhold ved hjelp av UNNTAK
blokkere i programmet, og et passende tiltak er tatt mot feilen. Det finnes to typer unntak:
System definerte unntak
Brukerdefinerte unntak
Syntax for Unntak håndtering
General Syntax for avvikshåndtering er som følger. Her kan du liste ned så mange unntak du ønsker å håndtere. Standard Unntaket vil bli håndtert ved hjelp av når andre THEN Bilde:
ERKLÆRER < erklæringer delen > BEGIN < kjørbar kommando (s) > UNNTAK < avvikshåndtering går her > NÅR exception1 SÅ exception1-håndtering-uttalelser NÅR exception2 SÅ exception2-håndtering-uttalelser NÅR exception3 SÅ exception3-håndtering-uttalelser ........ når andre SÅ exception3-håndtering-statementsEND;
Eksempel
La oss skrive en enkel kode for å illustrere konseptet. Vi skal bruke den KUNDER bordet vi hadde skapt og brukt i de foregående kapitlene:
ERKLÆRER c_id customers.id% Type: = 8; c_name customers.name% type; c_addr customers.address% type; BEGIN SELECT navn, adresse INTO c_name, c_addr fra kunder hvor id = c_id; DBMS_OUTPUT.PUT_LINE ('Navn:' || c_name); DBMS_OUTPUT.PUT_LINE ('Adresse:' || c_addr); unntak når no_data_found SÅ dbms_output.put_line ('! Ingen slik kunde'); NÅR andre så dbms_output.put_line ('Feil!'); END; /
Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:!.
Ingen slik kunde PL /SQL-prosedyren ble fullført < p> viser Listen program navnet og adressen til en kunde som har ID er gitt. Siden det er ingen kunde med ID verdi 8 i vår database, hever programmet kjøretids unntak NO_DATA_FOUND
, som er fanget i UNNTAK
blokk.
Raising Unntak
Unntak er oppdratt av databaseserveren automatisk når det er noen interne database feil, men unntak kan heves eksplisitt av programmerer ved hjelp av kommandoen RAISE
. Følgende er enkel syntaks for å heve et unntak:
ERKLÆRER exception_name unntak; BEGIN IF tilstand deretter heve exception_name; END IF; unntak når exception_name SÅ statement; END;
Du kan bruke ovenfor syntaks i oppdra Oracle standard unntak eller en brukerdefinert unntak. Neste avsnitt vil gi deg et eksempel på å øke brukerdefinert unntak, ligner måten kan du heve Oracle standard unntak også.
Brukerdefinerte Unntak
PL /SQL kan du definere din egen unntak i henhold til behovet for programmet. En brukerdefinert unntak må deklareres og deretter hevet eksplisitt, enten ved hjelp av en RAISE uttalelse eller prosedyren DBMS_STANDARD.RAISE_APPLICATION_ERROR.
Syntaksen for å erklære et unntak:
erklære min-unntak unntak;
Eksempel:
Følgende eksempel illustrerer konseptet. Dette programmet ber om en kunde-ID, når brukeren skriver inn en ugyldig ID, er unntaket invalid_id hevet.
ERKLÆRER c_id customers.id% Type: = & cc_id; c_name customers.name% type; c_addr customers.address% type; - Brukerdefinerte unntak ex_invalid_id unntak; BEGIN IF c_id < = 0 deretter heve ex_invalid_id; ELSE SELECT navn, adresse INTO c_name, c_addr fra kunder hvor id = c_id; DBMS_OUTPUT.PUT_LINE ('Navn:' || c_name); DBMS_OUTPUT.PUT_LINE ('Adresse:' || c_addr); END IF; unntak når ex_invalid_id SÅ dbms_output.put_line ('ID må være større enn null!'); NÅR no_data_found SÅ dbms_output.put_line ('Ingen slik kunden!'); Når andre SÅ dbms_output.put_line ('Feil!'); END; /
Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
Oppgi verdien for cc_id: -6 (la oss legge inn en verdi -6) gamle 2: c_id customers.id% Type: = & cc_id, ny 2: c_id customers.id% Type:!. = -6; ID må være større enn null PL /SQL-prosedyren ble fullført
Forhåndsdefinerte Unntak
PL /SQL gir mange forhåndsdefinerte unntak, som er utført når en database regelen blir brutt av et program. For eksempel er det forhåndsdefinerte unntak NO_DATA_FOUND hevet når en SELECT INTO uttalelse ga ingen rader. Tabellen nedenfor viser noen av de viktige forhåndsdefinerte unntak:
Exception
Oracle Feil
SQLCODE
ACCESS_INTO_NULL06530-6530It heves når en null objekt blir automatisk tildelt en verdi .CASE_NOT_FOUND06592-6592It heves når ingen av valgene i NÅR klausuler i et CASE-setningen er valgt, og det er ingen ELSE clause.COLLECTION_IS_NULL06531-6531It heves når et program prøver å bruke innsamlings andre metoder enn det som finnes til en initialisert nestet tabell eller varray, eller programmet forsøker å tilordne verdier til elementer av en initialisert nestet tabell eller varray.DUP_VAL_ON_INDEX00001-1It heves når like verdier blir forsøkt lagret i en kolonne med unik index.INVALID_CURSOR01001-1001It heves når det gjøres forsøk å lage en markør operasjon som ikke er tillatt, for eksempel stenge en uåpnet cursor.INVALID_NUMBER01722-1722It heves når konverteringen av en tegnstreng i en rekke svikter fordi strengen representerer ikke et gyldig tall. LOGIN_DENIED01017-1017It heves når s program forsøker å logge seg på databasen med et ugyldig brukernavn eller password.NO_DATA_FOUND01403 + 100It heves når en SELECT INTO setningen returnerer ingen rows.NOT_LOGGED_ON01012-1012It heves når det er utstedt en database samtale uten å være tilkoblet til database.PROGRAM_ERROR06501-6501It heves når PL /SQL har en intern problem.ROWTYPE_MISMATCH06504-6504It heves når en markør henter verdi i en variabel har inkompatibel data type.SELF_IS_NULL30625-30625It heves når et medlem metode kalles, men forekomst av objekttypen ble ikke initialisert. STORAGE_ERROR06500-6500It heves når PL /SQL gikk tom for minne eller minne ble corrupted.TOO_MANY_ROWS01422-1422It heves når s VELG INTO- returnerer mer enn én row.VALUE_ERROR06502-6502It heves når en aritmetisk, konvertering, avkutting eller størrelse- begrensning feil oppstår. ZERO_DIVIDE014761476It heves når det gjøres et forsøk på å dele et tall med null.