PL / SQL
Transcription
PL / SQL
PL / SQL C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Généralités - PL/SQL •• PL/SQL PL/SQL est est une une extension extension procédurale procédurale du du langage langage SQL. SQL. •• Possibilité Possibilité d d ’inclure ’inclure des des requêtes requêtes et et des des ordres ordres de de manipulation manipulation des des données données àà ll ’intérieur ’intérieur d d ’une ’une structure structure algorithmique. algorithmique. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 2 Intérêts du PL/SQL Am élioration des Amélioration des Performances Performances SQL Application Application SQL SQL Noyau Noyau SQL Application Application C. C. Bonnet Bonnet // R. R. Chapuis Chapuis SQL IF...THEN SQL ELSE SQL END IF; SQL Cours PL/SQL d’après cours ORACLE - OAI / 3 Noyau Noyau Intérêts du PL/SQL D éveloppement MODULAIRE Développement MODULAIRE DECLARE BEGIN EXCEPTION END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 4 Intérêts du PL/SQL •• Portabilité. Portabilité. •• Utilisation Utilisation de de variables. variables. •• Structures Structures de de contrôle. contrôle. •• Gestion Gestion des des erreurs erreurs C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 5 PL/SQL Structure de BLOC •• •• DECLARE DECLARE––Facultatif Facultatif ––Variables, Variables,curseurs, curseurs,exceptions exceptions utilisateur utilisateur BEGIN BEGIN––Obligatoire Obligatoire ––Ordres OrdresSQL SQL ––Instructions InstructionsPL/SQL PL/SQL •• EXCEPTION EXCEPTION––Facultatif Facultatif DECLARE ––Actions Actionsààexécuter exécuteren encas casdd’erreur ’erreur •• END; END;––Obligatoire Obligatoire BEGIN EXCEPTION END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 6 Structure BLOC PL/SQL DECLARE DECLARE v_variable v_variable VARCHAR2(5); VARCHAR2(5); BEGIN BEGIN SELECT nom-colonne SELECT nom-colonne INTO v_variable INTO v_variable FROM nom-table_; FROM nom-table_; EXCEPTION EXCEPTION WHEN DECLARE WHEN exception_nom-erreur exception_nom-erreur THEN THEN ... ... BEGIN END; END; EXCEPTION END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 7 Types de BLOC Anonyme Procédure Fonction [DECLARE] [DECLARE] PROCEDURE PROCEDURE name name IS IS BEGIN BEGIN -statements --statements BEGIN BEGIN -statements --statements [EXCEPTION] [EXCEPTION] [EXCEPTION] [EXCEPTION] FUNCTION FUNCTION name name RETURN RETURN datatype datatype IS IS BEGIN BEGIN -statements --statements RETURN RETURN value; value; [EXCEPTION] [EXCEPTION] END; END; END; END; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 8 Utilisation d ’un BLOC Bloc Bloc Anonyme Anonyme DDéclencheur éclencheur Applicatif Applicatif DECLARE BEGIN EXCEPTION DDéclencheur éclencheur Base Base de de Donn ées Données C. C. Bonnet Bonnet // R. R. Chapuis Chapuis END; Cours PL/SQL d’après cours ORACLE - OAI / 9 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 Variables C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Utilisation des Variables en PL/SQL •• Déclaration Déclaration dans dans la la section section DECLARE. DECLARE. •• Affectation Affectation de de valeurs valeurs dans dans la la section section exécution exécution (ou (ou àà la la déclaration). déclaration). •• Passage Passage de de valeurs valeurs pour pour les les procédures procédures et et fonctions. fonctions. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 11 Types de Variables •• Variables Variables PL/SQL PL/SQL :: –– Scalaire Scalaire –– Structurée Structurée –– Référence Référence –– LOB LOB (Grands (Grands Objets Objets -- Large Large Object) Object) •• Variables Variables de de liens liens (Non (Non PL/SQL) PL/SQL) C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 12 Declaration des Variables PL/SQL Syntaxe Syntaxe Nom_variable Nom_variable [CONSTANT] [CONSTANT] type-donnée type-donnée [NOT [NOT NULL] NULL] [{:= [{:= || DEFAULT} DEFAULT} expression]; expression]; Exemples Exemples Declare Declare v_hiredate v_hiredate v_deptno v_deptno v_location v_location c_comm c_comm C. C. Bonnet Bonnet // R. R. Chapuis Chapuis DATE; DATE; NUMBER(2) NUMBER(2) NOT NOT NULL NULL := := 10; 10; VARCHAR2(13) VARCHAR2(13) := := 'Atlanta'; 'Atlanta'; CONSTANT CONSTANT NUMBER NUMBER := := 1400; 1400; Cours PL/SQL d’après cours ORACLE - OAI / 13 Affectation de valeur Syntaxe Syntaxe Nom_variable Nom_variable := := expr; expr; Exemples Exemples Affecter ’embauche. Affecter une une date date d d’embauche. v_hiredate v_hiredate := := To_DATE(’03-JAN-2000','DD-MON-99'); To_DATE(’03-JAN-2000','DD-MON-99'); Affecter employé. Affecter un un nom nom d d ’’employé. v_ename v_ename := := 'Maduro'; 'Maduro'; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 14 Initialisation d’une variable Possible Possible dans dans la la section section DECLARE DECLARE par par :: •• Opérateur Opérateur d’affectation d’affectation (:=) (:=) •• DEFAULT DEFAULT valeur valeur •• NOT NOT NULL NULL Exemples Exemples:: v_mgr v_mgr NUMBER(4) NUMBER(4) DEFAULT DEFAULT 7839 7839 v_loc v_loc VARCHAR2(50) VARCHAR2(50) NOT NOT NULL NULL := := 'PARIS' 'PARIS' C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 15 Type Scalaire •• VARCHAR2 VARCHAR2 (longueur-maximale) (longueur-maximale) VARCHAR VARCHAR •• NUMBER NUMBER [(précision, [(précision, décimales)] décimales)] •• DATE DATE •• CHAR CHAR [(longueur-maximale)] [(longueur-maximale)] •• LONG LONG •• LONG LONG RAW RAW •• BOOLEAN BOOLEAN •• BINARY_INTEGER BINARY_INTEGER •• PLS_INTEGER PLS_INTEGER C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 16 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 C. C. Bonnet Bonnet // R. R. Chapuis Chapuis VARCHAR2(9); VARCHAR2(9); BINARY_INTEGER BINARY_INTEGER := := 0; 0; NUMBER(9,2) := 0; NUMBER(9,2) := 0; DATE DATE := := SYSDATE SYSDATE ++ 7; 7; CONSTANT CONSTANT NUMBER(3,2) NUMBER(3,2) := := 8.25; 8.25; BOOLEAN BOOLEAN NOT NOT NULL NULL := := TRUE; TRUE; Cours PL/SQL d’après cours ORACLE - OAI / 17 Déclaration de type par référence •• Déclarer Déclarer une une variable variable par par référence référence àà :: –– Une Une colonne colonne de de table. table. –– Une Une autre autre variable variable déclarée. déclarée. •• Utilisation Utilisation du du suffixe suffixe %TYPE %TYPE après après :: –– Nom-table.nom-colonne. Nom-table.nom-colonne. –– Nom-variable Nom-variable C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 18 Déclaration de type par référence Exemples Exemples ... ... v_ename v_ename v_balance v_balance v_min_balance v_min_balance ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis emp.ename%TYPE; emp.ename%TYPE; NUMBER(7,2); NUMBER(7,2); v_balance%TYPE v_balance%TYPE := := 10; 10; Cours PL/SQL d’après cours ORACLE - OAI / 19 Déclaration de Type Booléen •• Valeurs Valeurs TRUE, TRUE, FALSE FALSE ou ou NULL. NULL. •• Opérateurs Opérateurs AND, AND, OR, OR, et et NOT. NOT. •• Possibilité Possibilité d’obtenir d’obtenir une une valeur valeur booléenne booléenne àà partir partir d’une d’une expression expression arithmétique arithmétique ou ou chaîne chaîne de de caractères. caractères. v_comm_sal v_comm_sal BOOLEAN BOOLEAN := := (v_sal (v_sal << v_comm); v_comm); C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 20 Types Structurés •• PL/SQL PL/SQL Table Table •• PL/SQL PL/SQL Enregistrement Enregistrement (RECORD) (RECORD) C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 21 Type LOB Texte (CLOB) Photo (BLOB) Film (BFILE) NCLOB C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 22 Variables de lien Variable de lien Serveur C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 23 Référence à une variable de lien Variable Variable de de lien lien ou ou Variable Variable hôte hôte Pr éfixer le :) Préfixer le nom nom de de variable variable par par ((:) Exemple Exemple :: Ranger Ranger le le salaire salaire annuel annuel dans dans une une variable variable de de lien lien :: :g_monthly_sal :g_monthly_sal := := v_sal v_sal // 12; 12; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 24 Visualisation des variables : DBMS_OUTPUT.PUT_LINE •• DBMS_OUTPUT DBMS_OUTPUT :: package package fourni fourni par par Oracle Oracle •• Procédure Procédure PUT_LINE PUT_LINE :: affichage affichage de de la la valeur valeur d d ’une ’une variable. variable. •• Utilisable Utilisable sous sous SQL*PLUS SQL*PLUS avec avec l’option l’option SET SET SERVEROUTPUT SERVEROUTPUT ON 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')); C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 25 Instructions C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI BLOC PL/SQL Syntaxe •• Une Une instruction instruction peut peut être être écrite écrite sur sur plusieurs plusieurs lignes. lignes. •• Chaque Chaque instruction instruction est est terminée terminée par par (;) (;) •• Identificateur Identificateur :: –– Permet Permet de de référencer référencer un un élément élément PL/SQL. PL/SQL. –– Doit Doit commencer commencer par par une une lettre. lettre. –– Maximum Maximum 30 30 caractères. caractères. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 27 Syntaxe : Ligne Commentaire •• Une Une seule seule ligne ligne :: deux deux tirets tirets (--) (--) en en début début de de ligne. ligne. •• Plusieurs Plusieurs lignes lignes entre entre les les symboles symboles :: /* /* et et */. */. Exemple Exemple ... ... v_sal v_sal NUMBER NUMBER (9,2); (9,2); BEGIN BEGIN /* /* calcul calcul du du salaire salaire annuel annuel àà partir partir de de données données fournies fournies par par l’utilisateur l’utilisateur */ */ v_sal v_sal := := :p_monthly_sal :p_monthly_sal ** 12; 12; END; END; --- fin fin de de la la transaction transaction C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 28 Fonctions SQL en PL/SQL •• Utilisables Utilisables :: –– Fonction-ligne Fonction-ligne numérique numérique –– Fonction-ligne Fonction-ligne alphanumérique alphanumérique –– Conversion Conversion de de type type –– Date Date •• Non Non utilisables utilisables :: –– DECODE DECODE –– Fonctions Fonctions de de groupe groupe C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 29 Fonctions SQL en PL/SQL Exemples Exemples •• Adresse Adresse complète complète d’une d’une entreprise entreprise :: v_mailing_address v_mailing_address := := v_name||CHR(10)|| 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 Mettre le le nom nom d d ’employé ’employé en en lettres lettres minuscules minuscules :: v_ename v_ename C. C. Bonnet Bonnet // R. R. Chapuis Chapuis := := LOWER(v_ename); LOWER(v_ename); Cours PL/SQL d’après cours ORACLE - OAI / 30 Blocs Imbriqués (Nested Blocks) Exemple Exemple ... ... xx BINARY_INTEGER; BINARY_INTEGER; BEGIN BEGIN ... ... DECLARE DECLARE yy NUMBER; NUMBER; BEGIN BEGIN ... ... END; END; ... ... END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Bloc externe Bloc imbriqué Cours PL/SQL d’après cours ORACLE - OAI / 31 Blocs Imbriqués •• Un Un bloc bloc peut peut être être inséré inséré en en lieu lieu et et place place d’une d’une instruction. instruction. •• Un Un bloc bloc imbriqué imbriqué correspond correspond àà une une instruction. instruction. •• La La section section EXCEPTION EXCEPTION peut peut contenir contenir des des blocs blocs imbriqués. imbriqués. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 32 Blocs Imbriqués Visibilité des variables Un Un identificateur identificateur (variable, (variable, curseur) curseur) est est visible és par visible dans dans tous tous les les blocs blocs imbriqu imbriqués par rapport ù ilil est éfini. rapport àà celui celui o où est d défini. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 33 Blocs Imbriqués Visibilité des variables Exemple Exemple ... ... xx BINARY_INTEGER; BINARY_INTEGER; BEGIN BEGIN ... ... DECLARE DECLARE yy NUMBER; NUMBER; BEGIN BEGIN ... ... END; END; ... ... END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Visibilité de x Visibilité de y Cours PL/SQL d’après cours ORACLE - OAI / 34 Blocs Imbriqués Visibilité des variables ... ... DECLARE DECLARE V_SAL V_SAL V_COMM V_COMM V_MESSAGE V_MESSAGE BEGIN BEGIN ... ... NUMBER(7,2) NUMBER(7,2) := := 60000; 60000; NUMBER(7,2) NUMBER(7,2) := := V_SAL V_SAL ** .20; .20; VARCHAR2(255) VARCHAR2(255) := := '' eligible eligible for for commission'; commission'; DECLARE DECLARE V_SAL NUMBER(7,2) V_SAL NUMBER(7,2) := := 50000; 50000; V_COMM NUMBER(7,2) V_COMM NUMBER(7,2) := := 0; 0; V_TOTAL_COMP NUMBER(7,2) V_TOTAL_COMP NUMBER(7,2) := := V_SAL V_SAL ++ V_COMM; V_COMM; BEGIN ... BEGIN ... V_MESSAGE V_MESSAGE := := 'CLERK 'CLERK not'||V_MESSAGE; not'||V_MESSAGE; END; END; V_MESSAGE V_MESSAGE := := 'SALESMAN'||V_MESSAGE; 'SALESMAN'||V_MESSAGE; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 35 Opérateurs en PL/SQL •• Logique Logique •• Arithmétique Arithmétique •• Concaténation Concaténation •• Parenthèses Parenthèses possibles possibles •• Opérateur Opérateur exponentiel exponentiel (**) (**) C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 36 Opérateurs en PL/SQL Exemples Exemples •• Incrément Incrément de de l’indice l’indice d’une d’une boucle. boucle. v_count v_count := := v_count v_count ++ 1; 1; •• Initialisation Initialisation de de valeur valeur pour pour un un indicateur indicateur booléen. booléen. v_equal v_equal := := (v_n1 (v_n1 == v_n2); v_n2); •• Test Test de de la la valeur valeur d’un d’un numéro numéro d’employé d’employé v_valid v_valid C. C. Bonnet Bonnet // R. R. Chapuis Chapuis := := (v_empno (v_empno IS IS NOT NOT NULL); NULL); Cours PL/SQL d’après cours ORACLE - OAI / 37 Accès aux données C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Ordres SQL en PL/SQL •• Consultation Consultation par par SELECT SELECT :: une une seule seule ligne ligne peut peut être être retournée. retournée. •• Modification Modification des des données données par par les les ordres ordres de de manipulation manipulation INSERT, INSERT, UPDATE UPDATE DELETE. DELETE. •• Contrôle Contrôle des des transactions transactions par par COMMIT, COMMIT, ROLLBACK, ROLLBACK, ou ou SAVEPOINT. SAVEPOINT. •• Curseur Curseur implicite. implicite. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 39 Ordre SELECT en PL/SQL Consultation ées. Consultation de de la la base base de de donn données. Syntaxe Syntaxe SELECT SELECT INTO INTO liste liste de de projection projection {nom {nom variable[, variable[, nom nom variable]... variable]... || nom nom enregistrement} enregistrement} FROM table FROM table WHERE WHERE condition; condition; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 40 Ordre SELECT en PL/SQL Utilisation Utilisation de de la la clause clause :: INTO INTO Exemple Exemple DECLARE DECLARE v_deptno v_deptno v_loc v_loc BEGIN BEGIN SELECT SELECT INTO INTO FROM FROM WHERE WHERE ... ... END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis NUMBER(2); NUMBER(2); VARCHAR2(15); VARCHAR2(15); deptno, deptno, loc loc v_deptno, v_deptno, v_loc v_loc dept dept dname dname == 'SALES'; 'SALES'; Cours PL/SQL d’après cours ORACLE - OAI / 41 Ordre SELECT en PL/SQL Exemple Exemple Montant és Montant total total des des salaires salaires des des employ 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; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis emp.sal%TYPE; emp.sal%TYPE; NUMBER NUMBER NOT NOT NULL NULL := := 10; 10; SUM(sal) SUM(sal) --- fonction fonction de de groupe groupe v_sum_sal v_sum_sal emp emp deptno deptno == v_deptno; v_deptno; Cours PL/SQL d’après cours ORACLE - OAI / 42 Mise à jour des données Utilisation Utilisation des des ordres ordres :: •• INSERT INSERT •• UPDATE UPDATE •• DELETE DELETE INSERT UPDATE DELETE C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 43 Ajout de données Exemple Exemple Ajout un nouvel é dans Ajout d d ’’un nouvel employ employé dans la la table table EMP. EMP. BEGIN BEGIN INSERT INSERT INTO INTO emp(empno, emp(empno, ename, ename, job, job, deptno) deptno) VALUES(empno_sequence.NEXTVAL, VALUES(empno_sequence.NEXTVAL, 'HARDING', 'HARDING', 'CLERK', 'CLERK', 10); 10); END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 44 Modification de données Exemple Exemple Modification Modification de de la la valeur valeur du du salaire salaire des des employ és 'ANALYST' employés 'ANALYST'.. DECLARE v_sal_increase emp.sal%TYPE := 2000; BEGIN UPDATE emp SET sal = sal + v_sal_increase WHERE job = 'ANALYST'; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 45 Suppression de données Exemple Exemple Supprimer és d ’un Supprimer les les employ employés d’un d épartement .. département DECLARE DECLARE v_deptno emp.deptno%TYPE v_deptno emp.deptno%TYPE := := 10; 10; BEGIN BEGIN DELETE emp DELETE FROM FROM emp WHERE WHERE deptno deptno == v_deptno; v_deptno; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 46 Ordres COMMIT et ROLLBACK •• Début Début de de transaction transaction :: premier premier ordre ordre LMD. LMD. •• Fin Fin de de transaction transaction explicite explicite :: COMMIT COMMIT ou ou ROLLBACK. ROLLBACK. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 47 Accès multilignes C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Curseur SQL •• Zone Zone de de travail travail privée. privée. •• Deux Deux types types de de curseurs curseurs :: –– Implicite Implicite –– Explicite Explicite (déclaré) (déclaré) •• Toute Toute exécution exécution d’ordre d’ordre SQL SQL utilise utilise un un curseur. curseur. •• Un Un code code statut statut est est positionné positionné àà la la fin fin d d ’exécution ’exécution de de l’ordre l’ordre SQL. SQL. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 49 Curseur IMPLICITE - Statut Positionn é àà la ’exécution de ’ordre. Positionné la fin fin d d’exécution de ll’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. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 50 Curseur IMPLICITE - Statut Exemple Exemple Affichage Affichage du du nombre nombre de de lignes lignes supprim ées. 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 C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 51 Structures de contrôle C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Structures de contrôle Deux Deux structures structures :: Alternative Alternative R épétitive. Répétitive. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 53 Structures de contrôle STRUCTURE STRUCTURE ALTERNATIVE ALTERNATIVE Instruction Instruction IF IF Trois Trois formes formes :: •• IF-THEN-END IF-THEN-END IF IF •• IF-THEN-ELSE-END IF-THEN-ELSE-END IF IF •• IF-THEN-ELSIF-END IF-THEN-ELSIF-END IF IF C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 54 Instruction IF Syntaxe Syntaxe IF IF condition condition THEN THEN instructions; instructions; [ELSIF [ELSIF condition condition THEN THEN instructions;] instructions;] [ELSE [ELSE instructions;] instructions;] END END IF; IF; Exemple Exemple :: N ° manager é == Osborne. N° manager == 22 22 si si nom nom employ employé Osborne. IF IF v_ename v_ename v_mgr v_mgr := := END END IF; IF; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis == 'OSBORNE' 'OSBORNE' THEN THEN 22; 22; Cours PL/SQL d’après cours ORACLE - OAI / 55 Instruction IF-THEN-ELSE FAUX VRAI IF condition THEN THEN actions actions (incluant (incluant autres autres IF) IF) C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 56 ELSE ELSE actions actions (incluant (incluant autres autres IF) IF) Instruction IF-THEN-ELSE Exemple Exemple ... ... IF IF v_shipdate v_shipdate v_ship_flag v_ship_flag ELSE ELSE v_ship_flag v_ship_flag END END IF; IF; ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis -- v_orderdate v_orderdate << 55 THEN THEN := := 'Acceptable'; 'Acceptable'; := := 'Unacceptable'; 'Unacceptable'; Cours PL/SQL d’après cours ORACLE - OAI / 57 Instruction IF-THEN-ELSIF IF IF condition condition FAUX VRAI ELSIF ELSIF condition condition THEN THEN actions actions VRAI THEN THEN actions actions C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 58 FAUX ELSE ELSE actions actions Instruction IF-THEN-ELSIF Exemple Exemple .. .. .. IF IF v_start v_start >> 100 100 THEN THEN v_start v_start := := 22 ** v_start; v_start; ELSIF ELSIF v_start v_start >= >= 50 50 THEN THEN v_start v_start := := .5 .5 ** v_start; v_start; ELSE ELSE v_start v_start := := .1 .1 ** v_start; v_start; END END IF; IF; .. .. .. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 59 Structure répétitive •• Une Une boucle boucle répète répète une une instruction instruction ou ou une une séquence séquence d’instructions d’instructions plusieurs plusieurs fois. fois. •• Trois Trois possibilités possibilités :: –– instruction instruction LOOP LOOP –– Instruction Instruction FOR FOR –– instruction instruction WHILE WHILE C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 60 Instruction Loop Syntaxe Syntaxe LOOP LOOP instruction(s); instruction(s); .. .. .. EXIT EXIT [WHEN [WHEN condition]; condition]; END END LOOP; LOOP; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis -- début de boucle -- instructions -- EXIT instruction -- fin de boucle Cours PL/SQL d’après cours ORACLE - OAI / 61 Instruction Loop Exemple Exemple DECLARE DECLARE v_ordid item.ordid%TYPE v_ordid item.ordid%TYPE := := 601; 601; v_counter v_counter NUMBER(2) NUMBER(2) := := 1; 1; BEGIN BEGIN LOOP LOOP INSERT INSERT INTO INTO item(ordid, item(ordid, itemid) itemid) VALUES(v_ordid, VALUES(v_ordid, v_counter); v_counter); v_counter v_counter := := v_counter v_counter ++ 1; 1; EXIT EXIT WHEN WHEN v_counter v_counter >> 10; 10; END END LOOP; LOOP; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 62 Instruction FOR Syntaxe Syntaxe FOR FOR indice indice in in [REVERSE] [REVERSE] borne-inférieure..borne-supérieure borne-inférieure..borne-supérieure LOOP LOOP instruction instruction 1; 1; instruction instruction 2; 2; .. .. .. END END LOOP; LOOP; •• Le Le nombre nombre de de répétitions répétitions est est contrôlé contrôlé par par l’indice. l’indice. •• Ne Ne pas pas déclarer déclarer l’indice, l’indice, sa sa déclaration déclaration est est implicite. implicite. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 63 Instruction FOR R ègles :: Règles •• L’indice L’indice n’est n’est utilisable utilisable qu’à qu’à l’intérieur l’intérieur de de la la boucle. boucle. •• IlIl est est interdit interdit d’affecter d’affecter une une valeur valeur àà l’indice. l’indice. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 64 Instruction FOR Exemple Exemple Cr éation de Création de 10 10 lignes lignes pour pour la la commande commande de de n ° 601. n° 601. DECLARE DECLARE v_ordid item.ordid%TYPE v_ordid item.ordid%TYPE BEGIN BEGIN FOR FOR ii IN IN 1..10 1..10 LOOP LOOP INSERT INSERT INTO INTO item(ordid, item(ordid, VALUES(v_ordid, VALUES(v_ordid, i); i); END END LOOP; LOOP; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis := := 601; 601; itemid) itemid) Cours PL/SQL d’après cours ORACLE - OAI / 65 Instruction WHILE Syntaxe Syntaxe WHILE WHILE condition condition LOOP LOOP instruction instruction 1; 1; instruction2; instruction2; .. .. .. END END LOOP; LOOP; La condition est évaluée en début de boucle. Les Les instructions instructions de de la la boucle boucle sont sont rrépétées épétées tant tant que que la la condition condition est est vraie. vraie. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 66 Instruction WHILE Exemple Exemple ACCEPT ACCEPT p_new_order p_new_order PROMPT PROMPT 'Enter 'Enter the the order order number: number: ACCEPT ACCEPT p_items p_items -PROMPT PROMPT 'Enter 'Enter the the number number of of items items in in this this order: order: DECLARE DECLARE v_count NUMBER(2) v_count NUMBER(2) := := 1; 1; BEGIN BEGIN WHILE WHILE v_count v_count <= <= &p_items &p_items LOOP LOOP INSERT INSERT INTO INTO item item (ordid, (ordid, itemid) itemid) VALUES VALUES (&p_new_order, (&p_new_order, v_count); v_count); v_count v_count := := v_count v_count ++ 1; 1; END END LOOP; LOOP; COMMIT; COMMIT; END; END; // C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 67 '' '' Structures imbriquées et étiquettes •• Plusieurs Plusieurs niveaux niveaux d’imbrication d’imbrication possibles. possibles. •• Utiliser Utiliser des des étiquettes étiquettes pour pour différencier différencier BLOC BLOC et et Structure Structure imbriquées. imbriquées. •• Possibilité Possibilité de de sortir sortir d’une d’une boucle boucle interne interne par par ll ’ordre ’ordre EXIT. EXIT. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 68 Structures imbriquées et étiquettes ... ... BEGIN BEGIN <<Boucle-externe>> <<Boucle-externe>> LOOP LOOP v_counter v_counter := := v_counter+1; v_counter+1; EXIT EXIT WHEN WHEN v_counter>10; v_counter>10; <<Boucle-interne>> <<Boucle-interne>> LOOP LOOP ... ... EXIT EXIT Boucle-externe Boucle-externe WHEN WHEN prédicat; prédicat; -Sortie des deux boucles -- Sortie des deux boucles EXIT EXIT WHEN WHEN prédicat; prédicat; --- sortie sortie de de la la boucle boucle interne interne uniquement uniquement ... ... END END LOOP LOOP boucle-interne; boucle-interne; ... ... END END LOOP LOOP Boucle-externe; Boucle-externe; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 69 Utilisation des Types Structurés : Enregistrement Tableau C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Types Structurés •• Deux Deux types: types: –– Enregistrement Enregistrement (RECORD) (RECORD) –– Tableau Tableau (TABLE (TABLE PL/SQL) PL/SQL) •• Contiennent Contiennent des des composants composants internes internes •• Sont Sont réutilisables réutilisables C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 71 Enregistrement PL/SQL •• Peut Peut contenir contenir un un ou ou plusieurs plusieurs composants composants de de type type :: scalaire, scalaire, RECORD RECORD ou ou TABLE TABLE PL/SQL. PL/SQL. •• Identique Identique àà la la structure structure enregistrement enregistrement en en L3G. L3G. •• Différent Différent de de la la notion notion de de ligne ligne de de table table relationnelle. relationnelle. •• Considère Considère un un ensemble ensemble de de champs champs comme comme une une unité unité logique. logique. •• Peut Peut être être utilisé utilisé pour pour recevoir recevoir une une ligne ligne de de table. table. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 72 Déclaration d’un type Enregistrement Syntaxe Syntaxe TYPE TYPE nom_type nom_type IS IS RECORD RECORD (déclaration (déclaration de de champ[, champ[, nom_variable nom_variable nom_type; nom_type; --- déclaration déclaration déclaration déclaration de de --- déclaration déclaration de de type type champ]…); champ]…); de de variable variable Avec éclaration de Avec d déclaration de champ champ :: Nom_champ Nom_champ {type_champ {type_champ || variable%TYPE variable%TYPE || table.colonne%TYPE table.colonne%TYPE || table%ROWTYPE} table%ROWTYPE} [[NOT [[NOT NULL] NULL] {:= {:= || DEFAULT} DEFAULT} expression] expression] C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 73 Déclaration d’un type Enregistrement Exemple Exemple D éclaration d une variable Déclaration d ’’une variable pour pour stocker stocker nom, ’un employ é. nom, emploi, emploi, et et salaire salaire d d’un employé. ... ... TYPE TYPE emp_record_type emp_record_type IS IS RECORD RECORD (ename VARCHAR2(10), (ename VARCHAR2(10), job VARCHAR2(9), job VARCHAR2(9), sal NUMBER(7,2)); sal NUMBER(7,2)); emp_record emp_record_type; emp_record emp_record_type; ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 74 Utilisation de %ROWTYPE •• Permet Permet de de déclarer déclarer une une variable variable de de même même structure structure qu’une qu’une ligne ligne de de table table ou ou de de vue. vue. •• Nom_table%ROWTYPE. Nom_table%ROWTYPE. •• Les Les champs champs de de l’enregistrement l’enregistrement ont ont même même nom nom et et même même type type que que ceux ceux des des colonnes colonnes de de la la table table ou ou de de la la vue. vue. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 75 Utilisation de %ROWTYPE Exemples Exemples D éclarer une Déclarer une variable variable pour pour stocker stocker la la même éfinie dans même information information que que celle celle ddéfinie dans la la table table DEPT. DEPT. dept_record dept_record dept%ROWTYPE; dept%ROWTYPE; D éclare une Déclare une variable variable pour pour stocker stocker la la même éfinie dans même information information que que celle celle ddéfinie dans la la table table EMP. EMP. emp_record emp_record C. C. Bonnet Bonnet // R. R. Chapuis Chapuis emp%ROWTYPE; emp%ROWTYPE; Cours PL/SQL d’après cours ORACLE - OAI / 76 Avantage de %ROWTYPE •• IlIl n n ’est ’est pas pas nécessaire nécessaire de de connaître connaître les les caractéristiques caractéristiques des des colonnes colonnes de de la la ligne ligne de de référence référence .. •• Mise Mise àà jour jour automatique automatique en en cas cas de de modification modification de de la la structure structure de de la la ligne ligne de de référence. référence. •• Utilisable Utilisable avec avec SELECT SELECT pour pour recueillir recueillir les les données données d’une d’une ligne. ligne. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 77 Tables PL/SQL •• Composé Composé de de postes postes identiques identiques de de type type :: –– Scalaire Scalaire –– Enregistrement Enregistrement •• Référence Référence àà un un poste poste par par clé clé primaire primaire (PRIMARY (PRIMARY KEY) KEY) de de type type BINARY_INTEGER BINARY_INTEGER C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 78 Déclaration d’un type Table Syntaxe Syntaxe -- poste poste de de type type scalaire scalaire TYPE TYPE nom_type nom_type IS IS TABLE TABLE OF OF {type_colonne {type_colonne || variable%TYPE variable%TYPE || table.colonne%TYPE} table.colonne%TYPE} [NOT [NOT NULL] NULL] INDEX INDEX BY BY BINARY_INTEGER; BINARY_INTEGER; nom_variable nom_variable nom_type; nom_type; Exemple Exemple D éclarer une Déclarer une table table de de noms. noms. ... ... TYPE TYPE nom_table_type nom_table_type IS IS TABLE TABLE OF OF emp.ename%TYPE emp.ename%TYPE INDEX INDEX BY BY BINARY_INTEGER; BINARY_INTEGER; table_nom table_nom nom_table_type; nom_table_type; ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 79 Structure Table PL/SQL Clé primaire Colonne ... ... 1 Jones 2 Smith 3 Maduro ... ... BINARY_INTEGER Scalaire C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 80 Création d’une Table PL/SQL DECLARE DECLARE TYPE TYPE ename_table_type ename_table_type IS IS TABLE TABLE OF OF emp.ename%TYPE emp.ename%TYPE INDEX INDEX BY BY BINARY_INTEGER; BINARY_INTEGER; TYPE TYPE hiredate_table_type hiredate_table_type IS IS TABLE TABLE OF OF DATE DATE INDEX INDEX BY BY BINARY_INTEGER; BINARY_INTEGER; ename_table ename_table_type; ename_table ename_table_type; hiredate_table hiredate_table hiredate_table_type; hiredate_table_type; BEGIN BEGIN ename_table(1) ename_table(1) := := 'CAMERON'; 'CAMERON'; hiredate_table(8) hiredate_table(8) := := SYSDATE SYSDATE ++ 7; 7; IF IF ename_table.EXISTS(1) ename_table.EXISTS(1) THEN THEN INSERT INSERT INTO INTO ... ... ... ... END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 81 Méthodes PL/SQL associées à la structure Table M éthodes fournies Méthodes fournies en en standard standard :: •• EXISTS EXISTS •• COUNT COUNT •• FIRST, FIRST, LAST LAST •• PRIOR PRIOR C. C. Bonnet Bonnet // R. R. Chapuis Chapuis •• NEXT NEXT •• EXTEND EXTEND •• TRIM TRIM •• DELETE DELETE Cours PL/SQL d’après cours ORACLE - OAI / 82 Table d’enregistrements Syntaxe Syntaxe -- poste poste de de type type enregistrement enregistrement •• Utilisation Utilisation de de %ROWTYPE. %ROWTYPE. Exemple Exemple •• Déclarer Déclarer une une variable variable pour pour recevoir recevoir les les données données de de la la table table DEPT. DEPT. DECLARE DECLARE TYPE TYPE dept_table_type dept_table_type IS IS TABLE TABLE OF OF dept%ROWTYPE dept%ROWTYPE INDEX INDEX BY BY BINARY_INTEGER; BINARY_INTEGER; dept_table dept_table dept_table_type; dept_table_type; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 83 CURSEUR Explicite C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Curseur Tout Tout ordre ordre SQL SQL utilise utilise un un curseur curseur pour pour ss’exécuter ’exécuter :: •• curseur curseur implicite implicite –– tout tout ordre ordre LMD LMD (DML) (DML) –– SELECT SELECT … … INTO INTO ... ... sous sous PL/SQL PL/SQL •• curseur curseur explicite explicite –– déclaré déclaré dans dans un un module module C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 85 Structure (simplifi ée) du curseur (simplifiée) Lignes sélectionnées Cursor C. C. Bonnet Bonnet // R. R. Chapuis Chapuis 7369 SMITH CLERK 7566 JONES MANAGER 7788 SCOTT ANALYST 7876 ADAMS CLERK 7902 FORD ANALYST Cours PL/SQL d’après cours ORACLE - OAI / 86 Ligne Courante Mise en œ uvre curseur explicite œuvre Non oui DECLARE DECLARE • Déclaration OPEN OPEN FETCH FETCH FIN? • Ouverture • Distribution • Teste requête SQL C. C. Bonnet Bonnet // R. R. Chapuis Chapuis et exécution ligne courante Cours PL/SQL d’après cours ORACLE - OAI / 87 existence ligne CLOSE CLOSE • Libération du curseur Mise en œ uvre curseur explicite œuvre Ouverture curseur. Pointeur Curseur Distribution ligne courante. Pointeur Curseur … jusqu’à fin. Pointeur Curseur Fermeture du curseur. Curseur C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 88 D éclaration du curseur Déclaration Syntaxe Syntaxe CURSOR CURSOR nom_curseur nom_curseur IS IS requête; requête; •• Requête Requête sans sans clause clause INTO. INTO. •• Possibilité Possibilité de de clause clause ORDER ORDER BY. BY. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 89 D éclaration du curseur Déclaration Exemple Exemple DECLARE DECLARE CURSOR CURSOR emp_cursor emp_cursor IS IS SELECT SELECT empno, empno, ename ename FROM emp; FROM emp; BEGIN BEGIN ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 90 Ouverture du curseur Syntaxe Syntaxe OPEN OPEN nom_curseur; nom_curseur; •• Exécution Exécution de de la la requête requête et et génération génération des des lignes lignes résultats résultats au au niveau niveau du du serveur. serveur. •• Pas Pas d’erreur d’erreur si si la la requête requête ne ne sélectionne sélectionne pas pas de de ligne. ligne. •• Possibilité Possibilité de de tester tester le le statut statut du du curseur curseur après après exécution exécution de de l’ordre l’ordre FETCH. FETCH. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 91 Distribution des lignes Syntaxe Syntaxe FETCH FETCH nom_curseur nom_curseur INTO INTO [variable1, [variable1, variable2, variable2, ...] ...] || [nom_enregistrement]; [nom_enregistrement]; •• Distribue Distribue les les valeurs valeurs des des colonnes colonnes de de la la ligne ligne courante courante dans dans les les variables variables de de réception. réception. •• Effectue Effectue une une correspondance correspondance par par position. position. •• Renvoie Renvoie un un code code statut. statut. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 92 Mise en œuvre de l ’ordre FETCH •• Inclure Inclure ll ’ordre ’ordre FETCH FETCH dans dans une une structure structure répétitive. répétitive. •• Une Une ligne ligne est est distribuée distribuée àà chaque chaque itération. itération. •• Utiliser Utiliser %NOTFOUND %NOTFOUND ou ou %FOUND %FOUND pour pour contrôler contrôler la la sortie sortie de de la la boucle. boucle. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 93 Distribution des lignes Exemples Exemples FETCH FETCH emp_cursor emp_cursor INTO INTO v_empno, v_empno, v_ename; v_ename; ... ... OPEN OPEN nom_curseur; nom_curseur; LOOP LOOP FETCH FETCH nom_curseur nom_curseur INTO INTO variables variables EXIT EXIT WHEN WHEN nom_curseur%NOTFOUND...; nom_curseur%NOTFOUND...; ... ... --- utilisation utilisation des des valeurs valeurs distribuées distribuées àà chaque chaque itération itération ... ... END END LOOP; LOOP; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 94 Fermeture du curseur Syntaxe Syntaxe CLOSE CLOSE nom_curseur; nom_curseur; •• Ferme Ferme le le curseur curseur et et libère libère les les ressources. ressources. •• Possibilité Possibilité de de ré-ouvrir ré-ouvrir le le même même curseur. curseur. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 95 Codes statut d'un curseur Informent ’état du Informent sur sur ll’état du curseur. 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 C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 96 %ISOPEN •• La La distribution distribution de de ligne ligne ne ne s’effectue s’effectue que que pour pour un un curseur curseur ouvert. ouvert. •• Permet Permet de de savoir savoir si si un un curseur curseur est est ouvert ouvert avant avant d’exécuter d’exécuter un un ordre ordre fetch. fetch. Exemple Exemple IF IF NOT NOT emp_cursor%ISOPEN emp_cursor%ISOPEN THEN THEN OPEN OPEN emp_cursor; emp_cursor; END END IF; IF; LOOP LOOP FETCH FETCH emp_cursor... emp_cursor... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 97 NOTFOUND ROWCOUNT et FOUND •• %ROWCOUNT %ROWCOUNT donne, donne, après après chaque chaque exécution exécution de de l’ordre l’ordre fetch, fetch, le le nombre nombre de de lignes lignes distribuées. distribuées. •• %NOTFOUND %NOTFOUND indique indique la la fin fin de de distribution distribution des des lignes lignes d’un d’un curseur. curseur. •• %FOUND %FOUND testé testé après après exécution exécution du du premier premier ordre ordre fetch fetch indique indique si si la la requête requête aa sélectionné sélectionné au au moins moins une une ligne. ligne. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 98 Curseur et Enregistrement Distribution ées de Distribution des des donn données de la la ligne ligne dans dans une une structure structure RECORD. RECORD. Exemple Exemple DECLARE DECLARE CURSOR CURSOR emp_cursor emp_cursor IS IS SELECT SELECT empno, empno, ename ename FROM emp; FROM emp; emp_record emp_record emp_cursor%ROWTYPE; emp_cursor%ROWTYPE; BEGIN BEGIN OPEN OPEN emp_cursor; emp_cursor; LOOP LOOP FETCH FETCH emp_cursor emp_cursor INTO INTO emp_record; emp_record; ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 99 Curseur et Enregistrement - utilisation de For Syntaxe Syntaxe FOR FOR nom_enregistrement nom_enregistrement IN IN nom_curseur nom_curseur LOOP LOOP instruction1; instruction1; instruction2; instruction2; .. .. .. END END LOOP; LOOP; •• Raccourci Raccourci pour pour gérer gérer la la distribution distribution des des lignes. lignes. •• Exécute Exécute toutes toutes les les étapes étapes (open, (open, fetch, fetch, close). close). •• Déclaration Déclaration implicite implicite de de l’enregistrement. l’enregistrement. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 100 Curseur et Enregistrement - utilisation de For Exemple Exemple DECLARE DECLARE CURSOR CURSOR emp_cursor emp_cursor IS IS SELECT ename, deptno SELECT ename, deptno FROM emp; FROM emp; BEGIN BEGIN FOR FOR emp_record emp_record IN IN emp_cursor emp_cursor LOOP LOOP --- open open et et fetch fetch implicites implicites IF IF emp_record.deptno emp_record.deptno == 30 30 THEN THEN ... ... END END LOOP; LOOP; --- close close implicite implicite END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 101 Curseur paramétré C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Curseur avec paramètre(s) Syntaxe CURSOR CURSOR nom_curseur nom_curseur [(mon_paramètre [(mon_paramètre type, type, ...)] ...)] IS IS requête; requê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. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 103 Curseur avec paramètre(s) Exemple Exemple Donner °d épartement et ’emploi sous Donner le le n n° département et ll’emploi sous forme ètres pour forme de de param paramètres pour la la clause clause WHERE. WHERE. DECLARE DECLARE CURSOR CURSOR emp_cursor emp_cursor (v_deptno (v_deptno NUMBER, NUMBER, v_job v_job VARCHAR2) VARCHAR2) IS IS SELECT empno, ename SELECT empno, ename FROM emp FROM emp WHERE deptno WHERE deptno == v_deptno v_deptno AND job AND job == v_job; v_job; BEGIN BEGIN OPEN OPEN emp_cursor(10, emp_cursor(10, 'CLERK'); 'CLERK'); ... ... C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 104 Mise à jour avec utilisation d’un curseur C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Clause FOR UPDATE Syntaxe Syntaxe SELECT SELECT ... ... FROM ... FROM ... FOR FOR UPDATE UPDATE [OF [OF nom_colonne][NOWAIT]; nom_colonne][NOWAIT]; •• Verrouille Verrouille les les lignes lignes sélectionnées sélectionnées pour pour la la durée durée de de la la transaction. transaction. •• Verrouille Verrouille les les lignes lignes avant avant l’exécution l’exécution d d ’un ’un ordre ordre update update ou ou delete. delete. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 106 Clause FOR UPDATE Exemple Exemple S électionner les és du Sélectionner les employ employés du d épartement 30. département 30. DECLARE DECLARE CURSOR CURSOR emp_cursor emp_cursor IS IS SELECT SELECT empno, empno, ename, ename, sal sal FROM emp FROM emp WHERE WHERE deptno deptno == 30 30 FOR FOR UPDATE UPDATE NOWAIT; NOWAIT; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 107 Clause WHERE CURRENT OF Syntaxe WHERE WHERE CURRENT CURRENT OF OF nom_curseur; nom_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. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 108 Clause WHERE CURRENT OF Exemple Exemple DECLARE DECLARE CURSOR CURSOR sal_cursor sal_cursor IS IS SELECT sal SELECT sal FROM emp FROM emp WHERE deptno WHERE deptno == 30 30 FOR FOR UPDATE UPDATE of of sal sal NOWAIT; NOWAIT; BEGIN BEGIN FOR FOR emp_record emp_record IN IN sal_cursor sal_cursor LOOP LOOP UPDATE emp UPDATE emp SET sal SET sal == emp_record.sal emp_record.sal ** 1.10 1.10 WHERE WHERE CURRENT CURRENT OF OF sal_cursor; sal_cursor; END END LOOP; LOOP; COMMIT; COMMIT; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 109 Gestion des exceptions C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI Gestion des exceptions en PL/SQL •• Exception Exception ? ? –– Tout Tout événement événement qui qui survient survient pendant pendant l’exécution l’exécution d d ’un ’un ordre. ordre. •• Différents Différents cas cas –– Erreur Erreur diagnostiquée diagnostiquée par par le le SGBDR. SGBDR. –– Événement Événement généré généré par par le le développeur. développeur. •• Gestions Gestions –– Capture Capture dans dans le le module module qui qui l’a l’a détectée. détectée. –– Propagation Propagation àà l’environnement. l’environnement. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 111 Gestion des exceptions en PL/SQL Capture de l’exception Création de l’exception DECLARE DECLARE BEGIN BEGIN EXCEPTION EXCEPTION Capture de l’exception END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Propagation de l’exception Création de l’exception L’exception n’est pas capturée Exception propagée à l’environnement END; Cours PL/SQL d’après cours ORACLE - OAI / 112 Types d’Exceptions •• Erreur Erreur émise émise par par le le serveur serveur –– Prédéfinies Prédéfinies –– Non Non prédéfinies prédéfinies •• Exception Exception générée générée par par l’utilisateur l’utilisateur C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 113 Capture des Exceptions Syntaxe Syntaxe EXCEPTION EXCEPTION WHEN WHEN exception1 exception1 [OR [OR exception2 exception2 .. .. .] .] THEN THEN instruction1; instruction1; instruction2; instruction2; .. .. .. [WHEN [WHEN exception3 exception3 [OR [OR exception4 exception4 .. .. .] .] THEN THEN instruction1; instruction1; instruction2; instruction2; .. .. .] .] [WHEN [WHEN OTHERS OTHERS THEN THEN instruction1; instruction1; instruction2; instruction2; .. .. .] .] C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 114 Capture des Exceptions •• WHEN WHEN OTHERS OTHERS est est la la dernière dernière clause. clause. •• Le Le mot mot clé clé EXCEPTION EXCEPTION introduit introduit la la section section de de gestion gestion des des exceptions. exceptions. •• Plusieurs Plusieurs gestionnaires gestionnaires d’exception d’exception peuvent peuvent être être définis définis dans dans un un même même bloc. bloc. •• Un Un seul seul gestionnaire gestionnaire d’exception d’exception est est exécutée exécutée suite suite àà la la détection détection d d ’une ’une exception, exception, avant avant de de sortir sortir du du bloc. bloc. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 115 Exceptions serveur prédéfinies •• Erreur Erreur émise émise par par le le serveur. serveur. •• Repérable Repérable par par un un nom-erreur. nom-erreur. •• Exemple Exemple de de nom-erreurs nom-erreurs prédéfinies: 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. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 116 Utilisation des nom-erreurs Syntaxe Syntaxe BEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN instruction1; instruction2; WHEN TOO_MANY_ROWS THEN instruction1; WHEN OTHERS THEN instruction1; instruction2; instruction3; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 117 Exception serveur non prédéfinie Pragma exception_init Declare Section déclarative • Déclaration • Association à d’un nom d’exception C. C. Bonnet Bonnet // R. R. Chapuis Chapuis l’erreur Cours PL/SQL d’après cours ORACLE - OAI / 118 Référence Section gestion des exceptions • Capture de l’exception Exception serveur non prédéfinie D éclaration d ’un nom -erreur pour ’erreur Déclaration d’un nom-erreur pour ll’erreur n ° --2292 2292 (int égrité rréférentielle). éférentielle). n° (intégrité DECLARE DECLARE e_emps_remaining EXCEPTION; e_emps_remaining e_emps_remaining EXCEPTION; EXCEPTION; PRAGMA PRAGMA EXCEPTION_INIT PRAGMA EXCEPTION_INIT EXCEPTION_INIT (( ( e_emps_remaining, -2292); e_emps_remaining, e_emps_remaining,-2292); -2292); v_deptno dept.deptno%TYPE v_deptno dept.deptno%TYPE := := &p_deptno; &p_deptno; BEGIN BEGIN DELETE DELETE FROM FROM dept dept WHERE deptno WHERE deptno == v_deptno; v_deptno; COMMIT; COMMIT; EXCEPTION EXCEPTION WHEN WHEN e_emps_remaining e_emps_remaining THEN THEN DBMS_OUTPUT.PUT_LINE DBMS_OUTPUT.PUT_LINE (( ’Suppression ’Suppression imposssible imposssible '' ||TO_CHAR(v_deptno) ||TO_CHAR(v_deptno) || || '. '. Existence Existence d’employés. d’employés. '); '); END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 119 1 2 3 Exception définie par l’utilisateur Declare Raise Section déclarative Section exécution • Déclaration d’un nom d’exception C. C. Bonnet Bonnet // R. R. Chapuis Chapuis • Génération de l’exception Cours PL/SQL d’après cours ORACLE - OAI / 120 Référence Section gestion des exceptions • Traitement de l’exception Exception définie par l’utilisateur Syntaxe Syntaxe DECLARE DECLARE nom-exception nom-exception EXCEPTION; EXCEPTION; BEGIN BEGIN …; …; RAISE RAISE nom-exception; nom-exception; ...; ...; EXCEPTION EXCEPTION WHEN WHEN nom-exception nom-exception THEN THEN ...; ...; END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 121 Exception définie par l’utilisateur Exemple Exemple DECLARE DECLARE EXCEPTION; e_invalid_product e_invalid_product EXCEPTION; EXCEPTION; BEGIN BEGIN UPDATE product UPDATE product SET descrip SET descrip == '&product_description' '&product_description' WHERE prodid WHERE prodid == &product_number; &product_number; IF IF SQL%NOTFOUND SQL%NOTFOUND THEN THEN RAISE e_invalid_product; RAISE e_invalid_product; END END IF; IF; COMMIT; COMMIT; EXCEPTION EXCEPTION e_invalid_product THEN WHEN WHEN e_invalid_product e_invalid_product THEN DBMS_OUTPUT.PUT_LINE(‘ DBMS_OUTPUT.PUT_LINE(‘ N° N° produit produit inconnu.'); inconnu.'); END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 122 1 2 3 Procédure RAISE_APPLICATION_ERROR Syntaxe Syntaxe raise_application_error raise_application_error (numéro-erreur, (numéro-erreur, message[, message[, {TRUE {TRUE || FALSE}]); FALSE}]); •• Permet Permet de de définir définir une une erreur erreur (numéro (numéro [entre [entre -20000 -20000 et et -20999] -20999] et et texte texte du du message) message) dans dans un un bloc bloc PL/SQL. PL/SQL. •• Utilisable Utilisable dans dans les les sections sections de de code code d’un d’un bloc bloc PL/SQL. PL/SQL. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 123 Procédure RAISE_APPLICATION_ERROR •• Utilisable Utilisable :: –– dans dans la la section section Exécution Exécution –– dans dans la la section section Exception Exception •• La La génération génération de de l’erreur l’erreur est est conforme conforme au au standard standard du du serveur serveur et et est est traitable traitable comme comme telle. telle. C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 124 Procédure RAISE_APPLICATION_ERROR Exemple Exemple …… EXCEPTION EXCEPTION WHEN WHEN NO_DATA_FOUND NO_DATA_FOUND THEN THEN RAISE_APPLICATION_ERROR RAISE_APPLICATION_ERROR (-20201, (-20201, ‘‘ Ligne Ligne NON NON trouvée trouvée ’); ’); END; END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 125 Informations associées à toute erreur •• SQLCODE SQLCODE Valeur Valeur numérique numérique de de l’erreur l’erreur •• SQLERRM SQLERRM Texte Texte du du message message associé associé àà l’erreur l’erreur C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 126 Informations associées à une exception serveur DECLARE v_error_code v_error_message BEGIN ... EXCEPTION ... WHEN OTHERS THEN ROLLBACK; v_error_code := v_error_message NUMBER; VARCHAR2(255); SQLCODE ; := SQLERRM ; INSERT INTO errors VALUES(v_error_code, v_error_message); END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 127 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 Un bloc peut gérer ses exceptions ou les transmettre au bloc de niveau supérieur. BEGIN SELECT ... UPDATE ... IF SQL%NOTFOUND THEN RAISE e_no_rows; END IF; EXCEPTION WHEN e_integrity THEN ... WHEN e_no_rows THEN ... END; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN . . . WHEN TOO_MANY_ROWS THEN . . . END; C. C. Bonnet Bonnet // R. R. Chapuis Chapuis Cours PL/SQL d’après cours ORACLE - OAI / 128