Introduction  Langage propre à Oracle basé sur ADA  Offre une extension procédurale à SQL  PL/SQL permet d’utiliser un sous-ensemble du langage SQL.

Slides:



Advertisements
Présentations similaires
PL/SQL : Le Langage PL/SQL est une extension du SQL, qui offre
Advertisements

Les Systèmes de Gestion de Bases de Données (SGBD) PL-SQL.
Vues.
Programmation dapplication INT. 2 Bases de Données Plan du document Contexteslide 1 Programmer avec une BDslide 2 Client-Serveur SQL et architecture 3.
Oracle: OO.
Année universitaire Système dinformation Le SQL (Structured Query Language) langage dinterrogation dune base de données.
LE LANGAGE SQL : LDD La création de tables L’ordre CREATE CREATE TABLE nom_de_table (Nom_colonne Type_colonne, Nom_colonne Type_colonne,
Les contraintes d’integrité
Connexion en mode application. Bases de données - Yann Loyer2 Connexion en mode application Pour tout type dutilisateurs : –passif, actif, gérant Permettre.
L’utilisation des bases de données
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
Gestion des erreurs Packages ©Alain Villeneuve, 1999
PL / SQL Schedule: Timing Topic 45 minutes Lecture 30 minutes Practice
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Procédures stockées CPI-SQLServer.
PLSQL ORACLE 8i Connecter VB à BD Oracle Les collections Question de révision Les blocs anonymes Les triggers REVISION Par : Joël Huot.
Les Fonctions. Définir une fonction Sections de code indépendantes que lon peut appeler à nimporte quel moment et dans nimporte quel ordre. Bout de code.
Introduction à la programmation I Fonctions Structures de contrôle Structures de données (arrays simples et indexés) Variables locales et globales.
SQL: Contraintes et Triggers
Bases de Données Avancées - TP2: SQL
PL/SQL Noreddine GHERABI 1.
Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++
Procédures Stockées Schedule: Timing Topic 60 minutes Lecture
Le Langage de BLOC PL/SQL
JDBC L'API JDBC est utilisée pour utilisée pour intéragir avec une base de données.
Créer des déclencheurs de base de données
Chapitre 6.2 Les curseurs Cours SGBD 3A Mme hkimi Jihène
Objectifs A la fin de ce chapitre, vous pourrez : présenter l'utilisation d'opérations de chargement de données par chemin direct décrire l'utilisation.
Créer des packages.
INTEGRITE ET BD ACTIVES
Packages fournis par Oracle
 Syntaxe du langage PHP
 Requêtes MySQL en PHP Introduction
(Procedural Language / Structured Query Language)
Manipulation des Données
Sous-Interrogations.
DEFINITION DES DONNEES : schéma conceptuel. Schéma conceptuel instructiondescription CREATE TABLEcréation d'une relation ALTER TABLEmodification de la.
6 Copyright © Oracle Corporation, Tous droits réservés. Autres concepts relatifs aux packages.
Variables et environnement utilisateur W. Barhoumi.
Module 13 : Implémentation de déclencheurs. Vue d'ensemble Présentation des déclencheurs Définition de déclencheurs Exemples de déclencheurs Performances.
1 Copyright © Oracle Corporation, Tous droits réservés. Présentation des sous-programmes PL/SQL.
Cours LCS N°4 Présenté par Mr: LALLALI
Les Contraintes.
 Formulaires HTML : traiter les entrées utilisateur
SQL : Langage de Manipulation des données
21/04/2015© Robert Godin. Tous droits réservés.1 6Gestion des contraintes d’intégrité en SQL n Contrainte d'intégrité statique – respectée pour chacun.
Révision du langage PL/SQL
Création et Gestion de Tables
3 Copyright © Oracle Corporation, Tous droits réservés. Créer des fonctions.
02/06/2015© Robert Godin. Tous droits réservés.1 5 Interface entre SQL et un programme n SQL incomplet n Défaut d'impédance (impedance mismatch) – modèle.
 L’information est conservée sous forme de tables  Contient: ◦ Un nom ◦ Une clé primaire ◦ Une liste de colonnes ◦ Les informations/données (sous forme.
Définition des contraintes Vérification des contraintes Triggers
PL/SQL Présentation.
Le Langage de Contrôle de Données TRIGGERS
Note: Les nombres écrits en gras renvoie à des leçons entières. Symbole %FOUND 6-13 %ISOPEN 6-13 %NOTFOUND 6-13 %ROWCOUNT 6-13 %ROWTYPE 5, 6-17 %TYPE 1-20.
Procédures Stockées Fonctions Paquetages
Les bases de données Séance 8 Jointures.
Scripts et fonctions Instructions de contrôle
CHAPITRE 4 PL/SQL Langage SQL en mode procédural (PL/SQL):
Types de données composites
Le langage SQL.
Initiation aux bases de données et à la programmation événementielle
Nicolas Ribot Introduction aux triggers Nicolas Ribot - Licence GNU FDL - Version 1.1.
INTRODUCTION AUX BASES DE DONNEES Base et métabase
Introduction au langage PL/SQL
Philippe Gandy – 10 novembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Les exceptions Une exception est un identificateur PL/SQL détecté pendant la phase d’exécution. Comment est-elle déclenchée ? À la suite d’une erreur.
Les vues, indexes, séquences.  Qu’est ce qu’une vue 1. Une vue est une vision partielle ou particulière des données d'une ou plusieurs tables de la base.
Le Langage de Manipulation de Données LMD Module 6.
1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 4 Support de cours rédigé par Bernard COFFIN Université.
1 Les bases de données Séance 5 -- Le Langage de Définition de Données ou la manœuvre de la structure de la base -- Le Langage de Manœuvre de Données.
Transcription de la présentation:

Introduction  Langage propre à Oracle basé sur ADA  Offre une extension procédurale à SQL  PL/SQL permet d’utiliser un sous-ensemble du langage SQL des variables, des boucles, des alternatives, des gestions d’erreurs.  PL/SQL permet également de manipuler ligne par ligne les données retournées par une requête SQL.

Bloc PL/SQL Un programme PL/SQL est composé d’un ou plusieurs blocs. Chaque bloc comporte 4 sections. 1 Section en-tête (facultative)‏ Permet de nommer le bloc (bloc anonyme ou bloc nommé : procédure, fonction, paquage,…)‏ PROCEDURE nom[(liste de paramètres)] IS|AS … FUNCTION nom[(liste de paramètres)] RETURN nomType IS|AS …

Bloc PL/SQL 2 Section déclaration (facultative)‏ Introduite par le mot clé « DECLARE ». On fait ici les déclarations des constantes, des variables, des exceptions, des curseurs. DECLARE …

Bloc PL/SQL 3 Section corps de programme (obligatoire)‏ Commence par « BEGIN » et se termine par « END ». BEGIN … END

Bloc PL/SQL 4 Section des exceptions (facultative)‏ Dans la section corps du programme, elle est introduite par le mot clé « EXCEPTION ». BEGIN Traitement EXCEPTION … END

Type des données PL/SQL offre 2 grandes familles de type de données. Types scalaires (lignes ne retournant qu’une seule valeur)‏ Types de base INTEGER, NUMBER, FLOAT, REAL, …, CHAR, VARCHAR2, DATE, BOOLEAN Nom_variablenom_type Variables basées %TYPE sert à baser la variable sur une autre structure de données : une variable PL/SQL, un attribut d’une relation, un curseur. Nom_nouvelle_variablenom_variable %TYPE

Type des données Variables basées Ex : Base de données : Employé (nom VARCHAR2(30), Salaire NUMBER(8,2))‏ Bloc PL/SQL : DECLARE v_nom Employe.nom %TYPE v_new_nom v_nom %TYPE v_nom est en fait basé sur le type de l’attribut nom de la table Employe, i.e. VARCHAR2(30) et v_new_nom est basé sur le type de v_nom.

Type des données : Types composés Enregistrement 1.Par numérotation des champs qui composent l’enregistrement TYPE nom_type IS RECORD (nom_champ1 type1, … nom_champN typeN)‏ 2. Enregistrement basé sur une relation Utilisation de %ROWTYPE. Les enregistrements sont semblables, en terme de lignes, à la structure d’une relation. v_employe employe %ROWTYPE Accès au champ : nom_variable.nom_champi 3. Enregistrement basé sur un curseur Structure calquée sur la liste du SELECT ramené par le curseur. nom_variable nom_curseur %ROWTYPE

Tableau Une seule dimension indexé par BINARY INTEGER Eléments de même type Type des données : Types composés TYPE nom_type IS TABLE OF type_des_elements INDEX BY BINARY INTEGER nom_variable nom_type nom_variable(2)‏ Constantes nom_constante CONSTANT type := valeur ;

Instructions Instructions SQL INSERT, UPDATE, DELETE SELECT FROM WHERE Gestion des transactions : COMMIT, ROLLBACK Instructions d’affectation Instructions de contrôle de données Instructions de gestion des curseurs Instructions de gestion des exceptions Remarque : Chaque instruction doit se terminer par « ; »

Ordres d’affectation 1.:= nom_variable := valeur ; 2. Valeur de résultat d’une requête SELECT … INTO liste de variables FROM Attention : Utilisable que si on est sûr que le SELECT ramènera une et une seule ligne. 3. Fetch L’ordre Fetch qui permet de récupérer 1 ligne d’un curseur.

Structures de contrôle Alternative IF condition THEN instruction1; ENDIF; IF condition THEN instruction1; ELSE instruction2 ; ENDIF; IF condition THEN instruction1; ELSIF condition2 then instruction2; ELSIF condition3... ELSE instructionN ; ENDIF;

Structures de contrôle Répétition LOOP instruction; EXIT [WHEN condition] ; (ou IF condition THEN EXIT;)‏ instruction; END LOOP; WHILE condition LOOP instruction; END LOOP ; FOR (variable_indice) IN [REVERSE] Min.. Max LOOP instruction; END LOOP; Variable_indice : variable locale à la boucle, elle n’a pas besoin d’être déclarée REVERSE : va de Max à Min Min, Max : constantes ou des variables déclarées et affectées, le pas est obligatoirement de 1.

select expr1, expr2,... into var1, var2,... met des valeurs de la BD dans une ou plusieurs variables Le select ne doit renvoyer qu’une seule ligne Avec Oracle il n’est pas possible d’inclure un select sans « into » dans une procédure ; Extraire des données

Extraire des données – erreurs Si le select renvoie plus d’une ligne, une exception «TOO_MANY_ROWS » (ORA-01422) est levée Si le select ne renvoie aucune ligne, une exception «NO_DATA_FOUND » (ORA-01403) est levée

Exemple DECLARE v_nom emp.nome%TYPE; v_emp emp%ROWTYPE; BEGIN select nome into v_nom from employe where budget = 500; select * into v_emp from emp where budget = 500; END;

Les curseurs Un curseur permet de récupérer et de traiter ligne par ligne un ensemble de lignes de la BD. En PL/SQL, il existe 2 types de curseurs : les curseurs implicites : représente la zone mémoire utilisée pour parser et exécuter la requête Dès l’instant où l’on exécute un ordre SQL, il y a création d’un curseur. Un curseur est une zone de travail (« Context area ») qui contient toutes les infos relatives à l’ordre SQL (texte source de la requête, forme traduite, plan d’exécution, résultat…)‏ les curseurs explicites (gérés par le programme PL/SQL, ils permettent de traiter une à une les lignes ramenées avec un select),

Curseurs explicites Déclaration d’un curseur explicite DECLARE CURSOR nom_curseur IS requete_SQL ; CURSOR e IS SELECT * FROM Employe; -- Un curseur peut être défini avec des paramètres CURSOR nom_curseur(liste_param=val_defaut) IS requete_SQL ; Ex : CURSOR e1(Sal number) IS SELECT * FROM Employe WHERE Salaire>*Sal;

Curseurs explicites Ouverture de curseur Alloue l’espace mémoire suffisant et permet de positionner d’éventuels verrous OPEN nom_curseur ; OPEN nom_curseur(liste de paramètres réèls) ; La requête est exécutée à ce moment là. Fermeture du curseur CLOSE nom_curseur ; Traitement des lignes Distribution une à une des lignes par l’ordre FETCH placé à l’intérieur d’une boucle. FETCH nom_curseur INTO variable ;

les statuts d’un curseur %ISOPEN : renvoie VRAI si le curseur est ouvert %FOUND : renvoie VRAI si le dernier FETCH a renvoyé 1 ligne %NOTFOUND %ROWCOUNT : renvoie le nombre de lignes traitées par le curseur

Les curseurs implicites Les curseurs implicites sont tous nommés SQL DECLARE nb_lignes integer; BEGIN delete from employe where dept = 10; nb_lignes := SQL%ROWCOUNT;...

Exemple DECLARE CURSOR e IS SELECT * FROM Employe; v_nom Employ.nom %TYPE ; v_salaire Employe.salaire %TYPE ; BEGIN OPEN e; LOOP FETCH e INTO v_nom, v_salaire; EXIT WHEN e%NOTFOUND; Traitement END LOOP; CLOSE e; END; Remarque : Quand on veut traiter une à une, sans exception, les lignes retournées il faut utiliser une boucle “FOR”. FOR indice IN nom_curseur indice n’a pas besoin d’être déclaré. OPEN et CLOSE sont exécutés de manière implicite

Exemple DECLARE CURSOR e IS SELECT * FROM Employe; v_nom Employ.nom %TYPE v_salaire Employe.salaire %TYPE BEGIN FOR i IN e LOOP v_nom := i.nom; v_salaire := i.salaire; Traitement END LOOP; END;

Modification de données On peut effectuer une modification (UPDATE ou DELETE) sur la ligne que renvoie le curseur grâce à la commande « CURRENT OF ». UPDATE | DELETE … WHERE CURRENT OF nom_curseur La ligne courante d’un curseur est déplacée à chaque appel de l’instruction fetch On est parfois amené à modifier la ligne courante pendant le parcours du curseur Pour cela on peut utiliser la clause « where current of » pour désigner cette ligne courante dans un ordre LMD (insert, update, delete)‏ Il est nécessaire d’avoir déclaré le curseur avec la clause FOR UPDATE pour que le bloc compile FOR UPDATE [OF col1, col2,...] Cette clause bloque toute la ligne ou seulement les colonnes spécifiées Les autres transactions ne pourront modifier les valeurs tant que le curseur n’aura pas quitté cette ligne

Modification de données Ex : DECLARE CURSOR c IS SELECT * FROM Employe [FOR UPDATE OF Commission]; v_nom Employ.nom %TYPE v_salaire Employe.salaire %TYPE v_commission Employe.commission %TYPE BEGIN OPEN c; LOOP FETCH c INTO v_nom, v_salaire, v_commission; EXIT WHEN c %NOTFOUND; IF v_commission IS NULL THEN UPDATE Employe SET commission:=v_salaire * 0.1 WHERE CURRENT OF c ; END IF ; END LOOP; CLOSE e; COMMIT; END;

Exceptions Une exception est une erreur qui survient durant une exécution 2 types d’exception : prédéfinie par Oracle définie par le programmeur DECLARE -- définitions de variables BEGIN -- Les instructions à exécuter EXCEPTION -- La récupération des erreurs END;

Exceptions prédéfinies NO_DATA_FOUND TOO_MANY_ROWS VALUE_ERROR (erreur arithmétique)‏ ZERO_DIVIDE...

Gestion des exceptions Types d’erreur : Erreurs Système DECLARE … BEGIN … EXCEPTION WHEN NO_DATA_Found THEN traitement ; … WHEN Too_Many_Rows THEN traitement ; WHEN OTHERSTHEN traitement ; --optionnel END;

On la déclare et on effectue le traitement approprié, on détecte l’anomalie au cours du programme. DECLARE Nom_erreur EXCEPTION ; BEGIN IF anomalie THEN RAISE nom_erreur ; END IF ;... EXCEPTION WHEN nom_erreur THEN traitement ; … END ; Gestion des exceptions Types d’erreur : Erreurs utilisateurs

Reprise après exception Lorsqu’une exception est détectée, le traitement associé à l’exception est exécuté et ensuite on sort du bloc dans lequel l’exception a été définie. Solution possible : plusieurs blocs imbriqués. BEGIN IF exception THEN … EXCEPTION END; BEGIN … END;

On peut donner un code à une exception : Nom_erreur EXCEPTION ; PRAGMA EXCEPTION_INIT(nom_erreur,code) ; Remarque : numéro pris par Oracle : à –20995 Affichage de l’erreur : ORA –xxxxx : un message Reprise après exception

Exemple CREATE TABLE err_test (nom VARCHAR2(10) PRIMARY KEY; numero NUMBER CONSTRAINT no_smallnb CHECK (numero>100)); INSERT INTO err_test VALUES (“voiture”,2);  ORA –02290 : violation de contrainte(nom_uti.no_smallnb) de verification. Programme PL/SQL : BEGIN INSERT INTO … EXCEPTION IF SQLCODE= AND SQLERRM=’%no_smallnb’ THEN Affichage d’un message adapté ELSE Affichage des autres erreurs

Les triggers Trigger = déclencheur, réflexe en anglais Un trigger lit une procédure déclenchée par des événements de mise à jour spécifiés par l’utilisateur et ne s’exécute que lorsqu’une condition est vérifiée. CREATE TRIGGER nom BEFORE|AFTER INSERT|DELETE|UPDATE ON relation [FOR EACH ROW] [WHEN condition] BEFORE/AFTER : permet de spécifier si on veut déclencher le traitement avant ou après la mise à jour. Un trigger peut être exécuté une fois pour un seul ordre SQL, c’est ce que l’on appelle un trigger par ordre, ou à chaque ligne concernée par l’ordre, c’est ce que l’on appelle un trigger par ligne.

E/S dans un programme PL/SQL Package DBMS_OUTPUT DBMS_OUTPUT.PUT_LINE(‘…’) ; DBMS_OUTPUT.PUT_LINE(‘code erreur:’,||SQLCODE); //Concaténation

Exemple un déclencheur qui affiche le numéro et le nom d'un employé que l'on veut supprimer de la table EMP CREATE OR REPLACE TRIGGER TRG_BDR_EMP BEFORE DELETE --avant supression ON EMP -- sur la table EMP FOR EACH ROW -- pour chaque ligne Declare LC$Chaine VARCHAR2(100); Begin dbms_output.put_line( 'Suppression de l''employé n° ' || To_char( :OLD.empno ) || ' -> ' || :OLD.ename ) ; End ; Supprimons maintenant un employé delete from emp where empno = 7369 Suppression de l'employé n° > SMITH

désormais, tout nouvel employé devra avoir un numéro supérieur ou égal à Il faut donc interdire toute insertion qui ne reflète pas cette nouvelle directive CREATE OR REPLACE TRIGGER TRG_BIR_EMP BEFORE INSERT ON EMP FOR EACH ROW Begin If :NEW.empno < Then RAISE APPLICATION_ERROR ( , 'Numéro employé inférieur à 10000' ) ; End if ; End ; Tentons d'insérer un nouvel employé avec le numéro 9999 insert into emp (empno, ename, job) values( 9999, 'Burger', 'CLERK' ) ; insert into emp (empno, ename, job) values( 9999, 'Burger', 'CLERK' ) ERREUR à la ligne 1 : ORA-20010: Numéro employé inférieur à 10000

CREATE OR REPLACE TRIGGER TRG_BIUDR_EMP BEFORE INSERT OR UPDATE OR DELETE -- avant insertion, modification ou suppression ON EMP FOR EACH ROW Begin If INSERTING Then dbms_output.put_line( 'Insertion dans la table EMP' ) ; End if ; If UPDATING Then dbms_output.put_line( 'Mise à jour de la table EMP' ) ; End if ; If DELETING Then dbms_output.put_line( 'Suppression dans la table EMP' ) ; End if ; End ;

Procedure et fonction Bloc anonyme ou nommé Un bloc anonyme PL/SQL est un bloc « DECLARE – BEGIN – END » comme dans les exemples précédents Le plus souvent, on crée plutôt une procédure ou une fonction nommée pour réutiliser le code

Déclaration d'une procedure create or replace PROCEDURE( ) IS -- déclaration des variables BEGIN -- code de la procédure END; Pas de DECLARE ; les variables sont déclarées entre IS et BEGIN Si la procédure ne nécessite aucune déclaration, le code est précédé de « IS BEGIN »

Déclaration d'une fonction create or replace FUNCTION( ) RETURN IS -- déclaration des variables BEGIN -- code de la fonction END;