sql >> Database teknologi >  >> RDS >> Database

Lær, hvordan du håndterer undtagelser i PL/SQL

Hvis du er programmør, er du måske bekendt med konceptet med undtagelseshåndtering er en integreret del af ethvert programmeringssprog. Da fejl er uundgåelige, og selv de klogeste af os kan lave fejl, mens vi skriver kode, skal vi være bekendt med, hvordan vi håndterer dem. I denne artikel vil vi især lære om undtagelseshåndteringen i PL/SQL.

Nedenfor er emnerne dækket i denne artikel:

  • Hvad er en undtagelse?
  • Syntaks for håndtering af undtagelser
  • Typer af undtagelser
    • Systemdefineret
      • Navngivne systemundtagelser
      • Unavngivne systemundtagelser
    • Brugerdefineret
      • Trin til at erklære brugerdefinerede funktioner
      • Eksempler på brugerdefinerede funktioner

Hvad er en undtagelse?

Enhver unormal tilstand eller hændelse, der afbryder det normale flow af vores programinstruktioner under kørsel eller i simple ord en undtagelse er en fejl.

Syntaks for undtagelseshåndtering i PL/SQL

DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2&nbsp; THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........

WHEN others THEN
exception3-handling-statements
END;

Her kan vi liste så mange undtagelser ned, som vi ønsker at håndtere. Standardundtagelsen vil blive håndteret ved hjælp af 'NÅR andre SÅ'

Eksempel på undtagelseshåndtering i PL/SQL

Nedenstående program viser navn og adresse på en studerende, hvis ID er givet. Da der ikke er nogen elev med ID-værdi 8 i vores database, rejser programmet runtime-undtagelsen NO_DATA_FOUND, som er fanget i EXCEPTION-blokken.

DECLARE 
   s_id studentS.id%type := 8; 
   s_name studentS.Name%type; 
   s_loc studentS.loc%type; 
BEGIN 
   SELECT  name, loation INTO  s_name, s_loc 
   FROM students 
   WHERE id = s_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  s_name); 
   DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc);
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such student!'); 
   WHEN others THEN 
      dbms_output.put_line('Oops, Error!'); 
END; 

Output

No such student!
PL/SQL procedure successfully completed.  

Her kan vi liste så mange undtagelser ned, som vi ønsker at håndtere. Standardundtagelsen vil blive håndteret ved hjælp af "WHEN others THEN

Typer af undtagelser i PL/SQL

  • System defineret
  • Bruger trodset

Lad os næste gang i denne artikel om undtagelseshåndtering i PL/SQL diskutere begge disse typer i detaljer.

System defineret

Defineret og vedligeholdt implicit af Oracle-serveren, er disse undtagelser hovedsageligt defineret i Oracle Standard Package. Når der opstår en undtagelse inde i programmet, matcher og identificerer Oracle-serveren den passende undtagelse fra det tilgængelige sæt af undtagelser, der er tilgængelige i Oracle-standardpakken. Grundlæggende er disse undtagelser foruddefinerede i PL/SQL, som bliver hævet NÅR en bestemt databaseregel overtrædes .

De Systemdefinerede undtagelser er yderligere opdelt i to kategorier:

  • Navngivne systemundtagelser
  • Unavngivne systemundtagelser

Navngivne systemundtagelser

De navngivne PL/SQL-undtagelser er navngivet i standardpakken af ​​PL/SQL , derfor behøver udvikleren ikke at definere PL/SQL-undtagelserne i deres kode. PL/SQL giver mange foruddefinerede navngivne undtagelser, som udføres, når en databaseregel overtrædes af et program. Den følgende tabel viser nogle få af de vigtige foruddefinerede undtagelser −

