P. 1
pl-sql

pl-sql

|Views: 121|Likes:
Published by romario5962

More info:

Published by: romario5962 on May 14, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

03/09/2013

pdf

text

original

PL / SQL

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI

Généralités - PL/SQL
• PL/SQL est une extension procédurale • PL/SQL est une extension procédurale du langage SQL. du langage SQL. • Possibilité d ’inclure des requêtes et • Possibilité d ’inclure des requêtes et des ordres de manipulation des des ordres de manipulation des données à ll ’intérieur d ’une structure données à ’intérieur d ’une structure algorithmique. algorithmique.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 2

Intérêts du PL/SQL
Amélioration des Performances Amélioration des Performances
SQL SQL SQL SQL

Application Application

Noyau Noyau

Application Application

SQL IF...THEN SQL ELSE SQL END IF; SQL

Noyau Noyau

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 3

Bonnet // R. C. Bonnet R.OAI / 4 . Chapuis Cours PL/SQL d’après cours ORACLE .Intérêts du PL/SQL Développement MODULAIRE Développement MODULAIRE DECLARE BEGIN EXCEPTION END. Chapuis C.

• Gestion des erreurs • Gestion des erreurs C. Chapuis C. Bonnet R. • Utilisation de variables. • Portabilité. Bonnet // R. • Structures de contrôle.Intérêts du PL/SQL • Portabilité. Chapuis Cours PL/SQL d’après cours ORACLE . • Utilisation de variables.OAI / 5 . • Structures de contrôle.

Bonnet R. curseurs. Bonnet // R. – Obligatoire END.PL/SQL Structure de BLOC •• •• •• •• DECLARE – Facultatif DECLARE – Facultatif – Variables. – Obligatoire BEGIN EXCEPTION END. curseurs. C. exceptions utilisateur utilisateur BEGIN – Obligatoire BEGIN – Obligatoire – Ordres SQL – Ordres SQL – Instructions PL/SQL – Instructions PL/SQL EXCEPTION – Facultatif EXCEPTION – Facultatif DECLARE – Actions ààexécuter en cas d ’erreur – Actions exécuter en cas d ’erreur END.OAI / 6 . exceptions – Variables. Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE .

BEGIN BEGIN SELECT nom-colonne SELECT nom-colonne INTO v_variable INTO v_variable FROM nom-table_. END. EXCEPTION EXCEPTION WHEN exception_nom-erreur THEN DECLARE WHEN exception_nom-erreur THEN . Chapuis Cours PL/SQL d’après cours ORACLE . v_variable VARCHAR2(5).. BEGIN END. Bonnet // R. Bonnet R. Chapuis C. FROM nom-table_. .OAI / 7 .. C. EXCEPTION END...Structure BLOC PL/SQL DECLARE DECLARE v_variable VARCHAR2(5).

BEGIN BEGIN --statements --statements [EXCEPTION] [EXCEPTION] END.Types de BLOC Anonyme [DECLARE] [DECLARE] Procédure PROCEDURE name PROCEDURE name IS IS BEGIN BEGIN --statements --statements [EXCEPTION] [EXCEPTION] END. [EXCEPTION] [EXCEPTION] END. Fonction FUNCTION name FUNCTION name RETURN datatype RETURN datatype IS IS BEGIN BEGIN --statements --statements RETURN value. C.OAI / 8 . END. Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R. RETURN value. END. END. Bonnet // R.

Chapuis C. C. Chapuis Cours PL/SQL d’après cours ORACLE .Utilisation d ’un BLOC Bloc Bloc Anonyme Anonyme Procédure/ Procédure/ fonction fonction Stockées Stockées Procédure/ Procédure/ fonction fonction applicative applicative Package Package procédure/ procédure/ fonction fonction DECLARE BEGIN EXCEPTION Déclencheur Déclencheur Applicatif Applicatif Déclencheur Déclencheur Base de Base de Données Données END.OAI / 9 . Bonnet R. Bonnet // R.

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

Bonnet // R.Utilisation des Variables en PL/SQL • Déclaration dans la section DECLARE.OAI / 11 . Bonnet R. • Déclaration dans la section DECLARE. exécution (ou à la déclaration). Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. • Affectation de valeurs dans la section • Affectation de valeurs dans la section exécution (ou à la déclaration). C. • Passage de valeurs pour les procédures • Passage de valeurs pour les procédures et fonctions. et fonctions.

Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. Bonnet // R.Large Object) – LOB (Grands Objets .OAI / 12 .Types de Variables • Variables PL/SQL : • Variables PL/SQL : – Scalaire – Scalaire – Structurée – Structurée – Référence – Référence – LOB (Grands Objets . Bonnet R.Large Object) • Variables de liens (Non PL/SQL) • Variables de liens (Non PL/SQL) C.

VARCHAR2(13) := 'Atlanta'. VARCHAR2(13) := 'Atlanta'. Bonnet // R. NUMBER(2) NOT NULL := 10. DATE. Exemples Exemples Declare Declare v_hiredate v_hiredate v_deptno v_deptno v_location v_location c_comm c_comm DATE. [{:= | DEFAULT} expression].OAI / 13 . NUMBER(2) NOT NULL := 10. Bonnet R. CONSTANT NUMBER := 1400. Chapuis Cours PL/SQL d’après cours ORACLE . C. CONSTANT NUMBER := 1400.Declaration des Variables PL/SQL Syntaxe Syntaxe Nom_variable [CONSTANT] type-donnée [NOT NULL] Nom_variable [CONSTANT] type-donnée [NOT NULL] [{:= | DEFAULT} expression]. Chapuis C.

'DD-MON-99'). Bonnet // R.OAI / 14 . Affecter une date d’embauche.'DD-MON-99'). v_ename := 'Maduro'. v_hiredate := To_DATE(’03-JAN-2000'. Affecter un nom d ’’employé. Nom_variable := expr. Chapuis C. Bonnet R.Affectation de valeur Syntaxe Syntaxe Nom_variable := expr. Chapuis Cours PL/SQL d’après cours ORACLE . C. Affecter un nom d employé. v_hiredate := To_DATE(’03-JAN-2000'. Exemples Exemples Affecter une date d’embauche. v_ename := 'Maduro'.

Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE .Initialisation d’une variable Possible dans la section DECLARE par : Possible dans la section DECLARE par : • Opérateur d’affectation (:=) • Opérateur d’affectation (:=) • DEFAULT valeur • DEFAULT valeur • NOT NULL • NOT NULL Exemples: Exemples: v_mgr NUMBER(4) DEFAULT 7839 v_mgr NUMBER(4) DEFAULT 7839 v_loc VARCHAR2(50) NOT NULL := 'PARIS' v_loc VARCHAR2(50) NOT NULL := 'PARIS' C. Bonnet // R. Chapuis C.OAI / 15 .

Bonnet // R. décimales)] • DATE • DATE • CHAR [(longueur-maximale)] • CHAR [(longueur-maximale)] • LONG • LONG • LONG RAW • LONG RAW • BOOLEAN • BOOLEAN • BINARY_INTEGER • BINARY_INTEGER • PLS_INTEGER • PLS_INTEGER C.OAI / 16 . Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE . décimales)] • NUMBER [(précision.Type Scalaire • VARCHAR2 (longueur-maximale) • VARCHAR2 (longueur-maximale) VARCHAR VARCHAR • NUMBER [(précision. Bonnet R.

CONSTANT NUMBER(3. Chapuis C.OAI / 17 . Chapuis Cours PL/SQL d’après cours ORACLE . NUMBER(9.2) := 8.Déclarations de type scalaire Exemples Exemples v_job v_job v_count v_count v_total_sal v_total_sal v_orderdate v_orderdate c_tax_rate c_tax_rate v_valid v_valid VARCHAR2(9). NUMBER(9. BINARY_INTEGER := 0.25. DATE := SYSDATE + 7. C. BINARY_INTEGER := 0.2) := 8. Bonnet R. BOOLEAN NOT NULL := TRUE. BOOLEAN NOT NULL := TRUE.2) := 0. CONSTANT NUMBER(3.25.2) := 0. VARCHAR2(9). DATE := SYSDATE + 7. Bonnet // R.

