Cours PL/SQL

Cours PL/SQL Manipulation de données


Télécharger Cours PL/SQL Manipulation de données

★★★★★★★★★★4 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


PL / SQL

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Généralités - PL/SQL

••PL/SQL est une extension procéduralePL/SQL est une extension procéduraledu langage SQL.du langage SQL.

••Possibilité d ’inclure des requêtes etPossibilité d ’inclure des requêtes etdes ordres de manipulation desdes ordres de manipulation desdonnées à l ’intérieur d ’une structuredonnées à l ’intérieur d ’une structurealgorithmique.algorithmique.

Intérêts du PL/SQL

Amélioration des Performances

   

Intérêts du PL/SQLDéveloppement MODULAIRE

 

Intérêts du PL/SQL

••Portabilité.Portabilité.

••Utilisation de variables.Utilisation de variables.

••Structures de contrôle.Structures de contrôle.

••Gestion des erreursGestion des erreurs

PL/SQL Structure de BLOC

•• DECLARE –DECLARE – FacultatifFacultatif ––Variables, curseurs, exceptions Variables, curseurs, exceptions utilisateurutilisateur

•• BEGIN –BEGIN – ObligatoireObligatoire ––Ordres SQLOrdres SQL

––Instructions PL/SQLInstructions PL/SQL

               •• EXCEPTION –EXCEPTION – FacultatifFacultatif                                       DECLARE

––Actions à exécuter en cas d ’erreurActions à exécuter en cas d ’erreur

•• END; –END; – ObligatoireObligatoire   BEGIN EXCEPTION

END;

Structure BLOC PL/SQL

DECLAREDECLARE v_variable  VARCHAR2(5);v_variable  VARCHAR2(5);

BEGINBEGIN

SELECTSELECT  nom-colonnenom-colonne INTOINTO v_variablev_variable

                                                                               FROMFROM nom-table_;nom-table_;

EXCEPTIONEXCEPTION

WHEN exceptWHEN exception_nom-erreur THENion_nom-erreur THENDECLARE

                                                            END;END;                        BEGIN

EXCEPTION

END;

Types de BLOC

                               Anonyme                   Procédure       Fonction

    [[DECLAREDECLARE]]PROCEDUREPROCEDURE namename FUNCTIONFUNCTION namename

                                                                                                                ISIS         RETURNRETURN datatypedatatype

ISIS

              BEGINBEGIN        BEGINBEGIN       BEGINBEGIN

      ----statementsstatements    ----statementsstatements----statementsstatements

RETURN value;RETURN value;

[[EXCEPTIONEXCEPTION]][[EXCEPTIONEXCEPTION]][[EXCEPTIONEXCEPTION]]

                END;END;          END;END;          END;END;

Utilisation d ’un BLOC

Proc

                                                 BlocBloc         Procédure/fonctionfonctionédure/

                                AnonymeAnonyme                         StockStockéesées

DECLARE

                     DDéclencheuréclencheur   BEGIN         ProcProcédure/édure/

                                ApplicatifApplicatif                            fonctionfonction

                                                                                                                              EXCEPTION                                         applicativeapplicative

                  DDéclencheuréclencheur   END;        PackagePackage

                                     Base deBase de                      procprocédure/édure/

                                    DonnDonnéesées                             fonctionfonction

Variables

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Utilisation des Variables en PL/SQL

••Déclaration dans la section DECLARE.Déclaration dans la section DECLARE.

••Affectation de valeurs dans la sectionAffectation de valeurs dans la sectionexécution (ou à la déclaration).exécution (ou à la déclaration).

••Passage de valeurs pour les procéduresPassage de valeurs pour les procédureset fonctions.et fonctions.

Types de Variables

••Variables PL/SQL :Variables PL/SQL :

–– ScalaireScalaire

–– StructuréeStructurée

–– RéférenceRéférence

–– LOB (Grands Objets - Large Object)LOB (Grands Objets - Large Object)

••Variables de liens (Non PL/SQL)Variables de liens (Non PL/SQL)

Declaration des Variables PL/SQL

Syntaxe

Nom_variableNom_variable[[CONSTANT] CONSTANT] type-donnéetype-donnée[[NOT NULL]   NOT NULL]   [{:=[{:= | DEFAULT}  | DEFAULT} expressionexpression]];;

Exemples

DeclareDeclare

                 v_hiredatev_hiredate DATE;DATE;

v_deptnov_deptno   NUMBER(2) NOT NULL := 10;NUMBER(2) NOT NULL := 10; v_locationv_location  VARCHAR2(13) := 'Atlanta';VARCHAR2(13) := 'Atlanta'; c_commc_comm   CONSTANT NUMBER := 1400;CONSTANT NUMBER := 1400;

Affectation de valeur

Syntaxe

Nom_variableNom_variable:=:=exprexpr;;

Exemples

Affecter une date d’embauche.