Undtagelse Oracle-fejl SQLCODE Beskrivelse
ACCESS_INTO_NULL 06530 -6530 Den hæves, når et null-objekt automatisk tildeles en værdi.
CASE_NOT_FOUND 06592 -6592 Den hæves, når ingen af ​​valgene i WHEN-sætningen i en CASE-sætning er valgt, og der ikke er nogen ELSE-sætning.
COLLECTION_IS_NULL 06531 -6531 Den hæves, når et program forsøger at anvende andre indsamlingsmetoder end EXISTS på en ikke-initialiseret indlejret tabel eller varray, eller programmet forsøger at tildele værdier til elementerne i en ikke-initialiseret indlejret tabel eller varray.
DUP_VAL_ON_INDEX 00001 -1 Den hæves, når duplikerede værdier forsøges gemt i en kolonne med et unikt indeks.
INVALID_CURSOR 01001 -1001 Den hæves, når der gøres forsøg på at lave en markørhandling, der ikke er tilladt, såsom at lukke en uåbnet markør.
INVALID_NUMBER 01722 -1722 Den hæves, når konverteringen af ​​en tegnstreng til et tal mislykkes, fordi strengen ikke repræsenterer et gyldigt tal.
LOGIN_DENIED 01017 -1017 Den hæves, når et program forsøger at logge på databasen med et ugyldigt brugernavn eller password.
NO_DATA_FOUND 01403 +100 Den hæves, når en SELECT INTO-sætning returnerer ingen rækker.
NOT_LOGGED_ON 01012 -1012 Det opstår, når et databasekald udsendes uden at være forbundet til databasen.
PROGRAM_ERROR 06501 -6501 Det opstår, når PL/SQL har et internt problem.
ROWTYPE_MISMATCH 06504 -6504 Den hæves, når en markør henter værdi i en variabel med inkompatibel datatype.
SELF_IS_NULL 30625 -30625 Den hæves, når en medlemsmetode kaldes, men forekomsten af ​​objekttypen blev ikke initialiseret.
STORAGE_ERROR 06500 -6500 Den hæves, når PL/SQL løb tør for hukommelse, eller hukommelsen er beskadiget.
TOO_MANY_ROWS 01422 -1422 Den hæves, når en SELECT INTO-sætning returnerer mere end én række.
VALUE_ERROR 06502 -6502 Den hæves, når der opstår en aritmetik-, konverterings-, trunkerings- eller størrelsesbegrænsningsfejl.
ZERO_DIVIDE 01476 1476 Den hæves, når der gøres et forsøg på at dividere et tal med nul.

Eksempel

CREATE OR REPLACE PROCEDURE add_new_student
      (student _id_in IN NUMBER, student _name_in IN VARCHAR2)
IS
BEGIN
       INSERT INTO student (student _id, student _name )
       VALUES ( student _id_in, student _name_in );
EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN
 raise_application_error (-20001,'Duplicate student _id');
       WHEN OTHERS THEN
raise_application_error (-20002,'An error occurred.');
END;

Lad os gå videre i denne artikel om håndtering af undtagelser i PL/SQL, og lad os forstå, hvad der er unavngivne systemundtagelser.

Unavngivne systemundtagelser

Systemundtagelserne, som Oracle ikke har et navn for, er kendt som unavngivne systemundtagelser. Disse undtagelser forekommer ikke ofte og er skrevet med en kode og en tilhørende besked.

Der er grundlæggende to måder at håndtere unavngivne systemundtagelser på:

1. Brug af WHEN OTHERS undtagelseshåndtering

2. At knytte undtagelseskoden til et navn og bruge det som en navngivet undtagelse.

Nogle trin, der følges for unavngivne systemundtagelser, er:

  • Hæv dem implicit.
  • Hvis de ikke håndteres i "NÅR Andre", skal de håndteres eksplicit.
  • For at håndtere undtagelsen eksplicit, kan de erklæres ved hjælp af Pragma EXCEPTION_INIT og håndteres ved at henvise til det brugerdefinerede undtagelsesnavn i undtagelsessektionen.

Et eksempel på håndtering af unavngivne undtagelser ved hjælp af Pragma EXCEPTION_INIT er givet senere i artiklen. Lad os gå videre i denne artikel om håndtering af undtagelser i PL/SQL, og lad os forstå de brugerdefinerede undtagelser.

Brugerdefineret

Som alle andre programmeringssprog giver Oracle dig også mulighed for at erklære annonceimplementering for dine egne undtagelser. I modsætning til systemdefinerede undtagelser, er disse undtagelser rejst eksplicit i PL/SQL-blokken.

Trin til at erklære brugerdefinerede undtagelser i Oracle-databasen

Vi kan definere brugerdefinerede undtagelser i Oracle-databasen på følgende 3 måder:

  • Brug af variabel af typen EXCEPTION

Her kan vi erklære en brugerdefineret undtagelse ved at erklære en variabel med EXCEPTION datatype i vores kode og hæve den eksplicit i vores program ved hjælp af RAISE-sætning.

  • Brug af PRAGMA EXCEPTION_INIT-funktionen

Vi kan definere et ikke-foruddefineret fejlnummer med variablen EXCEPTION datatype

  • Ved brug af metoden RAISE_APPLICATION_ERROR

Ved at bruge denne metode kan vi erklære en brugerdefineret undtagelse med vores eget tilpassede fejlnummer og meddelelse.

Indtil nu har du måske fået en grov idé om, hvordan vi kan rejse brugerdefinerede undtagelser i PL/SQL. Vi vil lære om hver af de ovennævnte metoder med eksempler yderligere i denne artikel om undtagelseshåndtering i PL/SQL.

Lad os derefter i denne artikel fortsætte med demonstrationerne af brugerdefineret undtagelseshåndtering.

Demonstration af brugerdefinerede undtagelser

Gå videre i denne artikel om undtagelseshåndtering i PL/SQL, lad os forstå, hvordan man bruger variablen af ​​typen EXCEPTION.

Brug af variabel af typen EXCEPTION

Processen med at erklære en brugerdefineret undtagelse er opdelt i tre dele, og disse tre dele er:

  • Erklære en variabel undtagelsesdatatype
  • Hæv undtagelsen
  • Håndter undtagelsen