Bonnet R.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. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. – Nom-table. • Utilisation du suffixe %TYPE après : • Utilisation du suffixe %TYPE après : – Nom-table. – Une autre variable déclarée. Bonnet // R. – Une colonne de table. – Nom-variable – Nom-variable C.nom-colonne.nom-colonne. – Une autre variable déclarée.OAI / 18 .

. NUMBER(7.. Bonnet R. . emp...OAI / 19 . emp. v_balance%TYPE := 10.2).ename%TYPE.ename%TYPE.Déclaration de type par référence Exemples Exemples .. v_ename v_ename v_balance v_balance v_min_balance v_min_balance . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.. C..2)... Chapuis C. NUMBER(7. v_balance%TYPE := 10.

Chapuis C. v_comm_sal BOOLEAN := (v_sal < v_comm).OAI / 20 . • Possibilité d’obtenir une valeur • Possibilité d’obtenir une valeur booléenne à partir d’une expression booléenne à partir d’une expression arithmétique ou chaîne de caractères. FALSE ou NULL. FALSE ou NULL. OR. Bonnet // R. Bonnet R. et NOT. • Opérateurs AND. et NOT. C. Chapuis Cours PL/SQL d’après cours ORACLE . • Opérateurs AND.Déclaration de Type Booléen • Valeurs TRUE. v_comm_sal BOOLEAN := (v_sal < v_comm). • Valeurs TRUE. arithmétique ou chaîne de caractères. OR.

Bonnet R. Chapuis C.Types Structurés • PL/SQL Table • PL/SQL Table • PL/SQL Enregistrement (RECORD) • PL/SQL Enregistrement (RECORD) C. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 21 .

Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 22 .Type LOB Texte (CLOB) Photo (BLOB) Film (BFILE) NCLOB C. Bonnet R. Bonnet // R.

OAI / 23 . Bonnet R. Chapuis C. Bonnet // R.Variables de lien Variable de lien Serveur C. Chapuis Cours PL/SQL d’après cours ORACLE .

:g_monthly_sal := v_sal / 12.OAI / 24 . Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R. Chapuis C. C.Référence à une variable de lien Variable de lien ou Variable hôte Variable de lien ou Variable hôte Préfixer le nom de variable par (:) Préfixer le nom de variable par (:) Exemple : 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.

Chapuis Cours PL/SQL d’après cours ORACLE .PUT_LINE('Salaire mensuel : ' || TO_CHAR(v_sal. • Utilisable sous SQL*PLUS avec l’option • Utilisable sous SQL*PLUS avec l’option SET SERVEROUTPUT ON SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE • DBMS_OUTPUT : package fourni par • DBMS_OUTPUT : package fourni par Oracle Oracle • Procédure PUT_LINE : affichage de la • Procédure PUT_LINE : affichage de la valeur d ’une variable.Visualisation des variables : DBMS_OUTPUT.'99999.OAI / 25 .'99999. TO_CHAR(v_sal. Chapuis C. valeur d ’une variable.PUT_LINE('Salaire mensuel : ' || DBMS_OUTPUT. Bonnet R.99')). C. Bonnet // R.99')).

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

PL/SQL.BLOC PL/SQL Syntaxe • Une instruction peut être écrite sur • Une instruction peut être écrite sur plusieurs lignes. – Maximum 30 caractères. Bonnet R. – Maximum 30 caractères.) • Identificateur : • Identificateur : – Permet de référencer un élément – Permet de référencer un élément PL/SQL. • Chaque instruction est terminée par (. Bonnet // R. plusieurs lignes. – Doit commencer par une lettre. Chapuis Cours PL/SQL d’après cours ORACLE . C.) • Chaque instruction est terminée par (. Chapuis C. – Doit commencer par une lettre.OAI / 27 .

-. v_sal NUMBER (9. . Bonnet // R.2).2). Chapuis Cours PL/SQL d’après cours ORACLE . BEGIN BEGIN /* calcul du salaire annuel à partir de données /* calcul du salaire annuel à partir de données fournies par l’utilisateur */ fournies par l’utilisateur */ v_sal := :p_monthly_sal * 12.. de ligne..Syntaxe : Ligne Commentaire • Une seule ligne : deux tirets (--) en début • Une seule ligne : deux tirets (--) en début de ligne. • Plusieurs lignes entre les symboles : • Plusieurs lignes entre les symboles : /* et */.. /* et */. Bonnet R.fin de la transaction C.. Chapuis C. END.OAI / 28 . Exemple Exemple . v_sal NUMBER (9.fin de la transaction END. -. v_sal := :p_monthly_sal * 12.

OAI / 29 . Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R. Chapuis C.Fonctions SQL en PL/SQL • Utilisables : • Utilisables : – Fonction-ligne numérique – Fonction-ligne numérique – Fonction-ligne alphanumérique – Fonction-ligne alphanumérique – Conversion de type – Conversion de type – Date – Date • Non utilisables : • Non utilisables : – DECODE – DECODE – Fonctions de groupe – Fonctions de groupe C.

:= LOWER(v_ename). Chapuis C.OAI / 30 . C. Chapuis Cours PL/SQL d’après cours ORACLE . CHR(10)||v_zip. Bonnet R. Bonnet // R.Fonctions SQL en PL/SQL Exemples 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. • Mettre le nom d ’employé en lettres • Mettre le nom d ’employé en lettres minuscules : minuscules : v_ename v_ename := LOWER(v_ename).

. DECLARE DECLARE y NUMBER.Blocs Imbriqués (Nested Blocks) Exemple Exemple . .. END. BEGIN BEGIN . ... . END.. C.. END. END..... Bonnet R. Chapuis C.. x BINARY_INTEGER.OAI / 31 .. Bonnet // R... x BINARY_INTEGER. .. Chapuis Bloc externe Bloc imbriqué Cours PL/SQL d’après cours ORACLE .. y NUMBER.. BEGIN BEGIN .

• La section EXCEPTION peut contenir • La section EXCEPTION peut contenir des blocs imbriqués.Blocs Imbriqués • Un bloc peut être inséré en lieu et place • Un bloc peut être inséré en lieu et place d’une instruction. C. Bonnet // R. Bonnet R. instruction. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 32 . d’une instruction. Chapuis C. des blocs imbriqués. • Un bloc imbriqué correspond à une • Un bloc imbriqué correspond à une instruction.

rapport à celui où il est défini. Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.OAI / 33 . Bonnet R. C.Blocs Imbriqués Visibilité des variables Un identificateur (variable. curseur) est Un identificateur (variable. curseur) est visible dans tous les blocs imbriqués par visible dans tous les blocs imbriqués par rapport à celui où il est défini.

...OAI / 34 . END. Chapuis Visibilité de x Visibilité de y Cours PL/SQL d’après cours ORACLE .. x BINARY_INTEGER. END. x BINARY_INTEGER. Bonnet // R. BEGIN BEGIN ..... END.. Chapuis C. . . y NUMBER. . END.Blocs Imbriqués Visibilité des variables Exemple Exemple . C. BEGIN BEGIN ... Bonnet R. . . DECLARE DECLARE y NUMBER......

. Chapuis C.2) := 60000. Bonnet // R.2) := V_SAL * .2) := V_SAL + V_COMM. BEGIN .. V_MESSAGE := 'SALESMAN'||V_MESSAGE. NUMBER(7.20. END. V_TOTAL_COMP NUMBER(7. V_MESSAGE := 'CLERK not'||V_MESSAGE. VARCHAR2(255) := ' eligible for commission'. V_COMM NUMBER(7. V_SAL NUMBER(7.Blocs Imbriqués Visibilité des variables . END.. C. BEGIN . NUMBER(7.2) := 60000..2) := 0.. V_TOTAL_COMP NUMBER(7.2) := 0. VARCHAR2(255) := ' eligible for commission'.2) := V_SAL * . V_MESSAGE := 'SALESMAN'||V_MESSAGE...2) := V_SAL + V_COMM... DECLARE DECLARE V_SAL NUMBER(7..2) := 50000. DECLARE DECLARE V_SAL V_SAL V_COMM V_COMM V_MESSAGE V_MESSAGE BEGIN .20. V_MESSAGE := 'CLERK not'||V_MESSAGE. V_COMM NUMBER(7. BEGIN . Chapuis Cours PL/SQL d’après cours ORACLE . NUMBER(7.. Bonnet R.. .OAI / 35 .2) := 50000. NUMBER(7. END. END.

Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C.OAI / 36 . Bonnet // R.Opérateurs en PL/SQL • Logique • Logique • Arithmétique • Arithmétique • Concaténation • Concaténation • Parenthèses possibles • Parenthèses possibles • Opérateur exponentiel (**) • Opérateur exponentiel (**) C.

v_equal v_equal := (v_n1 = v_n2). := v_count + 1. Chapuis C. Bonnet R. • Incrément de l’indice d’une boucle. := (v_n1 = v_n2). v_count v_count := v_count + 1.OAI / 37 .Opérateurs en PL/SQL Exemples Exemples • Incrément de l’indice d’une boucle. Bonnet // R. • Test de la valeur d’un numéro • Test de la valeur d’un numéro d’employé d’employé v_valid v_valid C. indicateur booléen. Cours PL/SQL d’après cours ORACLE . • Initialisation de valeur pour un • Initialisation de valeur pour un indicateur booléen. Chapuis := (v_empno IS NOT NULL). := (v_empno IS NOT NULL).

Bonnet R.Accès aux données C.OAI . Bonnet // R. Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE .

UPDATE de manipulation INSERT. Bonnet // R. • Modification des données par les ordres • Modification des données par les ordres de manipulation INSERT. Bonnet R. ROLLBACK. Chapuis Cours PL/SQL d’après cours ORACLE .Ordres SQL en PL/SQL • Consultation par SELECT : une seule • Consultation par SELECT : une seule ligne peut être retournée. • Contrôle des transactions par COMMIT. ou SAVEPOINT. UPDATE DELETE. ou SAVEPOINT. • Curseur implicite. C. • Contrôle des transactions par COMMIT. ligne peut être retournée. Chapuis C. DELETE. • Curseur implicite.OAI / 39 . ROLLBACK.

Syntaxe Syntaxe SELECT SELECT INTO INTO liste de projection liste de projection {nom variable[. | nom enregistrement} | nom enregistrement} FROM table FROM table WHERE condition. Chapuis C. Consultation de la base de données..OAI / 40 . WHERE condition.. Bonnet R..Ordre SELECT en PL/SQL Consultation de la base de données. Chapuis Cours PL/SQL d’après cours ORACLE . {nom variable[. C. nom variable].. nom variable]. Bonnet // R.

Cours PL/SQL d’après cours ORACLE . NUMBER(2). Chapuis NUMBER(2). VARCHAR2(15). Chapuis C. Bonnet R. loc deptno. loc v_deptno. v_loc dept dept dname = 'SALES'. v_loc v_deptno..Ordre SELECT en PL/SQL Utilisation de la clause : INTO Utilisation de la clause : INTO Exemple Exemple DECLARE DECLARE v_deptno v_deptno v_loc v_loc BEGIN BEGIN SELECT SELECT INTO INTO FROM FROM WHERE WHERE . VARCHAR2(15). END.. dname = 'SALES'. deptno.OAI / 41 . . END. Bonnet // R... C.

Bonnet // R. deptno = v_deptno. NUMBER NOT NULL := 10.sal%TYPE.Ordre SELECT en PL/SQL Exemple Exemple Montant total des salaires des employés Montant total des salaires des employés d ’’un département d un département DECLARE DECLARE v_sum_sal v_sum_sal v_deptno v_deptno BEGIN BEGIN SELECT SELECT INTO INTO FROM FROM WHERE WHERE END. emp. emp. SUM(sal) -.fonction de groupe SUM(sal) -. NUMBER NOT NULL := 10. Bonnet R.sal%TYPE. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 42 .fonction de groupe v_sum_sal v_sum_sal emp emp deptno = v_deptno. END. Chapuis C. C.

Bonnet R. Chapuis C.OAI / 43 .Mise à jour des données Utilisation des ordres : Utilisation des ordres : • INSERT • INSERT • UPDATE • UPDATE • DELETE • DELETE INSERT UPDATE DELETE C. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.

'CLERK'. deptno) VALUES(empno_sequence. Chapuis Cours PL/SQL d’après cours ORACLE . deptno) INSERT INTO emp(empno. 'HARDING'. BEGIN BEGIN INSERT INTO emp(empno. C. job. 'HARDING'. Bonnet // R. VALUES(empno_sequence.OAI / 44 . Chapuis C. EMP. ename. END.Ajout de données Exemple Exemple Ajout d ’’un nouvel employé dans la table Ajout d un nouvel employé dans la table EMP. 'CLERK'. job. Bonnet R. END. 10).NEXTVAL. ename.NEXTVAL. 10).

C. Bonnet R. END. Bonnet // R. employés 'ANALYST'.Modification de données Exemple Exemple Modification de la valeur du salaire des Modification de la valeur du salaire des employés 'ANALYST'.sal%TYPE := 2000. DECLARE v_sal_increase emp. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 45 . Chapuis C. BEGIN UPDATE emp SET sal = sal + v_sal_increase WHERE job = 'ANALYST'.

Chapuis Cours PL/SQL d’après cours ORACLE . BEGIN BEGIN DELETE FROM emp DELETE FROM emp WHERE deptno = v_deptno. END..deptno%TYPE := 10. END. WHERE deptno = v_deptno. C. Chapuis C. Bonnet // R.Suppression de données Exemple Exemple Supprimer les employés d’un Supprimer les employés d’un département . Bonnet R. département DECLARE DECLARE v_deptno emp. v_deptno emp.OAI / 46 .deptno%TYPE := 10.

OAI / 47 . • Fin de transaction explicite : COMMIT • Fin de transaction explicite : COMMIT ou ROLLBACK. Chapuis Cours PL/SQL d’après cours ORACLE . C. Bonnet // R.Ordres COMMIT et ROLLBACK • Début de transaction : premier ordre • Début de transaction : premier ordre LMD. Chapuis C. Bonnet R. ou ROLLBACK. LMD.

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

Bonnet R. curseur.OAI / 49 .Curseur SQL • Zone de travail privée. Bonnet // R. C. • Un code statut est positionné à la fin • Un code statut est positionné à la fin d ’exécution de l’ordre SQL. Chapuis C. • Deux types de curseurs : • Deux types de curseurs : – Implicite – Implicite – Explicite (déclaré) – Explicite (déclaré) • Toute exécution d’ordre SQL utilise un • Toute exécution d’ordre SQL utilise un curseur. d ’exécution de l’ordre SQL. Chapuis Cours PL/SQL d’après cours ORACLE . • Zone de travail privée.

Bonnet R. Positionné à la fin d’exécution de ’ordre.Curseur IMPLICITE .Statut Positionné à la fin d’exécution de ll’ordre.OAI / 50 . Chapuis Cours PL/SQL d’après cours ORACLE . SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND Nombre de lignes traitées (entier) positionné à VRAI si l’ordre a traité une ou plusieurs lignes positionné à VRAI si l’ordre n ’a traité de ligne C. Bonnet // R. Chapuis C.

OAI / 51 . Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE .'). BEGIN DELETE FROM item WHERE ordid = v_ordid. / PRINT rows_deleted C. Chapuis C. :rows_deleted := (SQL%ROWCOUNT || ' rows deleted. END.Curseur IMPLICITE . Bonnet // R.Statut Exemple Exemple Affichage du nombre de lignes Affichage du nombre de lignes supprimées. supprimées. VARIABLE rows_deleted VARCHAR2(30) DECLARE v_ordid NUMBER := 605.

Bonnet R. Chapuis C. Bonnet // R.Structures de contrôle C. Chapuis Cours PL/SQL d’après cours ORACLE .OAI .

Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R. C. Répétitive.Structures de contrôle Deux structures : Deux structures : Alternative Alternative Répétitive.OAI / 53 . Bonnet R. Chapuis C.

Structures de contrôle STRUCTURE ALTERNATIVE STRUCTURE ALTERNATIVE Instruction IF Instruction IF Trois formes : Trois formes : • IF-THEN-END IF • IF-THEN-END IF • IF-THEN-ELSE-END IF • IF-THEN-ELSE-END IF • IF-THEN-ELSIF-END IF • IF-THEN-ELSIF-END IF C. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.OAI / 54 . Bonnet R. Chapuis C.

Instruction IF Syntaxe Syntaxe IF condition THEN IF condition THEN instructions.] instructions. Chapuis C. Cours PL/SQL d’après cours ORACLE .] END IF. Exemple : Exemple : N° manager = 22 si nom employé = Osborne. instructions. N° manager = 22 si nom employé = Osborne.] instructions.OAI / 55 . END IF. C. Bonnet R. 22. [ELSIF condition THEN [ELSIF condition THEN instructions. END IF. Chapuis = 'OSBORNE' THEN = 'OSBORNE' THEN 22. IF v_ename IF v_ename v_mgr := v_mgr := END IF.] [ELSE [ELSE instructions. Bonnet // R.

Chapuis C. Bonnet // R.Instruction IF-THEN-ELSE VRAI IF condition FAUX THEN actions THEN actions (incluant autres IF) (incluant autres IF) ELSE actions ELSE actions (incluant autres IF) (incluant autres IF) C.OAI / 56 . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R.

.... . := 'Unacceptable'. := 'Acceptable'.v_orderdate < 5 THEN .. . IF v_shipdate IF v_shipdate v_ship_flag v_ship_flag ELSE ELSE v_ship_flag v_ship_flag END IF. := 'Unacceptable'. Chapuis C... C.OAI / 57 .. END IF.Instruction IF-THEN-ELSE Exemple Exemple .. Bonnet R. . Chapuis Cours PL/SQL d’après cours ORACLE .v_orderdate < 5 THEN := 'Acceptable'. Bonnet // R.

Chapuis Cours PL/SQL d’après cours ORACLE .Instruction IF-THEN-ELSIF IF condition IF condition VRAI FAUX ELSIF ELSIF condition condition THEN actions THEN actions VRAI FAUX ELSE ELSE actions actions THEN actions THEN actions C. Bonnet R.OAI / 58 . Chapuis C. Bonnet // R.

. v_start := . ELSIF v_start >= 50 THEN ELSIF v_start >= 50 THEN v_start := . C. IF v_start > 100 THEN IF v_start > 100 THEN v_start := 2 * v_start. . Bonnet // R.OAI / 59 . .Instruction IF-THEN-ELSIF Exemple Exemple . Bonnet R. . .1 * v_start. v_start := . .1 * v_start. . END IF. END IF.5 * v_start. .5 * v_start. Chapuis Cours PL/SQL d’après cours ORACLE . ELSE ELSE v_start := . . . Chapuis C. . v_start := 2 * v_start.

Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. fois. • Trois possibilités : • Trois possibilités : – instruction LOOP – instruction LOOP – Instruction FOR – Instruction FOR – instruction WHILE – instruction WHILE C.OAI / 60 . Bonnet R.Structure répétitive • Une boucle répète une instruction ou • Une boucle répète une instruction ou une séquence d’instructions plusieurs une séquence d’instructions plusieurs fois.

. Bonnet R. END LOOP.instructions -. -.début de boucle -. END LOOP. . Bonnet // R. Chapuis C.OAI / 61 . EXIT [WHEN condition].fin de boucle C. Chapuis Cours PL/SQL d’après cours ORACLE . .EXIT instruction -. EXIT [WHEN condition]. . instruction(s). .Instruction Loop Syntaxe Syntaxe LOOP LOOP instruction(s). .

OAI / 62 .ordid%TYPE := 601. v_counter). v_counter := v_counter + 1. v_counter NUMBER(2) := 1. itemid) INSERT INTO item(ordid. itemid) VALUES(v_ordid. v_ordid item. END LOOP. VALUES(v_ordid.ordid%TYPE := 601. END. v_counter NUMBER(2) := 1.Instruction Loop Exemple Exemple DECLARE DECLARE v_ordid item. EXIT WHEN v_counter > 10. v_counter := v_counter + 1. Chapuis Cours PL/SQL d’après cours ORACLE . BEGIN BEGIN LOOP LOOP INSERT INTO item(ordid. END. Bonnet R. C. v_counter). EXIT WHEN v_counter > 10. Bonnet // R. END LOOP. Chapuis C.

instruction 2. par l’indice. END LOOP.borne-supérieure LOOP instruction 1. instruction 2.OAI / 63 . . END LOOP.. Bonnet // R. . . instruction 1.. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R.borne-supérieure LOOP borne-inférieure. Chapuis C. . • Le nombre de répétitions est contrôlé • Le nombre de répétitions est contrôlé par l’indice. • Ne pas déclarer l’indice. .Instruction FOR Syntaxe Syntaxe FOR indice in [REVERSE] FOR indice in [REVERSE] borne-inférieure. sa déclaration est implicite. sa déclaration • Ne pas déclarer l’indice. C. est implicite. .

la boucle. Chapuis C. C. l’indice.Instruction FOR Règles : Règles : • L’indice n’est utilisable qu’à l’intérieur de • L’indice n’est utilisable qu’à l’intérieur de la boucle.OAI / 64 . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R. Bonnet // R. • Il est interdit d’affecter une valeur à • Il est interdit d’affecter une valeur à l’indice.

INSERT INTO item(ordid. DECLARE DECLARE v_ordid item. itemid) itemid) C. := 601.. END. END. VALUES(v_ordid. := 601.10 LOOP FOR i IN 1. Bonnet R.OAI / 65 . Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE .10 LOOP INSERT INTO item(ordid.ordid%TYPE BEGIN BEGIN FOR i IN 1. i). Bonnet // R. END LOOP.ordid%TYPE v_ordid item.Instruction FOR Exemple Exemple Création de 10 lignes pour la commande de Création de 10 lignes pour la commande de n° 601. n° 601. VALUES(v_ordid. i). END LOOP..

. Bonnet // R. .OAI / 66 . .Instruction WHILE Syntaxe Syntaxe WHILE condition LOOP WHILE condition LOOP instruction 1. instruction2. . Chapuis C. . instruction 1. Bonnet R. La condition est évaluée en début de boucle. Les instructions de la boucle sont Les instructions de la boucle sont répétées tant que la condition est vraie. END LOOP. C. . répétées tant que la condition est vraie. instruction2. Chapuis Cours PL/SQL d’après cours ORACLE . END LOOP.

v_count). / / C.OAI / 67 . itemid) INSERT INTO item (ordid. Chapuis ' ' ' ' Cours PL/SQL d’après cours ORACLE . END. v_count := v_count + 1. v_count := v_count + 1. Bonnet R. VALUES (&p_new_order. Chapuis C. COMMIT.Instruction WHILE Exemple Exemple ACCEPT p_new_order PROMPT 'Enter the order number: ACCEPT p_new_order PROMPT '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: DECLARE DECLARE v_count NUMBER(2) := 1. BEGIN BEGIN WHILE v_count <= &p_items LOOP WHILE v_count <= &p_items LOOP INSERT INTO item (ordid. END LOOP. COMMIT. END. Bonnet // R. END LOOP. v_count). v_count NUMBER(2) := 1. itemid) VALUES (&p_new_order.

Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE . • Possibilité de sortir d’une boucle • Possibilité de sortir d’une boucle interne par ll ’ordre EXIT. interne par ’ordre EXIT.Structures imbriquées et étiquettes • Plusieurs niveaux d’imbrication • Plusieurs niveaux d’imbrication possibles. Bonnet // R. C. Chapuis C. • Utiliser des étiquettes pour différencier • Utiliser des étiquettes pour différencier BLOC et Structure imbriquées. possibles.OAI / 68 . BLOC et Structure imbriquées.

Sortie des deux boucles -. Chapuis C. EXIT Boucle-externe WHEN prédicat. -..Sortie des deux boucles EXIT WHEN prédicat. . EXIT WHEN v_counter>10... EXIT Boucle-externe WHEN prédicat.. C.sortie de la boucle interne uniquement -.. END. . <<Boucle-interne>> <<Boucle-interne>> LOOP LOOP . EXIT WHEN prédicat. v_counter := v_counter+1. EXIT WHEN v_counter>10. .. ..OAI / 69 ... BEGIN BEGIN <<Boucle-externe>> <<Boucle-externe>> LOOP LOOP v_counter := v_counter+1. END LOOP boucle-interne..Structures imbriquées et étiquettes ... Bonnet R.. END LOOP boucle-interne. END LOOP Boucle-externe. . Chapuis Cours PL/SQL d’après cours ORACLE . END LOOP Boucle-externe.. -.sortie de la boucle interne uniquement .. END.. Bonnet // R.

Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R. Chapuis C.OAI .Utilisation des Types Structurés : Enregistrement Tableau C.

Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. Bonnet R.OAI / 71 .Types Structurés • Deux types: • Deux types: – Enregistrement (RECORD) – Enregistrement (RECORD) – Tableau (TABLE PL/SQL) – Tableau (TABLE PL/SQL) • Contiennent des composants internes • Contiennent des composants internes • Sont réutilisables • Sont réutilisables C.

relationnelle. Bonnet R. • Considère un ensemble de champs • Considère un ensemble de champs comme une unité logique. Chapuis Cours PL/SQL d’après cours ORACLE . • Différent de la notion de ligne de table • Différent de la notion de ligne de table relationnelle. L3G. RECORD ou TABLE PL/SQL. Bonnet // R. RECORD ou TABLE de type : scalaire. C.Enregistrement PL/SQL • Peut contenir un ou plusieurs composants • Peut contenir un ou plusieurs composants de type : scalaire. • Peut être utilisé pour recevoir une ligne de • Peut être utilisé pour recevoir une ligne de table.OAI / 72 . comme une unité logique. • Identique à la structure enregistrement en • Identique à la structure enregistrement en L3G. PL/SQL. Chapuis C. table.

-.OAI / 73 . Chapuis C. nom_variable nom_type. Chapuis Cours PL/SQL d’après cours ORACLE .colonne%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expression] [[NOT NULL] {:= | DEFAULT} expression] C.déclaration -. Bonnet R.déclaration de type de type champ]…).déclaration déclaration de déclaration de -.déclaration -.colonne%TYPE | table%ROWTYPE} | table. de variable de variable Avec déclaration de champ : Avec déclaration de champ : Nom_champ {type_champ | variable%TYPE Nom_champ {type_champ | variable%TYPE | table.Déclaration d’un type Enregistrement Syntaxe Syntaxe TYPE nom_type IS RECORD TYPE nom_type IS RECORD (déclaration de champ[. (déclaration de champ[. champ]…). Bonnet // R. nom_variable nom_type.

sal NUMBER(7.. job VARCHAR2(9). et salaire d’un employé. Chapuis Cours PL/SQL d’après cours ORACLE .2)). TYPE emp_record_type IS RECORD TYPE emp_record_type IS RECORD (ename VARCHAR2(10). et salaire d’un employé. C. .Déclaration d’un type Enregistrement Exemple Exemple Déclaration d ’’une variable pour stocker Déclaration d une variable pour stocker nom.2)). sal NUMBER(7. Chapuis C. . emploi. job VARCHAR2(9).. emp_record emp_record_type.. . emploi..OAI / 74 .. nom. Bonnet // R. emp_record emp_record_type.. Bonnet R.. . (ename VARCHAR2(10)..

OAI / 75 . Bonnet // R. • Nom_table%ROWTYPE. ou de vue.Utilisation de %ROWTYPE • Permet de déclarer une variable de • Permet de déclarer une variable de même structure qu’une ligne de table même structure qu’une ligne de table ou de vue. Chapuis Cours PL/SQL d’après cours ORACLE . • Les champs de l’enregistrement ont • Les champs de l’enregistrement ont même nom et même type que ceux des même nom et même type que ceux des colonnes de la table ou de la vue. Bonnet R. colonnes de la table ou de la vue. Chapuis C. C. • Nom_table%ROWTYPE.

dept_record dept_record dept%ROWTYPE. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. emp%ROWTYPE. Bonnet // R. la table DEPT.Utilisation de %ROWTYPE Exemples Exemples Déclarer une variable pour stocker la Déclarer une variable pour stocker la même information que celle définie dans même information que celle définie dans la table DEPT. Bonnet R. C. dept%ROWTYPE. Déclare une variable pour stocker la Déclare une variable pour stocker la même information que celle définie dans même information que celle définie dans la table EMP. emp_record emp_record emp%ROWTYPE.OAI / 76 . la table EMP.

Chapuis C.Avantage de %ROWTYPE • Il n ’est pas nécessaire de connaître les • Il n ’est pas nécessaire de connaître les caractéristiques des colonnes de la caractéristiques des colonnes de la ligne de référence .. les données d’une ligne. C. de référence.OAI / 77 . Bonnet R. ligne de référence • Mise à jour automatique en cas de • Mise à jour automatique en cas de modification de la structure de la ligne modification de la structure de la ligne de référence. • Utilisable avec SELECT pour recueillir • Utilisable avec SELECT pour recueillir les données d’une ligne. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE .

Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 78 . Bonnet R. Chapuis C. Bonnet // R.Tables PL/SQL • Composé de postes identiques de type : • Composé de postes identiques de type : – Scalaire – Scalaire – Enregistrement – Enregistrement • Référence à un poste par clé primaire • Référence à un poste par clé primaire (PRIMARY KEY) de type (PRIMARY KEY) de type BINARY_INTEGER BINARY_INTEGER C.

INDEX BY BINARY_INTEGER. nom_variable nom_type. .ename%TYPE INDEX BY BINARY_INTEGER. Bonnet // R. Exemple Exemple Déclarer une table de noms.. Chapuis Cours PL/SQL d’après cours ORACLE .poste de type scalaire TYPE nom_type IS TABLE OF TYPE nom_type IS TABLE OF {type_colonne | variable%TYPE {type_colonne | variable%TYPE | table..colonne%TYPE} [NOT NULL] INDEX BY BINARY_INTEGER. nom_variable nom_type.. . . TYPE nom_table_type IS TABLE OF emp...Déclaration d’un type Table Syntaxe . C.OAI / 79 . INDEX BY BINARY_INTEGER. .poste de type scalaire Syntaxe ...ename%TYPE TYPE nom_table_type IS TABLE OF emp. Déclarer une table de noms.. Chapuis C. table_nom nom_table_type. Bonnet R.colonne%TYPE} [NOT NULL] | table. table_nom nom_table_type.

... Scalaire C.Structure Table PL/SQL Clé primaire .OAI / 80 . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.. 1 2 3 .. Jones Smith Maduro ... BINARY_INTEGER Colonne . Chapuis C. Bonnet R..

Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE .ename%TYPE INDEX BY BINARY_INTEGER. TYPE hiredate_table_type IS TABLE OF DATE TYPE hiredate_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER... Chapuis C. ename_table ename_table_type. BEGIN BEGIN ename_table(1) := 'CAMERON'. INDEX BY BINARY_INTEGER. END. hiredate_table(8) := SYSDATE + 7. C.EXISTS(1) THEN IF ename_table..EXISTS(1) THEN INSERT INTO . INSERT INTO .. ename_table(1) := 'CAMERON'.OAI / 81 . END. . ename_table ename_table_type.. hiredate_table(8) := SYSDATE + 7.Création d’une Table PL/SQL DECLARE DECLARE TYPE ename_table_type IS TABLE OF emp.. . IF ename_table.. hiredate_table hiredate_table_type. hiredate_table hiredate_table_type..ename%TYPE TYPE ename_table_type IS TABLE OF emp. Bonnet R. INDEX BY BINARY_INTEGER.

Chapuis C.OAI / 82 .Méthodes PL/SQL associées à la structure Table Méthodes fournies en standard : Méthodes fournies en standard : • EXISTS • EXISTS • COUNT • COUNT • FIRST. Bonnet R. LAST • PRIOR • PRIOR • NEXT • NEXT • EXTEND • EXTEND • TRIM • TRIM • DELETE • DELETE C. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R. LAST • FIRST.

INDEX BY BINARY_INTEGER. C.poste de type enregistrement • Utilisation de %ROWTYPE.OAI / 83 . dept_table dept_table_type. Chapuis Cours PL/SQL d’après cours ORACLE . • Utilisation de %ROWTYPE. dept_table dept_table_type.poste de type enregistrement Syntaxe . données de la table DEPT. Bonnet R. Exemple Exemple • Déclarer une variable pour recevoir les • Déclarer une variable pour recevoir les données de la table DEPT.Table d’enregistrements Syntaxe . Bonnet // R. DECLARE DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER. Chapuis C.

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

Curseur Tout ordre SQL utilise un curseur pour Tout ordre SQL utilise un curseur pour s’exécuter : s’exécuter : • curseur implicite • curseur implicite – tout ordre LMD (DML) – tout ordre LMD (DML) – SELECT … INTO .. sous PL/SQL • curseur explicite • curseur explicite – déclaré dans un module – déclaré dans un module C. Bonnet // R. sous PL/SQL – SELECT … INTO .OAI / 85 . Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R....

Structure (simplifiée) du curseur (simplifiée)
Lignes sélectionnées 7369 SMITH 7566 JONES Cursor 7788 SCOTT 7876 ADAMS 7902 FORD CLERK MANAGER ANALYST CLERK ANALYST Ligne Courante

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 86

Mise en œuvre curseur explicite œuvre
Non oui DECLARE DECLARE OPEN OPEN FETCH FETCH FIN? CLOSE CLOSE

• Déclaration
requête SQL

• Ouverture • Distribution • Teste
et exécution ligne courante existence ligne

• Libération
du curseur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 87

Mise en œuvre curseur explicite œuvre
Ouverture curseur. Pointeur
Curseur

Distribution ligne courante. Pointeur
Curseur

… jusqu’à fin. Pointeur
Curseur

Fermeture du curseur.

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

Déclaration du curseur Déclaration
Syntaxe Syntaxe
CURSOR nom_curseur IS CURSOR nom_curseur IS requête; requête;

• Requête sans clause INTO. • Requête sans clause INTO. • Possibilité de clause ORDER BY. • Possibilité de clause ORDER BY.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 89

ename FROM emp..Déclaration du curseur Déclaration Exemple Exemple DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno. Bonnet // R.. C... FROM emp. . BEGIN BEGIN . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R. Chapuis C.OAI / 90 . ename SELECT empno.

Bonnet R. Chapuis C. • Possibilité de tester le statut du curseur • Possibilité de tester le statut du curseur après exécution de l’ordre FETCH. après exécution de l’ordre FETCH. • Pas d’erreur si la requête ne sélectionne • Pas d’erreur si la requête ne sélectionne pas de ligne. Chapuis Cours PL/SQL d’après cours ORACLE . OPEN nom_curseur. C.OAI / 91 . pas de ligne. • Exécution de la requête et génération • Exécution de la requête et génération des lignes résultats au niveau du des lignes résultats au niveau du serveur. Bonnet // R. serveur.Ouverture du curseur Syntaxe Syntaxe OPEN nom_curseur.

• Effectue une correspondance par • Effectue une correspondance par position.] FETCH nom_curseur INTO [variable1. C. Chapuis C. . variable2. Chapuis Cours PL/SQL d’après cours ORACLE . • Renvoie un code statut.OAI / 92 . • Renvoie un code statut.Distribution des lignes Syntaxe Syntaxe FETCH nom_curseur INTO [variable1. Bonnet R. | [nom_enregistrement]..] | [nom_enregistrement].. . position. réception.. • Distribue les valeurs des colonnes de la • Distribue les valeurs des colonnes de la ligne courante dans les variables de ligne courante dans les variables de réception. Bonnet // R.. variable2.

• Une ligne est distribuée à chaque • Une ligne est distribuée à chaque itération. Bonnet R. itération. Chapuis Cours PL/SQL d’après cours ORACLE . structure répétitive.Mise en œuvre de l ’ordre FETCH • Inclure ll ’ordre FETCH dans une • Inclure ’ordre FETCH dans une structure répétitive.OAI / 93 . Bonnet // R. C. • Utiliser %NOTFOUND ou %FOUND pour • Utiliser %NOTFOUND ou %FOUND pour contrôler la sortie de la boucle. contrôler la sortie de la boucle. Chapuis C.

... LOOP LOOP FETCH nom_curseur INTO variables FETCH nom_curseur INTO variables EXIT WHEN nom_curseur%NOTFOUND..OAI / 94 . OPEN nom_curseur. .. Chapuis Cours PL/SQL d’après cours ORACLE . -. v_ename. END LOOP. Bonnet R... .. C.. ... FETCH emp_cursor INTO v_empno. END LOOP...Distribution des lignes Exemples Exemples FETCH emp_cursor INTO v_empno.utilisation des valeurs distribuées à -. OPEN nom_curseur.. Chapuis C.utilisation des valeurs distribuées à chaque itération chaque itération .. v_ename. Bonnet // R.. ... . EXIT WHEN nom_curseur%NOTFOUND.

nom_curseur. Chapuis Cours PL/SQL d’après cours ORACLE . C.OAI / 95 . • Ferme le curseur et libère les • Ferme le curseur et libère les ressources. ressources. curseur. Bonnet // R. Chapuis C.Fermeture du curseur Syntaxe Syntaxe CLOSE CLOSE nom_curseur. • Possibilité de ré-ouvrir le même • Possibilité de ré-ouvrir le même curseur. Bonnet R.

complément de %NOTFOUND Nombre de lignes distribuées %ROWCOUNT Nombre C.Codes statut d'un curseur Informent sur ll’état du curseur. Code Mnémonique %ISOPEN %NOTFOUND %FOUND Type Booléen Booléen Booléen Description VRAI si le curseur est ouvert VRAI si le dernier ordre fetch exécuté n’a pas distribué de ligne VRAI si le dernier ordre fetch exécuté a distribué une ligne . Informent sur ’état du curseur. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R. Chapuis C.OAI / 96 . Bonnet R.

. Bonnet // R..OAI / 97 . END IF. Exemple Exemple IF NOT emp_cursor%ISOPEN THEN IF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor.%ISOPEN • La distribution de ligne ne s’effectue • La distribution de ligne ne s’effectue que pour un curseur ouvert. que pour un curseur ouvert.. • Permet de savoir si un curseur est • Permet de savoir si un curseur est ouvert avant d’exécuter un ordre fetch. OPEN emp_cursor. FETCH emp_cursor. LOOP LOOP FETCH emp_cursor. END IF. Chapuis C. C. ouvert avant d’exécuter un ordre fetch. Bonnet R.. Chapuis Cours PL/SQL d’après cours ORACLE .

Chapuis C. • %FOUND testé après exécution du • %FOUND testé après exécution du premier ordre fetch indique si la requête premier ordre fetch indique si la requête a sélectionné au moins une ligne. C. • %NOTFOUND indique la fin de • %NOTFOUND indique la fin de distribution des lignes d’un curseur. Chapuis Cours PL/SQL d’après cours ORACLE . distribution des lignes d’un curseur. Bonnet // R.OAI / 98 .NOTFOUND ROWCOUNT et FOUND • %ROWCOUNT donne. Bonnet R. lignes distribuées. le nombre de exécution de l’ordre fetch. a sélectionné au moins une ligne. le nombre de lignes distribuées. après chaque exécution de l’ordre fetch. après chaque • %ROWCOUNT donne.

ename SELECT empno. Exemple Exemple DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno.Curseur et Enregistrement Distribution des données de la ligne dans Distribution des données de la ligne dans une structure RECORD.. ename FROM emp. BEGIN BEGIN OPEN emp_cursor.OAI / 99 . C. emp_cursor%ROWTYPE. une structure RECORD. FROM emp.. emp_record emp_record emp_cursor%ROWTYPE.. OPEN emp_cursor. FETCH emp_cursor INTO emp_record. Chapuis C. LOOP LOOP FETCH emp_cursor INTO emp_record. . . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.. Bonnet R.

Bonnet R. • Exécute toutes les étapes (open. . • Raccourci pour gérer la distribution des • Raccourci pour gérer la distribution des lignes. . END LOOP. • Déclaration implicite de l’enregistrement. C. instruction2. Bonnet // R. close). instruction2. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. . . close). • Exécute toutes les étapes (open. instruction1. . fetch. • Déclaration implicite de l’enregistrement. END LOOP.Curseur et Enregistrement .utilisation de For Syntaxe Syntaxe FOR nom_enregistrement IN nom_curseur LOOP FOR nom_enregistrement IN nom_curseur LOOP instruction1. fetch. .OAI / 100 . lignes.

C.deptno = 30 THEN . BEGIN BEGIN FOR emp_record IN emp_cursor LOOP FOR emp_record IN emp_cursor LOOP -. Bonnet R.. .deptno = 30 THEN IF emp_record.. END. deptno FROM emp.close implicite END LOOP. deptno SELECT ename. Bonnet // R.. Chapuis Cours PL/SQL d’après cours ORACLE . -. FROM emp. END LOOP. Chapuis C.OAI / 101 .close implicite END.. -.utilisation de For Exemple Exemple DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT ename.Curseur et Enregistrement .open et fetch implicites -.open et fetch implicites IF emp_record.

Curseur paramétré C. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE .OAI . Chapuis C. Bonnet R.

Chapuis C. . C.. ... • Le même curseur peut être ouvert plusieurs fois avec des valeurs de paramètres différentes.. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.Curseur avec paramètre(s) Syntaxe CURSOR nom_curseur CURSOR nom_curseur [(mon_paramètre type.)] IS IS requête.OAI / 103 .)] [(mon_paramètre type. • Affectation des valeurs des paramètres lors de l’ouverture du curseur. Bonnet R. requête.

v_job VARCHAR2) IS (v_deptno NUMBER. 'CLERK'). ename FROM emp FROM emp WHERE deptno = v_deptno WHERE deptno = v_deptno AND job = v_job.. Chapuis Cours PL/SQL d’après cours ORACLE . 'CLERK'). BEGIN BEGIN OPEN emp_cursor(10.Curseur avec paramètre(s) Exemple Exemple Donner le n° département et ll’emploi sous Donner le n° département et ’emploi sous forme de paramètres pour la clause forme de paramètres pour la clause WHERE. ename SELECT empno. Chapuis C. Bonnet // R. Bonnet R. WHERE. C... . DECLARE DECLARE CURSOR emp_cursor CURSOR emp_cursor (v_deptno NUMBER. OPEN emp_cursor(10..OAI / 104 . AND job = v_job. v_job VARCHAR2) IS SELECT empno. .

Mise à jour avec utilisation d’un curseur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI

Clause FOR UPDATE
Syntaxe Syntaxe
SELECT ... SELECT ... FROM ... FROM ... FOR UPDATE [OF nom_colonne][NOWAIT]; FOR UPDATE [OF nom_colonne][NOWAIT];

• Verrouille les lignes sélectionnées pour • Verrouille les lignes sélectionnées pour la durée de la transaction. la durée de la transaction. • Verrouille les lignes avant l’exécution • Verrouille les lignes avant l’exécution d ’un ordre update ou delete. d ’un ordre update ou delete.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 106

Clause FOR UPDATE
Exemple Exemple Sélectionner les employés du Sélectionner les employés du département 30. département 30.
DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno, ename, sal SELECT empno, ename, sal FROM emp FROM emp WHERE deptno = 30 WHERE deptno = 30 FOR UPDATE NOWAIT; FOR UPDATE NOWAIT;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL d’après cours ORACLE - OAI / 107

• Utiliser la clause WHERE CURRENT OF pour faire référence à la dernière ligne distribuée par le curseur. C. Bonnet R. Chapuis C. • Utiliser la clause FOR UPDATE dans l’expression du curseur. • Curseur en vue de modifier ou supprimer les lignes sélectionnées.Clause WHERE CURRENT OF Syntaxe WHERE CURRENT OF nom_curseur.OAI / 108 . Bonnet // R. WHERE CURRENT OF nom_curseur. Chapuis Cours PL/SQL d’après cours ORACLE .

C. Chapuis Cours PL/SQL d’après cours ORACLE . WHERE CURRENT OF sal_cursor. Chapuis C. COMMIT. END.10 SET sal = emp_record. Bonnet // R.Clause WHERE CURRENT OF Exemple Exemple DECLARE DECLARE CURSOR sal_cursor IS CURSOR sal_cursor IS SELECT sal SELECT sal FROM emp FROM emp WHERE deptno = 30 WHERE deptno = 30 FOR UPDATE of sal NOWAIT. COMMIT. BEGIN BEGIN FOR emp_record IN sal_cursor LOOP FOR emp_record IN sal_cursor LOOP UPDATE emp UPDATE emp SET sal = emp_record.sal * 1. END LOOP. Bonnet R. END. END LOOP. FOR UPDATE of sal NOWAIT.OAI / 109 .sal * 1.10 WHERE CURRENT OF sal_cursor.

Gestion des exceptions C. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C.OAI . Bonnet R.

• Différents cas • Différents cas – Erreur diagnostiquée par le SGBDR. C. – Événement généré par le développeur. Chapuis Cours PL/SQL d’après cours ORACLE .Gestion des exceptions en PL/SQL • Exception ? • Exception ? – Tout événement qui survient pendant – Tout événement qui survient pendant l’exécution d ’un ordre. l’exécution d ’un ordre.OAI / 111 . Chapuis C. Bonnet // R. – Capture dans le module qui l’a détectée. – Événement généré par le développeur. – Propagation à l’environnement. Bonnet R. • Gestions • Gestions – Capture dans le module qui l’a détectée. – Erreur diagnostiquée par le SGBDR. – Propagation à l’environnement.

Chapuis C. EXCEPTION Création de l’exception Capture de l’exception END. L’exception n’est pas capturée Exception propagée à l’environnement C. Bonnet R. Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet // R.Gestion des exceptions en PL/SQL Capture de l’exception DECLARE BEGIN Création de l’exception Propagation de l’exception DECLARE BEGIN EXCEPTION END.OAI / 112 .

Types d’Exceptions • Erreur émise par le serveur • Erreur émise par le serveur – Prédéfinies – Prédéfinies – Non prédéfinies – Non prédéfinies • Exception générée par l’utilisateur • Exception générée par l’utilisateur C.OAI / 113 . Chapuis Cours PL/SQL d’après cours ORACLE . Bonnet R. Chapuis C. Bonnet // R.

. instruction2. instruction2. .OAI / 114 . . . instruction2. Bonnet R. . Chapuis C. .] THEN instruction1. Chapuis Cours PL/SQL d’après cours ORACLE . [WHEN exception3 [OR exception4 . instruction2.] .] THEN WHEN exception1 [OR exception2 . .] . . . . . . .] [WHEN OTHERS THEN [WHEN OTHERS THEN instruction1.Capture des Exceptions Syntaxe Syntaxe EXCEPTION EXCEPTION WHEN exception1 [OR exception2 . . . . . instruction2. . instruction1. .] THEN instruction1. instruction1. Bonnet // R. . . instruction2. .] C. .] THEN [WHEN exception3 [OR exception4 . instruction1. .

Chapuis Cours PL/SQL d’après cours ORACLE . section de gestion des exceptions. C. Bonnet // R. • WHEN OTHERS est la dernière clause. • Un seul gestionnaire d’exception est • Un seul gestionnaire d’exception est exécutée suite à la détection d ’une exécutée suite à la détection d ’une exception. Bonnet R.OAI / 115 .Capture des Exceptions • WHEN OTHERS est la dernière clause. • Le mot clé EXCEPTION introduit la • Le mot clé EXCEPTION introduit la section de gestion des exceptions. avant de sortir du bloc. • Plusieurs gestionnaires d’exception • Plusieurs gestionnaires d’exception peuvent être définis dans un même peuvent être définis dans un même bloc. avant de sortir du bloc. bloc. exception. Chapuis C.

• Erreur émise par le serveur. • Exemple de nom-erreurs prédéfinies: • Exemple de nom-erreurs prédéfinies: – NO_DATA_FOUND – NO_DATA_FOUND – TOO_MANY_ROWS – TOO_MANY_ROWS – INVALID_CURSOR – INVALID_CURSOR – ZERO_DIVIDE – ZERO_DIVIDE – DUP_VAL_ON_INDEX – DUP_VAL_ON_INDEX C.Exceptions serveur prédéfinies • Erreur émise par le serveur.OAI / 116 . Bonnet // R. Bonnet R. Chapuis C. Chapuis Cours PL/SQL d’après cours ORACLE . • Repérable par un nom-erreur. • Repérable par un nom-erreur.

END. instruction2.. WHEN TOO_MANY_ROWS THEN instruction1. C. instruction3. WHEN OTHERS THEN instruction1. Bonnet // R.OAI / 117 . Chapuis Cours PL/SQL d’après cours ORACLE . Chapuis C. EXCEPTION WHEN NO_DATA_FOUND THEN instruction1. COMMIT. Bonnet R. instruction2..Utilisation des nom-erreurs Syntaxe Syntaxe BEGIN SELECT .

Exception serveur non prédéfinie Declare Pragma exception_init Référence Section gestion des exceptions Section déclarative • Déclaration • Association à d’un nom d’exception C. Chapuis C. Bonnet // R.OAI / 118 . Bonnet R. Chapuis • Capture de l’exception l’erreur Cours PL/SQL d’après cours ORACLE .

WHERE deptno = v_deptno.PUT_LINE ( ’Suppression imposssible ' ||TO_CHAR(v_deptno) || '.PUT_LINE ( ’Suppression imposssible DBMS_OUTPUT. e_emps_remaining PRAGMA EXCEPTION_INIT ( PRAGMA EXCEPTION_INIT ( PRAGMA EXCEPTION_INIT ( e_emps_remaining. v_deptno dept. Existence d’employés. ').OAI / 119 1 2 3 . DECLARE DECLARE e_emps_remaining EXCEPTION. EXCEPTION EXCEPTION WHEN e_emps_remaining THEN WHEN e_emps_remaining THEN DBMS_OUTPUT. Bonnet R. END. Chapuis Cours PL/SQL d’après cours ORACLE .deptno%TYPE := &p_deptno. BEGIN BEGIN DELETE FROM dept DELETE FROM dept WHERE deptno = v_deptno. '). e_emps_remaining. COMMIT. Existence d’employés.deptno%TYPE := &p_deptno. v_deptno dept. C. -2292). n° -2292 (intégrité référentielle). EXCEPTION. e_emps_remaining. COMMIT.Exception serveur non prédéfinie Déclaration d’un nom-erreur pour ll’erreur Déclaration d’un nom-erreur pour ’erreur n° -2292 (intégrité référentielle). END. e_emps_remaining EXCEPTION. Chapuis C. Bonnet // R. -2292). ' ||TO_CHAR(v_deptno) || '. -2292).

Exception définie par l’utilisateur Declare Section déclarative Raise Section exécution Référence Section gestion des exceptions • Déclaration d’un nom d’exception • Génération de l’exception • Traitement de l’exception C. Chapuis C. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 120 . Bonnet R.

.. . END... …..... END. Chapuis Cours PL/SQL d’après cours ORACLE . . C.. Bonnet // R.. RAISE nom-exception. nom-exception EXCEPTION.OAI / 121 .Exception définie par l’utilisateur Syntaxe Syntaxe DECLARE DECLARE nom-exception EXCEPTION.. Bonnet R. BEGIN BEGIN ….. EXCEPTION EXCEPTION WHEN nom-exception THEN WHEN nom-exception THEN . Chapuis C. . RAISE nom-exception.

Bonnet // R.'). DBMS_OUTPUT. BEGIN BEGIN UPDATE product UPDATE product SET descrip = '&product_description' SET descrip = '&product_description' WHERE prodid = &product_number. e_invalid_product EXCEPTION. WHERE prodid = &product_number. 1 2 3 C. END. e_invalid_product EXCEPTION.PUT_LINE(‘ N° produit inconnu. IF SQL%NOTFOUND THEN IF SQL%NOTFOUND THEN RAISE e_invalid_product. COMMIT. Chapuis C. Bonnet R.PUT_LINE(‘ N° produit inconnu.Exception définie par l’utilisateur Exemple Exemple DECLARE DECLARE EXCEPTION. COMMIT. Chapuis Cours PL/SQL d’après cours ORACLE .OAI / 122 . END IF. RAISE e_invalid_product. EXCEPTION EXCEPTION e_invalid_product WHEN e_invalid_product THEN WHEN e_invalid_product THEN DBMS_OUTPUT. END.'). END IF.

message[. {TRUE | FALSE}]). C. Chapuis C.Procédure RAISE_APPLICATION_ERROR Syntaxe Syntaxe raise_application_error (numéro-erreur. Bonnet // R. d’un bloc PL/SQL. message[. raise_application_error (numéro-erreur. Chapuis Cours PL/SQL d’après cours ORACLE . • Permet de définir une erreur (numéro • Permet de définir une erreur (numéro [entre -20000 et -20999] et texte du message) [entre -20000 et -20999] et texte du message) dans un bloc PL/SQL. dans un bloc PL/SQL. {TRUE | FALSE}]). Bonnet R.OAI / 123 . • Utilisable dans les sections de code • Utilisable dans les sections de code d’un bloc PL/SQL.

OAI / 124 .Procédure RAISE_APPLICATION_ERROR • Utilisable : • Utilisable : – dans la section Exécution – dans la section Exécution – dans la section Exception – dans la section Exception • La génération de l’erreur est conforme • La génération de l’erreur est conforme au standard du serveur et est traitable au standard du serveur et est traitable comme telle. Chapuis C. Bonnet R. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE . C. comme telle.

Bonnet // R.OAI / 125 . C. END. Chapuis Cours PL/SQL d’après cours ORACLE .Procédure RAISE_APPLICATION_ERROR Exemple Exemple … … EXCEPTION EXCEPTION WHEN NO_DATA_FOUND THEN WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20201. ‘ Ligne NON trouvée ’). Chapuis C. Bonnet R. END. RAISE_APPLICATION_ERROR (-20201. ‘ Ligne NON trouvée ’).

Informations associées à toute erreur • SQLCODE • SQLCODE Valeur numérique de l’erreur Valeur numérique de l’erreur • SQLERRM • SQLERRM Texte du message associé à l’erreur Texte du message associé à l’erreur C.OAI / 126 . Bonnet R. Chapuis C. Bonnet // R. Chapuis Cours PL/SQL d’après cours ORACLE .

Bonnet R. EXCEPTION . v_error_code := v_error_message NUMBER. WHEN OTHERS THEN ROLLBACK. SQLCODE . v_error_message). Bonnet // R.Informations associées à une exception serveur DECLARE v_error_code v_error_message BEGIN ...OAI / 127 . Chapuis Cours PL/SQL d’après cours ORACLE .. INSERT INTO errors VALUES(v_error_code. VARCHAR2(255). C. END. Chapuis C.. := SQLERRM .

. e_integrity exception. END. Bonnet R. IF SQL%NOTFOUND THEN RAISE e_no_rows.Propagation d’une exception DECLARE . UPDATE .OAI / 128 .. PRAGMA EXCEPTION_INIT (e_integrity. . WHEN e_no_rows THEN . END LOOP. END. C. EXCEPTION WHEN e_integrity THEN . . Bonnet // R. EXCEPTION WHEN NO_DATA_FOUND THEN . Chapuis C. BEGIN FOR c_record IN emp_cursor LOOP BEGIN SELECT .. -2292).. e_no_rows exception... . Chapuis Cours PL/SQL d’après cours ORACLE . WHEN TOO_MANY_ROWS THEN ... . Un bloc peut gérer ses exceptions ou les transmettre au bloc de niveau supérieur. . END IF. .

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->