v_hiredate := To_DATEv_hiredate := To_DATE((’03-JAN-2000','DD-MON-99');’03-JAN-2000','DD-MON-99');

Affecter un nom d ’employé.

v_ename := 'Maduro';v_ename := 'Maduro';

Initialisation d’une variable

Possible dans la section DECLARE par :

••Opérateur d’affectation  (:=)Opérateur d’affectation  (:=)

••DEFAULT valeurDEFAULT valeur

••NOT NULLNOT NULL

ExemplesExemples::v_mgr NUMBER(4) DEFAULT  7839v_mgr NUMBER(4) DEFAULT  7839v_loc VARCHAR2(50) NOT NULL := 'PARIS'v_loc VARCHAR2(50) NOT NULL := 'PARIS'

Type Scalaire

••VARCHAR2 (VARCHAR2 (longueur-maximalelongueur-maximale))VARCHARVARCHAR

••NUMBER [(NUMBER [(précision, décimalesprécision, décimales)])]

••DATEDATE

••CHAR [(CHAR [(longueur-maximalelongueur-maximale)])]

••LONGLONG

••LONG RAWLONG RAW

••BOOLEANBOOLEAN

••BINARY_INTEGERBINARY_INTEGER

••PLS_INTEGERPLS_INTEGER

Déclarations de type scalaire

Exemples

                   v_jobv_job VARCHAR2(9);VARCHAR2(9);

v_countv_count   BINARY_INTEGER := 0;BINARY_INTEGER := 0; v_total_salv_total_sal  NUMBER(9,2) := 0;NUMBER(9,2) := 0; v_orderdatev_orderdate  DATE := SYSDATE + 7;DATE := SYSDATE + 7; c_tax_ratec_tax_rate CONSTANT NUMBER(3,2) := 8.25;CONSTANT NUMBER(3,2) := 8.25; v_validv_valid BOOLEAN NOT NULL := TRUE;BOOLEAN NOT NULL := TRUE;

Déclaration de type par référence

••Déclarer une variable par référence à :Déclarer une variable par référence à : –– Une colonne de table.Une colonne de table.

–– Une autre variable déclarée.Une autre variable déclarée.

••Utilisation du suffixe  %TYPE après  :Utilisation du suffixe  %TYPE après  :

–– -colonne.-colonne.

–– Nom-variableNom-variable

Déclaration de type par référence

Exemples

v_enamev_ename emp.ename%TYPE;emp.ename%TYPE; v_balancev_balance NUMBER(7,2);NUMBER(7,2);

v_min_balancev_min_balance v_balance%TYPE := 10;v_balance%TYPE := 10;

Déclaration de Type Booléen

••Valeurs TRUE, FALSE ou NULL.Valeurs TRUE, FALSE ou NULL.

••Opérateurs AND, OR, et NOT.Opérateurs AND, OR, et NOT.

••Possibilité d’obtenir une valeurPossibilité d’obtenir une valeurbooléenne à partir d’une expressionbooléenne à partir d’une expressionarithmétique ou chaîne de caractères.arithmétique ou chaîne de caractères.v_comm_sal BOOLEAN := (v_sal < v_comm);v_comm_sal BOOLEAN := (v_sal < v_comm);

Types Structurés

••PL/SQL TablePL/SQL Table

••PL/SQL Enregistrement (RECORD)PL/SQL Enregistrement (RECORD)

Type LOB

 

Variables de lien

 

Référence à une variable de lien

Variable de lien ou Variable hôte Préfixer le nom de variable par  (:) Exemple :

Ranger le salaire annuel dans une variable de lien :Ranger le salaire annuel dans une variable de lien :

::g_monthly_sal := v_sal / 12;g_monthly_sal := v_sal / 12;

Visualisation des variables  :

DBMS_OUTPUT.PUT_LINE

••DBMS_OUTPUT : package fourni parDBMS_OUTPUT : package fourni parOracleOracle

••Procédure PUT_LINE : affichage de laProcédure PUT_LINE : affichage de lavaleur d ’une variable.valeur d ’une variable.

••Utilisable sous SQL*PLUS avec l’optionUtilisable sous SQL*PLUS avec l’option

SET SERVEROUTPUT ON

DBMS_OUTPUT.PUT_LINE('Salaire DBMS_OUTPUT.PUT_LINE('Salaire mensuel : ' || mensuel : ' ||

TO_CHAR(v_sal,'99999.99'));TO_CHAR(v_sal,'99999.99'));

Instructions

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

BLOC PL/SQL Syntaxe

••Une instruction peut être écrite surUne instruction peut être écrite surplusieurs lignes.plusieurs lignes.

••Chaque instruction est terminée par (;)Chaque instruction est terminée par (;)

••Identificateur :Identificateur :

–– Permet de référencer un élémentPermet de référencer un élémentPL/SQL.PL/SQL.

–– Doit commencer par une lettre.Doit commencer par une lettre.

–– Maximum 30 caractères.Maximum 30 caractères.

Syntaxe : Ligne Commentaire

••Une seule ligne : deux tirets (--) en débutUne seule ligne : deux tirets (--) en débutde ligne.de ligne.

••Plusieurs lignes entre les symboles :Plusieurs lignes entre les symboles :

/* et */./* et */.

Exemple

v_sal NUMBER (9,2);v_sal NUMBER (9,2); BEGINBEGIN

/* calcul du salaire annuel /* calcul du salaire annuel à partir de données   à partir de données   fournies par l’utilisateur */fournies par l’utilisateur */ v_sal := :p_monthly_sal * 12;v_sal := :p_monthly_sal * 12;

END; -- fin de la transactionEND; -- fin de la transaction

Fonctions SQL en PL/SQL

••Utilisables :Utilisables :

–– Fonction-ligne numériqueFonction-ligne numérique

–– Fonction-ligne alphanumériqueFonction-ligne alphanumérique

–– Conversion de typeConversion de type

–– DateDate

••Non utilisables :Non utilisables :

–– DECODEDECODE

–– Fonctions de groupeFonctions de groupe

Fonctions SQL en PL/SQL

Exemples

••Adresse complète d’une entreprise :Adresse complète d’une entreprise :

v_mailing_address := v_name||CHR(10)||v_mailing_address := v_name||CHR(10)|| v_address||CHR(10)||v_state||v_address||CHR(10)||v_state|| CHR(10)||v_zip;CHR(10)||v_zip;

••Mettre le nom d ’employé en lettresMettre le nom d ’employé en lettresminuscules :minuscules :v_enamev_ename :=:= LOWER(v_ename); LOWER(v_ename);

Blocs  Imbriqués (Nested Blocks)

ExempleExemple

 



••Un bloc peut être inséré en lieu et placeUn bloc peut être inséré en lieu et placed’une instruction.d’une instruction.

••Un bloc imbriqué correspond à uneUn bloc imbriqué correspond à uneinstruction.instruction.

••La section EXCEPTION peut contenirLa section EXCEPTION peut contenirdes blocs imbriqués.des blocs imbriqués.

Visibilité des variables

Un identificateur (variable, curseur) est visible dans tous les blocs imbriqués par rapport à celui où il est défini.

Visibilité des variables

ExempleExemple

 

Visibilité des variables

DECLAREDECLARE

V_SALV_SAL NUMBER(7,2) := 60000;NUMBER(7,2) := 60000;

V_COMMV_COMM NUMBER(7,2) := V_SAL * .20;NUMBER(7,2) := V_SAL * .20;

V_MESSAGEV_MESSAGE VARCHAR2(255) := ' eligible for commission';VARCHAR2(255) := ' eligible for commission'; BEGIN BEGIN

DECLAREDECLARE

        V_SALV_SAL NUMBER(7,2) := 50000;NUMBER(7,2) := 50000;

V_COMM  V_COMM  NUMBER(7,2) := 0;NUMBER(7,2) := 0;