Lad os skrive en kode for at demonstrere ovenstående trin i detaljer.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

I ovenstående erklæringsblok har vi fire variabler, blandt hvilke de første tre er normale tal datatypevariabler og den fjerde som er ex_DivZero er den særlige undtagelsesdatatypevariabel. Den fjerde er vores brugerdefinerede undtagelse.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

Ovenstående udførelsesdel af denne anonyme blok vil kun træde i kraft, når divisoren er 0. Hvis divisoren er nul, som den er i vores tilfælde, vil fejlen blive rejst og styringen af ​​programmet vil springe alle de næste trin over og søge efter matchende undtagelsesbehandler. I det tilfælde, hvor den finder en anden, udfører den handlingen i overensstemmelse hermed, ellers vil den enten afslutte programmet eller bede os om en uhåndteret systemdefineret fejl.

EXCEPTION WHEN ex_DivZero THEN
DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);

Dette er undtagelsesbehandleren. Så snart brugeren indtaster divisor som 0, vil ovenstående meddelelsesstreng blive bedt om.

Endelig kode:

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
END;

Lad os gå videre i denne artikel om håndtering af undtagelser i PL/SQL, og lad os forstå, hvordan man bruger metoden PRAGMA_EXCEPTION_INIT.

Brug af PRAGMA EXCEPTION_INIT-funktionen

I PRAGMA EXCEPTION_INIT-funktionen er et undtagelsesnavn knyttet til et Oracle-fejlnummer. Dette navn kan bruges til at designe undtagelsesbehandleren for fejlen. Til store projekter med mange brugerdefinerede fejl er PRAGMA EXCEPTION_INIT den mest nyttige og egnede metode.

Syntaks:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

Eksempel

DECLARE
   deadlock_detected EXCEPTION;
   PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
 NULL; -- Some operation that causes an ORA-00060 error
EXCEPTION
   WHEN deadlock_detected THEN
      NULL; -- handle the error
END;

PRAGMA EXCEPTION_INIT fortæller compileren at knytte et undtagelsesnavn til et Oracle-fejlnummer som nævnt tidligere. Det lader dig referere til enhver intern undtagelse ved navn og skrive en specifik behandler for den. Når du ser en fejlstak eller sekvens af fejlmeddelelser, er den øverste den, der kan fanges og håndteres.

Lad os gå videre i denne artikel om undtagelseshåndtering i PL/SQL, så lad os forstå, hvordan man bruger RAISE_APPLICATION_ERROR-metoden.

Ved brug af metoden RAISE_APPLICATION_ERROR

Det er en procedure, der er indbygget i oracle-softwaren. Ved at bruge denne procedure kan vi knytte et fejlnummer til en brugerdefineret fejlmeddelelse. Ved at kombinere både fejlnummeret og den brugerdefinerede fejlmeddelelse kan der sammensættes en fejlstreng, der ligner de standardfejlstrenge, der vises af oracle, når der opstår en fejl. RAISE_APPLICATION_ERROR procedure findes i DBMS_STANDARD-pakken

Syntaks

raise_application_error (error_number, message [, {TRUE | FALSE}]);

Eksempel

/* A trigger trg_emp_detail_chk is created.*/
CREATE OR REPLACE TRIGGER trg_emp_detail_chk

/* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/
Before UPDATE ON employees

DECLARE
permission_denied EXCEPTION;
BEGIN

/*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/
IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN
raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!');

/* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter
with a default text stating that the user is not authorized to do any modification in the weekends. */
END IF;
END;

Hermed er vi nået til slutningen af ​​denne artikel om "Undtagelseshåndtering i PL/SQL". Jeg håber, at dette emne er forstået godt og hjalp dig. Prøv at skrive dine egne koder og inkorporer de metoder, der er forklaret i denne artikel.

Hvis du ønsker at blive trænet af fagfolk i denne teknologi, kan du vælge struktureret træning fra edureka! Tjek denne MySQL DBA-certificeringsuddannelse af Edureka, en betroet online læringsvirksomhed med et netværk af mere end 250.000 tilfredse elever spredt over hele kloden. Dette kursus træner dig i kernekoncepter og avancerede værktøjer og teknikker til at administrere data og administrere MySQL-databasen. Det inkluderer hands-on læring om begreber som MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Database Design, MySQL Command line, MySQL Functions etc. I slutningen af ​​træningen vil du være i stand til at oprette og administrere din egen MySQL Database og administrere data.

Har du et spørgsmål til os? Nævn det i kommentarfeltet i denne artikel "Undtagelseshåndtering i PL/SQL", så vender vi tilbage til dig så hurtigt som muligt.


  1. Sådan eksporteres data fra SQL Server 2005 til MySQL

  2. PostgreSQL funktionskald

  3. Spring Data @CreatedDate annotering virker ikke for mig

  4. MySQL – MINDSTE og STØRSTE sammenligningsoperatører