Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL



Documents pareils
Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Bases de données avancées

Bases de Données Avancées PL/SQL

TP Contraintes - Triggers

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Introduction au PL/SQL Oracle. Alexandre Meslé

Administration des bases de données

Cours Bases de données 2ème année IUT

Oracle Le langage procédural PL/SQL

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Le Langage SQL version Oracle

Corrigés détaillés des exercices

A QUOI SERVENT LES BASES DE DONNÉES?

Devoir Data WareHouse

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Bases de Données relationnelles et leurs systèmes de Gestion

Vues: définition. Vues: avantages. Vues: inconvénients. Vues: exemple. Vues: syntaxe 08/12/2009

Support de cours «SGBD»

Intégrité sémantique dans les bases de données relationnelles

Le langage procédural PL-PGSQL

Cours Bases de données 2ème année IUT

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Intégrité des données

Quelques aspects du Relationnel-Objet du SGBD Oracle

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

A QUOI SERVENT LES BASES DE DONNÉES?

Gestion de base de données

Auto-évaluation Oracle: cours de base

Langage SQL : créer et interroger une base

CREATION WEB DYNAMIQUE

//////////////////////////////////////////////////////////////////// Administration bases de données

Notes de cours : bases de données distribuées et repliquées

Chapitre 5 : Les procédures stockées PL/SQL

Présentation du PL/SQL

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Le Langage De Description De Données(LDD)

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Développement d applications avec les bases de données

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Bases de données et sites WEB

Historisation des données

Bases de données relationnelles

Bases de Données Réparties

PL langage de programmation côté serveur. SQL à la base : types, expressions, requêtes

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Création et Gestion des tables

Attaques applicatives

Ora2Pg. Présentation, bonnes pratiques et futur du projet

TP3 : Creation de tables 1 seance

Optimisation SQL. Quelques règles de bases

Administration des bases de données. Jean-Yves Antoine

Le langage SQL (première partie) c Olivier Caron

OpenPaaS Le réseau social d'entreprise

Olivier Mondet

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

BASES DE DONNEES TP POSTGRESQL

Java Licence Professionnelle CISII,

PRÉAMBULE... 2 CRÉATION DE LA BASE DE DONNÉES...

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

1. Base de données SQLite

Arbres binaires de recherche

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

1 Position du problème

Introduction aux Bases de Données 2004/2005

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Chapitre 10. Architectures des systèmes de gestion de bases de données

UML et les Bases de Données

Mysql avec EasyPhp. 1 er mars 2006

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Bases de données et sites WEB Licence d informatique LI345

SQL Historique

Introduction à JDBC. Accès aux bases de données en Java

Introduction au Système de Gestion de Base de Données et aux Base de Données

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Compétences Business Objects

Configurer la supervision pour une base MS SQL Server Viadéis Services

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

APIs de table pour SQL Server

FileMaker 13. Guide de référence SQL

PROJET 1 : BASE DE DONNÉES REPARTIES

INTEGRITE ET BD ACTIVES

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

LE LANGAGE SQL2 1. INTRODUCTION

PHP 5. La base de données MySql. A. Belaïd 1

CHAPITRE 1 ARCHITECTURE

Partie II Cours 3 (suite) : Sécurité de bases de données

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Génie Logiciel avec Ada. 4 février 2013

Bases de données. Mihaela Mathieu

Gestion des utilisateurs et de leurs droits

Transcription:

Cours PL/SQL

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.

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

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

3 Section corps de programme (obligatoire) Commence par «BEGIN» et se termine par «END». BEGIN END

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

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_variable nom_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_variable nom_variable %TYPE

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.

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 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 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 «;»

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.

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;

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.

Extraire des données 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 ;

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

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;

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),

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;

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 ;

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

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

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

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;

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

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;

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;

NO_DATA_FOUND TOO_MANY_ROWS VALUE_ERROR (erreur arithmétique) ZERO_DIVIDE...

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 ;

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 BEGIN IF exception THEN EXCEPTION END; BEGIN END; END;

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

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=-02290 AND SQLERRM= %no_smallnb THEN Affichage d un message adapté ELSE Affichage des autres erreurs

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.

Package DBMS_OUTPUT DBMS_OUTPUT.PUT_LINE( ) ; DBMS_OUTPUT.PUT_LINE( code erreur:, SQLCODE); //Concaténation

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 7369 -> SMITH

désormais, tout nouvel employé devra avoir un numéro supérieur ou égal à 10000. 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 < 10000 Then RAISE APPLICATION_ERROR ( -20010, '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 ;

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

create or replace PROCEDURE(<liste params>) 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»

create or replace FUNCTION(<liste params>) RETURN <type retour> IS -- déclaration des variables BEGIN -- code de la fonction END;