V_TOTAL_COMPV_TOTAL_COMP  NUMBER(7,2)NUMBER(7,2) := V_SAL + V_COMM; := V_SAL + V_COMM; BEGIN BEGIN

V_MESSAGE := 'CLERKV_MESSAGE := 'CLERK not'||V_MESSAGE; not'||V_MESSAGE;

END;END;

V_MESSAGE := 'SALESMAN'||V_MESSAGE;V_MESSAGE := 'SALESMAN'||V_MESSAGE; END;END;

Opérateurs en PL/SQL

••LogiqueLogique

••ArithmétiqueArithmétique

••ConcaténationConcaténation

••Parenthèses possiblesParenthèses possibles

••Opérateur exponentiel (**)Opérateur exponentiel (**)

Opérateurs en PL/SQL

Exemples

••Incrément de l’indice d’une boucle.Incrément de l’indice d’une boucle.

                       v_countv_count :=:= v_count + 1; v_count + 1;

••Initialisation de valeur pour unInitialisation de valeur pour unindicateur booléen.indicateur booléen.

                       v_equalv_equal :=:= (v_n1 = v_n2); (v_n1 = v_n2);

••Test de la valeur d’un numéroTest de la valeur d’un numérod’employéd’employév_validv_valid :=:= (v_empno IS NOT NULL); (v_empno IS NOT NULL);

Accès aux données

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Ordres SQL en PL/SQL

••Consultation par SELECT :Consultation par SELECT : une seuleune seule ligne peut être retournée.ligne peut être retournée.

••Modification des données par les ordresModification des données par les ordresde manipulation INSERT, UPDATEde manipulation INSERT, UPDATEDELETE.DELETE.

••Contrôle des transactions par COMMIT, Contrôle des transactions par COMMIT, ROLLBACK, ou SAVEPOINT.ROLLBACK, ou SAVEPOINT.

••Curseur implicite.Curseur implicite.

Consultation de la base de données. Syntaxe

SELECT SELECT liste de projectionliste de projection

INTOINTO {{nom variablenom variable[[,,nom variablenom variable]]

| | nom enregistrementnom enregistrement}}

FROMFROM tabletable

WHEREWHERE conditioncondition;;

Utilisation de la clause : INTO

Exemple

DECLAREDECLARE v_deptno NUMBER(2);v_deptno NUMBER(2);

v_locv_loc VARCHAR2(15);VARCHAR2(15);

BEGINBEGIN

SELECTSELECT deptno, locdeptno, loc

    INTOINTO v_deptno, v_locv_deptno, v_loc

    FROMFROM  deptdept

WHEREWHERE dname = 'SALES';   dname = 'SALES';  

END;END;

Exemple

Montant total des salaires des employés d ’un département

DECLARE    DECLARE    v_sum_salv_sum_sal %TYPE; %TYPE;

v_deptnov_deptno NUMBER NOT NULL := 10;           NUMBER NOT NULL := 10;          

BEGINBEGIN

SELECTSELECT SUM(sal)  SUM(sal)  -- fonction de groupe-- fonction de groupe

     INTOINTO v_sum_salv_sum_sal

     FROMFROM   empemp

WHEREWHERE  deptno = v_deptno;deptno = v_deptno; END;END;

Mise à jour des données

Utilisation des ordres  :

••INSERTINSERT

••UPDATEUPDATE

••DELETEDELETE

Ajout de données

Exemple

Ajout d ’un nouvel employé dans la table EMP.

BEGINBEGIN

INSERT INTO emp(empno, ename, job, deptno)INSERT INTO emp(empno, ename, job, deptno)

VALUES(empno_sequence.NEXTVAL, 'HARDING',VALUES(empno_sequence.NEXTVAL, 'HARDING', 'CLERK', 10);'CLERK', 10); END;END;

Modification de données

Exemple

Modification de la valeur du salaire des employés 'ANALYST'.

 

Suppression de données

Exemple

Supprimer les employés d’un département .

DECLAREDECLARE v_deptno   emp.deptno%TYPE := 10;               v_deptno   emp.deptno%TYPE := 10;              

BEGINBEGIN

DELETE FROMDELETE FROM empemp

WHERE deptno = v_deptno;WHERE deptno = v_deptno; END;END;

Ordres COMMIT et ROLLBACK

••Début de transaction : premier ordreDébut de transaction : premier ordre

LMD.LMD.

••Fin de transaction explicite : COMMITFin de transaction explicite : COMMITou ROLLBACK.ou ROLLBACK.

Accès multilignes

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Curseur SQL

••Zone de travail privée.Zone de travail privée.

••Deux types de curseurs :Deux types de curseurs :

–– ImpliciteImplicite

–– Explicite (déclaré)Explicite (déclaré)

••Toute exécution d’ordre SQL utilise unToute exécution d’ordre SQL utilise uncurseur.curseur.

••Un code statut est positionné à la finUn code statut est positionné à la find ’exécution de l’ordre SQL.d ’exécution de l’ordre SQL.

Curseur IMPLICITE - Statut

Positionné à la fin d’exécution de l’ordre. 

SQL%ROWCOUNT

Nombre de lignes traitées (entier)

SQL%FOUND

positionné à VRAI si l’ordre a traité une ou plusieurs lignes

SQL%NOTFOUND

positionné à VRAI si l’ordre n ’a traité de ligne

C. Bonnet / R. ChapuisC. Bonnet / R. Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 50

Curseur IMPLICITE - Statut

Exemple

Affichage du nombre de lignes supprimées.

 

VARIABLE rows_deleted VARCHAR2(30)

DECLARE v_ordid  NUMBER := 605;

BEGIN

DELETE FROM  item

WHERE ordid = v_ordid;

:rows_deleted := (SQL%ROWCOUNT ||

' rows deleted.');

END;

/

PRINT rows_deleted

 

Structures de contrôle

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Structures de contrôle

Deux structures :

Alternative

Répétitive.

Structures de contrôle

STRUCTURE ALTERNATIVE

Instruction IF Trois formes  :

••IF-THEN-END IFIF-THEN-END IF

••IF-THEN-ELSE-END IFIF-THEN-ELSE-END IF

••IF-THEN-ELSIF-END IFIF-THEN-ELSIF-END IF

Instruction IF

Syntaxe

IF IF conditionconditionTHENTHEN instructionsinstructions;;

[[ELSIF ELSIF conditionconditionTHENTHEN instructionsinstructions;];]

[[ELSEELSE instructionsinstructions;];] END IF;END IF;

Exemple :

N° manager  = 22 si nom employé = Osborne.

IF v_ename = 'OSBORNE' THEN IF v_ename = 'OSBORNE' THEN v_mgr := 22;v_mgr := 22;

END IF; END IF;

Instruction

IF-THEN-ELSE

 

Instruction IF-THEN-ELSE Exemple

IF v_shipdate - v_orderdate < 5 THEN  IF v_shipdate - v_orderdate < 5 THEN  v_ship_flag := 'Acceptable';v_ship_flag := 'Acceptable';

ELSEELSE v_ship_flag := 'Unacceptable';v_ship_flag := 'Unacceptable'; END IF;END IF;

Instruction IF-THEN-ELSIF

 

Instruction IF-THEN-ELSIF

Exemple

. . .. . .

IF v_start > 100 THENIF v_start > 100 THEN v_start := 2 * v_start;v_start := 2 * v_start;

ELSIF v_start >= 50 THEN              ELSIF v_start >= 50 THEN              v_start := .5 * v_start;v_start := .5 * v_start;

ELSEELSE v_start := .1 * v_start;v_start := .1 * v_start; END IF;END IF; . . .. . .

Structure répétitive

••Une  boucle répète uneUne  boucle répète uneinstructioninstructionououuneuneséquence d’instructionsséquence d’instructionsplusieursplusieursfois.fois.

••Trois possibilités :Trois possibilités :

–– instruction LOOPinstruction LOOP

–– Instruction FORInstruction FOR

–– instruction WHILEinstruction WHILE

Instruction Loop

Syntaxe

LOOP                      LOOP                     -- début de boucleinstruction(s)instruction(s);;-- instructions

         . . .. . .                  -- EXIT instruction

EXIT [WHEN EXIT [WHEN conditioncondition]];;

END LOOP;END LOOP;              -- fin de boucle

Instruction Loop

Exemple

DECLAREDECLARE v_ordidv_ordid item.ordid%TYPE := 601;item.ordid%TYPE := 601; v_counter NUMBER(2) := 1;v_counter NUMBER(2) := 1;

BEGINBEGIN

LOOPLOOP

INSERT INTO item(ordid, itemid)   INSERT INTO item(ordid, itemid)  

VALUES(v_ordid, v_counter);VALUES(v_ordid, v_counter); v_counter := v_counter + 1;v_counter := v_counter + 1;

EXIT WHEN v_counter > 10;EXIT WHEN v_counter > 10; END LOOP;END LOOP; END;END;

Instruction FOR

Syntaxe

FOR FOR indiceindicein [REVERSE]in [REVERSE] borne-inférieure..borne-supérieureborne-inférieure..borne-supérieureLOOP  LOOP  instruction 1instruction 1;; instruction 2instruction 2;; . . .. . .

END LOOP;END LOOP;

••Le nombre de répétitions est contrôléLe nombre de répétitions est contrôlépar l’indice.par l’indice.

••Ne pas déclarer l’indice, sa déclarationNe pas déclarer l’indice, sa déclarationest implicite.est implicite.

Instruction FOR

Règles :

••L’indice n’est utilisable qu’à l’intérieur deL’indice n’est utilisable qu’à l’intérieur dela boucle.la boucle.

••Il est interdit d’affecter une valeur àIl est interdit d’affecter une valeur àl’indice.l’indice.

Instruction FOR

Exemple

Création de 10 lignes pour la commande de n° 601.

DECLAREDECLARE v_ordidv_ordid item.ordid%TYPE := 601;item.ordid%TYPE := 601;

BEGINBEGIN

FOR i IN 1..10 LOOPFOR i IN 1..10 LOOP

INSERT INTO item(ordid, itemid)   INSERT INTO item(ordid, itemid)   VALUES(v_ordid, i);VALUES(v_ordid, i); END LOOP;END LOOP; END;END;

Instruction WHILE

Syntaxe

WHILE WHILE conditionconditionLOOPLOOPLa conditioninstruction 1instruction 1;;est évaluée

instruction2instruction2;;           en début

              . . .. . .                        de boucle.

END LOOP;END LOOP;

Les instructions de la boucle sont répétées tant que la condition est vraie.

Instruction WHILE

Exemple

ACCEPT p_new_order PROMPT 'ACCEPT p_new_order PROMPT 'Enter the order number: 'Enter the order number: ' ACCEPT p_items -ACCEPT p_items -

PROMPT 'Enter the number of items in this order: ' PROMPT 'Enter the number of items in this order: ' DECLAREDECLARE

v_countv_count NUMBER(2) := 1;NUMBER(2) := 1;

BEGINBEGIN

WHILE v_count <= &p_items LOOPWHILE v_count <= &p_items LOOP

INSERT INTO item (ordid, itemid)INSERT INTO item (ordid, itemid) VALUES (&p_new_order, v_count);VALUES (&p_new_order, v_count); v_count := v_count + 1;v_count := v_count + 1;

END LOOP;END LOOP;

COMMIT;COMMIT;

END;END;

//

Structures imbriquées et étiquettes

••Plusieurs niveaux d’imbricationPlusieurs niveaux d’imbricationpossibles.possibles.

••Utiliser des étiquettes pour différencierUtiliser des étiquettes pour différencierBLOC et Structure imbriquées.BLOC et Structure imbriquées.

••Possibilité de sortir d’une bouclePossibilité de sortir d’une boucleinterne par l ’ordre EXIT.interne par l ’ordre EXIT.

Structures imbriquées et étiquettes

BEGINBEGIN

<<<<Boucle-externeBoucle-externe>>>>

LOOPLOOP v_counter := v_counter+1;v_counter := v_counter+1;

EXIT WHEN v_counter>10;EXIT WHEN v_counter>10;

<<<<Boucle-interneBoucle-interne>>>>

LOOPLOOP

EXIT EXIT Boucle-externe WHEN prédicat;Boucle-externeWHEN prédicat;

----Sortie des deux bouclesSortie des deux boucles

EXIT WHEN EXIT WHEN prédicat;prédicat;

----sortie de la boucle interne uniquementsortie de la boucle interne uniquement

END LOOP END LOOP boucle-interne;boucle-interne;

END LOOP END LOOP Boucle-externe;Boucle-externe; END;      END;     

Utilisation des Types Structurés :

Enregistrement

Tableau

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Types Structurés

••Deux types:Deux types:

–– Enregistrement (RECORD)Enregistrement (RECORD)

–– Tableau (TABLE PL/SQL)Tableau (TABLE PL/SQL)

••Contiennent des composants internesContiennent des composants internes

••Sont réutilisablesSont réutilisables

Enregistrement PL/SQL

••Peut contenir un ou plusieurs composantsPeut contenir un ou plusieurs composantsde type : scalaire, RECORD ou TABLEde type : scalaire, RECORD ou TABLEPL/SQL.PL/SQL.

••Identique à la structure enregistrement enIdentique à la structure enregistrement enL3G.L3G.

••Différent de la notion de ligne de tableDifférent de la notion de ligne de tablerelationnelle.relationnelle.

••Considère un ensemble de champsConsidère un ensemble de champscomme une unité logique.comme une unité logique.

••Peut être utilisé pour recevoir une ligne dePeut être utilisé pour recevoir une ligne detable.table.



Déclaration d’un type  Enregistrement

Syntaxe

TYPE nom_TYPE nom_typetypeIS RECORD IS RECORD -- déclaration de type-- déclaration de type((déclaration de champ[, déclaration de champ]…);déclaration de champ[, déclaration de champ]…); nom_variable nom_type;nom_variable nom_type;----déclaration de variabledéclaration de variable

Avec déclaration de champ :

Nom_champ {type_champ Nom_champ {type_champ||variable%TYPE variable%TYPE

||table.colonne%TYPE table.colonne%TYPE ||table%ROWTYPE}table%ROWTYPE}

[[[[NOT NULL] {:= | DEFAULT} NOT NULL] {:= | DEFAULT} expressionexpression]] 

Déclaration d’un type  Enregistrement

Exemple

Déclaration d ’une variable pour stocker  nom, emploi, et salaire d’un  employé.

TYPE emp_record_type IS RECORDTYPE emp_record_type IS RECORD

((enameename VARCHAR2(10),VARCHAR2(10), job job   VARCHAR2(9),VARCHAR2(9),

                                             salsal NUMBER(7,2));NUMBER(7,2));

emp_recordemp_record   emp_record_type;emp_record_type;

Utilisation de %ROWTYPE

••Permet de déclarer une variable dePermet de déclarer une variable demême structure qu’une ligne de  tablemême structure qu’une ligne de  tableou de vue.ou de vue.

••Nom_table%ROWTYPE.Nom_table%ROWTYPE.

••Les champs de l’enregistrement ontLes champs de l’enregistrement ontmême nom et même type que ceux desmême nom et même type que ceux descolonnes de la table ou de la vue.colonnes de la table ou de la vue.

Utilisation de %ROWTYPE

Exemples

Déclarer une variable pour stocker la même information que celle définie dans la table DEPT.

     dept_recorddept_record dept%ROWTYPE;        dept%ROWTYPE;       

Déclare une variable pour stocker la même information que celle définie dans la table EMP.

       emp_recordemp_record emp%ROWTYPE;        emp%ROWTYPE;       

Avantage de %ROWTYPE

••Il n ’est pas nécessaire de connaître lesIl n ’est pas nécessaire de connaître lescaractéristiques des colonnes de lacaractéristiques des colonnes de laligne de référence .ligne de référence .

••Mise à jour automatique en cas deMise à jour automatique en cas demodification de la structure de la lignemodification de la structure de la lignede référence.de référence.

••Utilisable avec SELECT pour recueillirUtilisable avec SELECT pour recueillirles données d’une ligne.les données d’une ligne.

Tables PL/SQL

•• Composé de postes identiques de type :Composé de postes identiques de type :

–– ScalaireScalaire

–– EnregistrementEnregistrement

••Référence à un poste par clé primaireRéférence à un poste par clé primaire

((PRIMARY KEY) de typePRIMARY KEY) de type

BINARY_INTEGERBINARY_INTEGER

Déclaration d’un type Table

Syntaxe - poste de type scalaire

TYPE nom_TYPE nom_typetypeIS TABLE OF IS TABLE OF

{{type_colonne | variable%TYPEtype_colonne | variable%TYPE

| table.colonne%TYPE} [NOT NULL] | table.colonne%TYPE} [NOT NULL]

INDEX BY BINARY_INTEGER;INDEX BY BINARY_INTEGER; nom_variable nom_type;nom_variable nom_type;

Exemple

Déclarer une table de noms.

TYPE nom_table_type ISTYPE nom_table_type IS TABLE OF emp.ename%TYPE TABLE OF emp.ename%TYPE

INDEX BY BINARY_INTEGER;INDEX BY BINARY_INTEGER; table_nom  nom_table_type;table_nom  nom_table_type;

Structure Table PL/SQL

                                                                                    Clé primaire                 Colonne

 

                                                                       BINARY_INTEGER             Scalaire

Création d’une Table PL/SQL

DECLAREDECLARE

TYPE ename_table_type IS TABLETYPE ename_table_type IS TABLE OF emp.ename%TYPE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;INDEX BY BINARY_INTEGER;

TYPE hiredate_table_type IS TABLE OF DATETYPE hiredate_table_type IS TABLE OF DATE

INDEX BY BINARY_INTEGER;INDEX BY BINARY_INTEGER; ename_tableename_table ename_table_type;ename_table_type; hiredate_table hiredate_table_type;hiredate_table hiredate_table_type;

BEGINBEGIN ename_table(1) := 'CAMERON';ename_table(1) := 'CAMERON'; hiredate_table(8) := SYSDATE + 7;hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THENIF ename_table.EXISTS(1) THEN INSERT INTO INSERT INTO

END;END;

Méthodes PL/SQL associées à la structure Table

Méthodes fournies en standard :

••EXISTSEXISTS

••COUNTCOUNT

••FIRST, LASTFIRST, LAST

••PRIORPRIOR

••NEXTNEXT

••EXTENDEXTEND

••TRIMTRIM

••DELETEDELETE

Table d’enregistrements

Syntaxe - poste de type enregistrement

••Utilisation de  %ROWTYPE.Utilisation de  %ROWTYPE.

Exemple

••Déclarer une variable pour recevoir lesDéclarer une variable pour recevoir lesdonnées de la table DEPT.données de la table DEPT.

DECLAREDECLARE

TYPE dept_table_type IS TABLE OF dept%ROWTYPETYPE dept_table_type IS TABLE OF dept%ROWTYPE

INDEX BY BINARY_INTEGER;INDEX BY BINARY_INTEGER; dept_table dept_table_type;dept_table dept_table_type;

CURSEUR Explicite

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Curseur

Tout ordre SQL utilise un curseur pour s’exécuter :

••curseur implicitecurseur implicite

–– tout ordre LMD (DML)tout ordre LMD (DML)

–– SELECT … INTO sous PL/SQLSELECT … INTO sous PL/SQL

••curseur explicitecurseur explicite

–– déclaré dans un moduledéclaré dans un module

Structure (simplifiée) du curseur

Lignes sélectionnées

7369     SMITH

CLERK

 

7566     JONES

 

MANAGER

 
 

7788     SCOTT

 
 

ANALYST

 
 

7876         ADAMS

CLERK

 

7902     FORD

ANALYST

 
   

                                                                                                                               Ligne Courante

Mise en œuvre curseur explicite

 

DéclarationOuvertureDistributionTesteLibération requête et ligne existence du curseur

SQL                      exécution       courante          ligne

Mise en œuvre curseur explicite

Ouverture curseur.

 Pointeur

Distribution ligne courante.

   

Déclaration du curseur

Syntaxe

CURSOR CURSOR nom_curseur nom_curseur ISIS requête;requête;

••Requête sans clause INTO.Requête sans clause INTO.

••Possibilité de clause ORDER BY.Possibilité de clause ORDER BY.

Déclaration du curseur

Exemple

DECLAREDECLARE

CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno, enameSELECT empno, ename

FROM emp;FROM emp;

BEGINBEGIN

Ouverture du curseur

Syntaxe

OPENOPEN nom_curseurnom_curseur;;

••Exécution de la requête et générationExécution de la requête et générationdes lignes résultats au niveau dudes lignes résultats au niveau duserveur.serveur.

••Pas d’erreur si la requête ne sélectionnePas d’erreur si la requête ne sélectionnepas de ligne.pas de ligne.

••Possibilité de tester le statut du curseurPossibilité de tester le statut du curseuraprès exécution de l’ordre FETCH.après exécution de l’ordre FETCH.

Distribution des lignes

Syntaxe

FETCHFETCHnom_curseur nom_curseur INTO [INTO [variable1, variable2, variable1, variable2, ]]

| [nom_enregistrement| [nom_enregistrement]];   ;  

••Distribue les valeurs des colonnes de laDistribue les valeurs des colonnes de laligne courante dans les variables deligne courante dans les variables deréception.réception.

••Effectue une correspondance parEffectue une correspondance parposition.position.

••Renvoie un code statut.Renvoie un code statut.

Mise en œuvre de l ’ordre FETCH

••Inclure l ’ordre FETCH dans uneInclure l ’ordre FETCH dans unestructure répétitive.structure répétitive.

••Une ligne est distribuée à chaqueUne ligne est distribuée à chaqueitération.itération.

••Utiliser %NOTFOUND ou %FOUND pourUtiliser %NOTFOUND ou %FOUND pourcontrôler la sortie de la boucle.contrôler la sortie de la boucle.

Distribution des lignes

Exemples

FETCH emp_cursor INTO v_empno, v_ename;FETCH emp_cursor INTO v_empno, v_ename;

OPEN nom_curseurOPEN nom_curseur;;

LOOPLOOP

FETCH FETCH nom_curseurnom_curseurINTO INTO variablesvariablesEXIT WHENEXIT WHENnom_curseurnom_curseur%NOTFOUND%NOTFOUND ; ;

----utilisation des valeurs distribuées àutilisation des valeurs distribuées à chaque itérationchaque itération

END LOOPEND LOOP;;

Fermeture du curseur

Syntaxe

                       CLOSECLOSE nom_curseurnom_curseur;                    ;                    

••Ferme le curseur et libère lesFerme le curseur et libère lesressources.ressources.

••Possibilité de ré-ouvrir le mêmePossibilité de ré-ouvrir le mêmecurseur.curseur.

Codes statut d'un curseur

Informent sur l’état du curseur.

Code

                        Mnémonique      Type          Description

                        %ISOPEN           Booléen     VRAI si le curseur est ouvert

%NOTFOUND                       Booléen VRAI si le dernier ordre  fetch exécuté n’a pas distribué de ligne

                        %FOUND            Booléen VRAI si le dernier ordre fetch

exécuté a distribué une ligne

- complément de %NOTFOUND

                        %ROWCOUNT          Nombre      Nombre de lignes distribuées

%ISOPEN

••La distribution de ligne ne s’effectueLa distribution de ligne ne s’effectueque pour un curseur ouvert.que pour un curseur ouvert.

••Permet de savoir si un curseur estPermet de savoir si un curseur estouvert avant d’exécuter un ordre fetch.ouvert avant d’exécuter un ordre fetch.

Exemple

IF NOT emp_cursor%ISOPEN THENIF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor;OPEN emp_cursor;

END IF;END IF;

LOOPLOOP

FETCH emp_cursor FETCH emp_cursor

NOTFOUND ROWCOUNT et FOUND

•• %ROWCOUNT donne, après chaque%ROWCOUNT donne, après chaque

exécution de l’ordre fetch, le nombre deexécution de l’ordre fetch, le nombre delignes distribuées.lignes distribuées.

••%NOTFOUND indique la fin de%NOTFOUND indique la fin dedistribution des lignes d’un curseur.distribution des lignes d’un curseur.

••%FOUND testé après exécution du%FOUND testé après exécution dupremier ordre fetch indique si la requêtepremier ordre fetch indique si la requêtea sélectionné au moins une ligne.a sélectionné au moins une ligne.

Curseur et Enregistrement

Distribution des données de la ligne dans une structure RECORD.

Exemple

DECLARE DECLARE

CURSORCURSOR emp_cursor ISemp_cursorIS SELECT empno, enameSELECT empno, ename

                                            FROMFROM emp;emp;

emp_recordemp_record emp_cursor%ROWTYPE;emp_cursor%ROWTYPE;

BEGINBEGIN

OPENOPEN emp_cursor;emp_cursor;

LOOPLOOP

FETCHFETCH emp_cursor INTO emp_record;emp_cursorINTOemp_record;

Curseur et Enregistrement - utilisation de For -

Syntaxe

FOR FOR nom_enregistrementnom_enregistrementIN IN nom_curseurnom_curseurLOOP   LOOP   instruction1instruction1;;instruction2instruction2;; . . .. . .



END LOOP;END LOOP;

•• Raccourci pour gérer la distribution desRaccourci pour gérer la distribution deslignes.lignes.

•• Exécute toutes les étapes (open, fetch,Exécute toutes les étapes (open, fetch,close).close).

•• Déclaration implicite de l’enregistrement.Déclaration implicite de l’enregistrement.

Curseur et Enregistrement - utilisation de For -

Exemple

DECLAREDECLARE

CURSOR emp_cursor ISCURSOR emp_cursor IS SELECT ename, deptnoSELECT ename, deptno

FROM emp;FROM emp;

BEGINBEGIN

FOR emp_record IN emp_cursor LOOPFOR emp_record IN emp_cursor LOOP

----open et fetch implicitesopen et fetch implicites

IF emp_record.deptno = 30 THENIF emp_record.deptno = 30 THEN

END LOOP; -- close impliciteEND LOOP; -- close implicite END;END;

Curseur paramétré

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Curseur avec paramètre(s)

Syntaxe

CURSOR CURSOR nom_curseurnom_curseur

[([(mon_paramètre typemon_paramètre type, )], )]

ISIS requêterequête;;

•    Affectation des valeurs des paramètres lors de l’ouverture du curseur.

•    Le même curseur peut être ouvert plusieurs fois avec des valeurs de paramètres différentes.

Curseur avec paramètre(s)

Exemple

Donner le n° département et l’emploi sous forme de paramètres pour la clause WHERE. 

DECLAREDECLARE

CURSOR emp_cursor CURSOR emp_cursor

((v_deptno NUMBER, v_job VARCHAR2) ISv_deptno NUMBER, v_job VARCHAR2) IS

SELECTSELECT empno, enameempno, ename

                                       FROMFROM  empemp

                                     WHEREWHERE deptno = v_deptno deptno = v_deptno

                                            AND AND job = v_job;job = v_job;

BEGINBEGIN

OPEN emp_cursor(10, 'CLERK');OPEN emp_cursor(10, 'CLERK');

Mise à jour avec utilisation d’un curseur

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Clause  FOR UPDATE

Syntaxe

SELECT SELECT

                    FROMFROM     

FOR UPDATE [OF FOR UPDATE [OF nom_colonnenom_colonne][][NOWAIT];NOWAIT];

••Verrouille les lignes sélectionnées pourVerrouille les lignes sélectionnées pourla durée de la transaction.la durée de la transaction.

••Verrouille les lignes avant l’exécutionVerrouille les lignes avant l’exécutiond ’un ordre update ou delete.d ’un ordre update ou delete.

Clause FOR UPDATE

Exemple

Sélectionner les employés du département 30.

DECLAREDECLARE

CURSOR emp_cursor IS CURSOR emp_cursor IS

SELECT empno, ename, sal SELECT empno, ename, sal

FROM empFROM emp

WHERE deptno = 30WHERE deptno = 30 FOR UPDATE NOWAIT;FOR UPDATE NOWAIT;

Clause WHERE CURRENT OF

Syntaxe

WHERE CURRENT OF nom_WHERE CURRENT OF nom_curseur;curseur;

•    Curseur en vue de modifier ou supprimer les lignes sélectionnées.

•    Utiliser la clause FOR UPDATE dans l’expression du curseur.

•    Utiliser la clause WHERE CURRENT OF pour faire référence à la dernière ligne distribuée par le curseur.

Clause WHERE CURRENT OF

Exemple

DECLAREDECLARE

CURSOR sal_cursor ISCURSOR sal_cursor IS

SELECT salSELECT sal

                                         FROMFROM  empemp

                                      WHEREWHERE deptno = 30deptno = 30

FOR UPDATE of sal NOWAIT;FOR UPDATE of sal NOWAIT;

BEGINBEGIN

FOR emp_record IN sal_cursor LOOPFOR emp_record IN sal_cursor LOOP

UPDATEUPDATE empemp

                                         SET SET sal = * 1.10sal = * 1.10

WHERE CURRENT OF sal_cursor;WHERE CURRENT OF sal_cursor;

END LOOP;END LOOP;

COMMIT;COMMIT; END;END;

Gestion des exceptions

C. Bonnet  / R. ChapuisC. Bonnet  / R. Chapuis   Cours PL/SQL d’après cours ORACLE - OAI

Gestion des exceptions en PL/SQL

••Exception ?Exception ?

–– Tout événement qui survient pendantTout événement qui survient pendantl’exécution d ’un ordre.l’exécution d ’un ordre.

••Différents casDifférents cas

–– Erreur diagnostiquée par le SGBDR.Erreur diagnostiquée par le SGBDR.

–– Événement généré par le développeur.Événement généré par le développeur.

••GestionsGestions

–– Capture dans le module qui l’a détectée.Capture dans le module qui l’a détectée.

–– Propagation à l’environnement.Propagation à l’environnement.

Gestion des exceptions en PL/SQL

                       Capture de l’exception       Propagation de l’exception

Création de Création de l’exceptionl’exception

Capture de L’exception l’exceptionn’est pas

capturée

Exception propagée à l’environnement

Types d’Exceptions

••Erreur émise par le serveurErreur émise par le serveur

–– PrédéfiniesPrédéfinies

–– Non prédéfiniesNon prédéfinies

••Exception générée par l’utilisateurException générée par l’utilisateur

Capture des Exceptions

Syntaxe

EXCEPTIONEXCEPTION

WHEN WHEN exception1exception1[[OR OR exception2exception2. . .] THEN. . .] THEN instruction1instruction1;; instruction2instruction2;; . . .. . .

[[WHEN WHEN exception3exception3[[OR OR exception4exception4. . .] THEN. . .] THEN instruction1instruction1;; instruction2instruction2;;

. . .]. . .]

[[WHEN OTHERS THENWHEN OTHERS THEN instruction1instruction1;; instruction2instruction2;;

. . .]. . .]

Capture des Exceptions

••WHEN OTHERS est la dernière clause.WHEN OTHERS est la dernière clause.

••Le mot clé EXCEPTION introduit laLe mot clé EXCEPTION introduit lasection de gestion des exceptions.section de gestion des exceptions.

••Plusieurs gestionnaires d’exceptionPlusieurs gestionnaires d’exceptionpeuvent être définis dans un mêmepeuvent être définis dans un mêmebloc.bloc.

••Un seul gestionnaire d’exception estUn seul gestionnaire d’exception estexécutée suite à la détection d ’uneexécutée suite à la détection d ’uneexception, avant de sortir du bloc.exception, avant de sortir du bloc.

Exceptions serveur prédéfinies

••Erreur émise par le serveur.Erreur émise par le serveur.

••Repérable par unRepérable par un nom-erreur.nom-erreur.

••Exemple deExemple de nom-erreurs prédéfinies:nom-erreursprédéfinies:

–– NO_DATA_FOUNDNO_DATA_FOUND

–– TOO_MANY_ROWSTOO_MANY_ROWS

–– INVALID_CURSORINVALID_CURSOR

–– ZERO_DIVIDEZERO_DIVIDE

–– DUP_VAL_ON_INDEXDUP_VAL_ON_INDEX

Utilisation des nom-erreurs

Syntaxe

 

Exception serveur non prédéfinie

 

DéclarationAssociation àCapture de  d’un nom l’erreur l’exception

d’exception

Exception serveur non prédéfinie

Déclaration d’un nom-erreur pour l’erreur n° -2292 (intégrité référentielle).

DECLAREDECLARE e_emps_remaining EXCEPTION;e_emps_remaining    EXCEPTION;e_emps_remaining EXCEPTION;1

PRAGMA EXCEPTION_INIT (PRAGMA EXCEPTION_INIT (PRAGMA EXCEPTION_INIT (

                         e_emps_remaining, -2292);e_emps_remaining, -2292);e_emps_remaining, -2292);2

                v_deptnov_deptno      dept.deptno%TYPE := &p_deptno;dept.deptno%TYPE := &p_deptno;

BEGINBEGIN

DELETE FROM deptDELETE FROM dept

                       WHEREWHERE deptno = v_deptno;deptno = v_deptno;

COMMIT;COMMIT;

EXCEPTIONEXCEPTION

WHEN WHEN e_emps_remaining THENe_emps_remaining THEN               3

DBMS_OUTPUT.PUT_LINE ( ’DBMS_OUTPUT.PUT_LINE ( ’Suppression imposssibleSuppression imposssible ' ||TO_CHAR(v_deptno) || '.');' ||TO_CHAR(v_deptno) || '.');  Existence d’employés. Existence d’employés.

END;END;

 

Syntaxe

DECLAREDECLAREnom-exceptionnom-exception EXCEPTION;EXCEPTION;

BEGINBEGIN

…;…;

RAISE RAISE nom-exception;nom-exception;

; ;

EXCEPTIONEXCEPTION

WHEN WHEN nom-exception THENnom-exceptionTHEN

; ; END;END;

Exemple

DECLAREDECLARE e_invalid_product EXCEPTION;e_invalid_product  EXCEPTION;e_invalid_product EXCEPTION;  1

BEGINBEGIN

UPDATEUPDATE productproduct

     SETSET descrip = '&product_description'descrip = '&product_description'

WHEREWHERE prodid = &product_number;prodid = &product_number;

IF SQL%NOTFOUND THENIF SQL%NOTFOUND THEN

          RAISE e_invalid_product;RAISE e_invalid_product;RAISE e_invalid_product;      2

END IF;END IF;

COMMIT;COMMIT;

EXCEPTIONEXCEPTION

  WHEN e_invalid_product  THENWHEN e_invalid_product  THENe_invalid_product        3

DBMS_OUTPUT.PUT_LINE(‘ N°DBMS_OUTPUT.PUT_LINE(‘ N°produit inconnu.');produit inconnu.'); END;END;

Procédure

RAISE_APPLICATION_ERROR

Syntaxe

raise_application_error (raise_application_error (numéro-erreur,numéro-erreur,

messagemessage[[, {TRUE | FALSE}]);, {TRUE | FALSE}]);

••Permet de définir une erreur (numéroPermet de définir une erreur (numéro

[[entre -20000 etentre -20000 et-20999]-20999]et texte du message)et texte du message)dans un bloc PL/SQL.dans un bloc PL/SQL.

••Utilisable dans les sections de codeUtilisable dans les sections de coded’un bloc PL/SQL.d’un bloc PL/SQL.

Procédure RAISE_APPLICATION_ERROR

••Utilisable :Utilisable :

–– dans la section Exécutiondans la section Exécution

–– dans la section Exceptiondans la section Exception

••La génération de l’erreur est conformeLa génération de l’erreur est conformeau standard du serveur et est traitableau standard du serveur et est traitablecomme telle.comme telle.

Procédure

RAISE_APPLICATION_ERROR

Exemple

……

EXCEPTIONEXCEPTION

WHEN NO_DATA_FOUND THENWHEN NO_DATA_FOUND THEN

RAISE_APPLICATION_ERROR (-20201,RAISE_APPLICATION_ERROR (-20201,

‘ Ligne NON trouvée ’);‘ Ligne NON trouvée ’);

END;END;

Informations associées à toute erreur

••SQLCODESQLCODE

Valeur numérique de l’erreurValeur numérique de l’erreur

••SQLERRMSQLERRM

Texte du message associé à l’erreurTexte du message associé à l’erreur

Informations associées à une exception serveur

DECLARE v_error_code      NUMBER; v_error_message   VARCHAR2(255); BEGIN EXCEPTION

WHEN OTHERS THEN ROLLBACK;

v_error_code := SQLCODE ; v_error_message := SQLERRM ;

 

INSERT INTO errors VALUES(v_error_code, v_error_message); END;

Propagation d’une exception

DECLARE . . .

e_no_rows exception; e_integrity exception;

PRAGMA EXCEPTION_INIT (e_integrity, -2292);

BEGIN

FOR c_record IN emp_cursor LOOP

BEGIN SELECT

Un bloc peut gérer ses         UPDATE

exceptions ou lesIF SQL%NOTFOUND THENRAISE e_no_rows;transmettre au bloc deEXCEPTIONEND IF;niveau supérieur.WHEN e_integrity THEN WHEN e_no_rows THEN

END;

END LOOP;

EXCEPTION

WHEN NO_DATA_FOUND THEN . . .

WHEN TOO_MANY_ROWS THEN . . .

END;


853