Bases de Données Avancées PL/SQL

Documents pareils
Bases de Données Avancées PL/SQL

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

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

Bases de données avancées

TP Contraintes - Triggers

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

Le Langage SQL version Oracle

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

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

Oracle Le langage procédural PL/SQL

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

Devoir Data WareHouse

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

Introduction au PL/SQL Oracle. Alexandre Meslé

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

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

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

Olivier Mondet

Présentation du PL/SQL

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

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

Le langage procédural PL-PGSQL

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

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

CREATION WEB DYNAMIQUE

SQL Historique

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

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

Création et Gestion des tables

A QUOI SERVENT LES BASES DE DONNÉES?

Le Langage De Description De Données(LDD)

Corrigés détaillés des exercices

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

Optimisation SQL. Quelques règles de bases

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

Administration des bases de données

Bases de données et sites WEB

Pour les débutants. langage de définition des données

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

A QUOI SERVENT LES BASES DE DONNÉES?

Langage SQL : créer et interroger une base

Quelques aspects du Relationnel-Objet du SGBD Oracle

Bases de données. Mihaela Mathieu

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

Les bases de données

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

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

Gestion des utilisateurs et de leurs droits

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

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Bases de données relationnelles

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

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

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

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

Mysql avec EasyPhp. 1 er mars 2006


Intégrité des données

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

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

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

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

Auto-évaluation Oracle: cours de base

OpenPaaS Le réseau social d'entreprise

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

Bases de Données Réparties

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

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

Les BASES de DONNEES dans WampServer

Présentation du module Base de données spatio-temporelles

FileMaker 13. Guide de référence SQL

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

TP3 : Creation de tables 1 seance

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Compétences Business Objects

1 Introduction et installation

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)

1 Position du problème

Programmer en JAVA. par Tama

Le langage SQL Rappels

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Bases de programmation. Cours 5. Structurer les données

Support de cours «SGBD»

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

Historisation des données

Gestion de base de données

Cours SQL. Base du langage SQL et des 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

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

16H Cours / 18H TD / 20H TP

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

Introduction aux Bases de Données 2004/2005

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

Information utiles. webpage : Google+ : digiusto/

Java DataBaseConnectivity

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

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

Transcription:

1/170 Bases de Données Avancées Thierry Hamon Bureau H202 Institut Galilée - Université Paris 13 & LIMSI-CNRS hamon@limsi.fr https://perso.limsi.fr/hamon/teaching/p13/bda-info2-2016-2017/ INFO2 BDA

2/170 Introduction Communication avec un SGBD utilisant SQL

3/170 Introduction Solution complète Oracle

4/170 Clauses SQL Introduction SELECT INSERT UPDATE DELETE CREATE ALTER DROP RENAME TRUNCATE GRANT REVOKE COMMIT ROLLBACK SAVEPOINT Interrogation des données Langage de Manipulation de Données (LMD) Langage de Définition de Données (LDD) Langage de Contrôle de Données (LCD) Contrôle de transaction

5/170 Introduction Procedural Language for Structured Query Language Langage fournissant une interface procédurale au SGBD Oracle Intègration du langage SQL en lui apportant une dimension procédurale Réalisation de traitements algorithmiques (ce que ne permet pas SQL) Mise à disposition de la plupart des mécanismes classiques de programmation des langages hôtes tels que C, COBOL, PASCAL, C++, JAVA...

6/170 Introduction Environnement

7/170 Introduction Avantages de complément de SQL (qui n est pas procédural) Mécanismes offerts par : Structures itératives : WHILE *** LOOP, FOR *** LOOP, LOOP *** Structures conditionnelles : IF *** THEN *** ELSE ELSEIF *** ENDIF, CASE *** Déclaration des curseurs et des tableaux Déclaration de variables Affectation de valeurs aux variables Branchements : GOTO, EXIT Exceptions : EXCEPTION

8/170 Introduction Avantages de Intégration Meilleure cohérence du code avec les données Utilisation de librairies standards prédéfinies (bibliothèques partagées)

9/170 Introduction Avantages de Blocs SQL Traitement par/de blocs SQL dans un énoncé (optimisation des transactions réseaux)

10/170 Introduction Avantages de Exécution de programmes modulaires Traitements complexes (cas particuliers, erreurs) Traitements des exceptions...

11/170 Introduction Avantages de Résumé Langage portable Utilisation de variable de stockage Utilisation de type simple ou de type structuré dynamiquement (%TYPE, %ROWTYPE, etc.) Utilisation des structures de contrôle des langages procéduraux Gestion et manipulation des erreurs Création d ordre SQL dynamique

12/170 Structure de blocs Utilisation de 3 formes : Bloc de code, executé comme une commande SQL (utilisation d un interpréteur standard SQL+ ou isql*plus) Fichier de commandes Programme stocké : procédure, fonction, package ou trigger

13/170 Structure de blocs Structure d un bloc S e c t i o n d é c l a r a t i v e, o p t i o n n e l l e DECLARE V a r i a b l e s, c u r s e u r s, e x c e p t i o n s,... S e c t i o n e x é c u t a b l e, o b l i g a t o i r e BEGIN I n s t r u c t i o n s SQL e t P o s s i b i l i t é s de b l o c s f i l s ( i m b r i c a t i o n de b l o c s ) S e c t i o n de t r a i t e m e n t des e x c e p t i o n s, o p t i o n n e l l e EXCEPTION o p t i o n n e l l e Traitement des e x c e p t i o n s ( g e s t i o n des e r r e u r s ) Terminaison du bloc, o b l i g a t o i r e END ; /

14/170 Structure de blocs Type de blocs Bloc anonyme Procédure Fonction

15/170 Structure de blocs Type de blocs Bloc anonyme Structure classique (1 à 3 sections) Un bloc ne peut être vide. Il doit contenir une instruction (il peut donc contenir l instruction NULL) [ DECLARE ] BEGIN I n s t r u c t i o n s [ EXCEPTION] END; /

16/170 Structure de blocs Type de blocs Bloc anonyme Exemple 1 DECLARE x INTEGER; BEGIN x := 1 ; END;

17/170 Structure de blocs Type de blocs Bloc anonyme Exemple 2 DECLARE v a r x VARCHAR2( 5 ). BEGIN SELECT nom colonne INTO v a r x FROM nom table EXCEPTION WHEN nom exception THEN... END ; /

18/170 Structure de blocs Type de blocs Procédure Bloc nommé puis compilé et stocké dans la base PROCEDURE nom I S BEGIN I n s t r u c t i o n s [ EXCEPTION] END; /

19/170 Structure de blocs Type de blocs Procédure Exemple PROCEDURE p r o c e x e m p l e I S v a r x VARCHAR2( 5 ) ; BEGIN SELECT nom colonne INTO v a r x FROM nom table EXCEPTION WHEN n o m e x c e p t i o n THEN... END ; / Commande SQL qui crée la procédure compile et stocke dans la base le bloc compris entre le BEGIN et le END, référencé par proc exemple

20/170 Structure de blocs Type de blocs Procédure Remarques : Exécution (auto) de la procédure : SQL> EXECUTE proc_exemple Pas d exécution de procédure (ou d instructions) en fin de transaction (COMMIT, ROLLBACK, Ordre DDL) Décision d enregistrement ou d annulation de la transaction en cours : à réaliser par le programme appelant la procédure

21/170 Structure de blocs Type de blocs Fonction Fonction : procédure retournant une valeur FUNCTION nom RETURN t y p e d o n n é e s IS BEGIN I n s t r u c t i o n s RETURN v a l e u r ; [ EXCEPTION] END; /

22/170 Structure de blocs Type de blocs Fonction exemple SQL> CREATE OR REPLACE FUNCTION s o l d e ( no INTEGER) RETURN REAL IS l e s o l d e REAL ; BEGIN SELECT s o l d e INTO l e s o l d e FROM c l i e n t s WHERE n o c l i = no ; RETURN l e s o l d e ; END; /

23/170 Remarques : Structure de blocs Type de blocs Fonction Utilisation de fonction au sein d une requête SQL Exemple : SQL> SELECT solde(1000) FROM dual ; Solde(1000) ----------- 12024,50 Appel d une fonction comme une procédure provoque une erreur Exemple : fonction mdp(integer) SQL> execute mdp(2); BEGIN mdp(2); END; * ERREUR a la ligne 1 : ORA-06550: line 1, column 7: PLS-00221: MDP is not a procedure or is undefined ORA-06550: line 1, column 7:

24/170 Structure de blocs Types de variables Variables locales Constantes Composites Références Variables de l environnement extérieur à Attachées (Bind) Hôtes (Host)

25/170 Structure de blocs Déclaration des variables en Syntaxe I d e n t i f i c a t e u r [CONSTANT] t y p e d o n n é e s [NOT NULL] [:= e x p r e s s i o n ] ; Exemple DECLARE v d a t e n a i s s a n c e DATE; v departement NUMBER( 2 ) NOT NULL := 1 0 ; v v i l l e VARCHAR2(13) := P a r i s ; c cumul CONSTANT NUMBER := 1000;

26/170 Structure de blocs Assignation des variables Syntaxe I d e n t i f i c a t e u r := e x p r ; Exemples Affecter la date de naissance du fils d un employés v d a t e n a i s s a n c e := 23 SEP 2004 ; Fixer le nom d un employé à Clément v nom := Clément ;

27/170 Structure de blocs Types de données scalaires Types de base chaînes de caractères VARCHAR2(n)/NVARCHAR2(n) : Chaîne de n caractères (n < 4000octets) longueur variable (préfixe N : prise en compte de la localisation NLS/National Language Support) CHAR(n)/NCHAR(n) : Chaîne de n caractères (n < 2000octets) longueur fixe, rempli par des espaces LONG/RAW/LONG RAW : Chaîne de caractère ou de données binaires (raw) de longueur variable ( < 2000octets)

28/170 Structure de blocs Types de données scalaires Types de base nombres et date NUMBER (n, m) : Réel avec n chiffres significatifs et m décimals INTERGER/FLOAT : Nombre entier/réel signé BINARY_INTEGER : Nombre entier signé sur 32 bits (utilisation de la librairie mathématique) DATE : date entre le 1 janvier -4712 et le 21 décembre 9999 BOOLEAN : booléen NB : pas d équivalent en SQL. Il n est donc pas possible de stocker un booléen dans une table de sélectionner un élément de table dans un variable booléenne d utiliser un booléen dans une requête SQL ou une fonction appelée dans une requête SQL (paramètre en entrée ou valeur de retour)

29/170 Structure de blocs Déclaration des variables scalaires Exemples v j o b VARCHAR2( 9 ). v c o u n t BINARY INTEGER := 0 ; v s a l t o t a l NUMBER( 9, 2 ). v d a t e DATE := SYSDATE +7; v t a u x t a x e CONSTANT NUMBER( 3, 2 ) := 8. 2 5 ; v v a l i d e BOOLEAN NOT NULL := TRUE;

30/170 Structure de blocs Attribut %TYPE Définition : déclaration d une variable associée à Une colonne d une table dans la BD Une variable précédemment définie Exemples : v nom emp. nom%type; v s a l a n n u e l NUMBER( 7, 2 ) ; v s a l m e n s u e l v s a l a n n u e l %TYPE := 2000;

31/170 Structure de blocs Types de données composites Types : Les tables Les records (voir plus loin)

32/170 Variables attachées Variables attachées/bind variables Variables de substitution dans les requêtes SQL Variable référençant des variables non- Economie d analyse de la requête, donc gain de temps pour Oracle Mécanisme considéré par certains comme le point clé de performance d Oracle

33/170 Variables attachées Variables attachées/bind variables Déclaration Déclaration, en SQL*Plus, d une variable attachée : utilisation de la commande VARIABLE Exemple : VARIABLE n o m v a r i a b l e t y p e v a r i a b l e ; VARIABLE g s a l m e n s u e l NUMBER( 7, 2 ) ;

34/170 Variables attachées Variables attachées/bind variables Référence aux variables non- Exemple : Stocker le salaire mensuel dans une variable globale SQL*Plus : g s a l m e n s u e l := v s a l a n n u e l / 1 2 ; Faire référence aux variables non- comme des variables hôte Précéder la référence par un :

35/170 Variables attachées Variables attachées/bind variables Exemple d utilisation optimisation Exemple de requête SELECT générées des milliers de fois : SELECT fname, lname, pcode FROM c u s t WHERE i d = 674; SELECT fname, lname, pcode FROM c u s t WHERE i d = 234; SELECT fname, lname, pcode FROM c u s t WHERE i d = 332;... A chaque soumission d un requête, Vérification si la requête a déjà été été soumise Si oui, récupération du plan d exécution de la requête, et exécution de la requête

36/170 Variables attachées Variables attachées/bind variables Exemple d utilisation optimisation Si non, analyse syntaxique de la requête définition des différentes possibilités d exécution définition du plan d exécution optimal Processus coûteux en temps CPU, alors que seule la valeur de id change! Solution : réutiliser le plan d exécution existant Nécessite d utiliser des variables attachées : Substitution de la valeur par la variable attaché Envoi de la même requête pour toutes les valeurs de id Exemple : SELECT fname, lname, pcode FROM c u s t WHERE i d = : c u s t n o ;

37/170 Bloc syntaxe et directives Bloc Les instructions peuvent être écrites sur plusieurs lignes. Les unités lexicales peuvent être séparées par des espaces : Délimiteurs Identificateurs Littéraux (ou constantes) Commentaires

38/170 Bloc syntaxe et directives Bloc Les littéraux Les dates et les chaînes de caractères délimitées par deux simples cotes V nom := T h i e r r y ; v a n n e e := to number ( t o c h a r ( v D a t e F i n P e r i o d e, YY ) ) ; Les nombres peuvent être des valeurs simples ou des expressions V s a l a i r e := 1500 + 300 ;

39/170 Bloc Commentaires dans le code Précéder un commentaire écrit sur une seule ligne par --. Placer un commentaire écrit sur plusieurs lignes entre les symboles /* et */. Exemple : v s a l NUMBER( 9, 2 ) ; BEGIN / C e c i e s t un commentaire q u i peut e t r e e c r i t s u r p l u s i e u r s l i g n e s / ENd; C e c i e s t un commentaire s u r une l i g n e

40/170 Bloc Les Fonctions SQL en Les fonctions sur les nombres Les fonctions sur les chaînes de caractères Les fonctions de conversion de type de données Les fonctions de dates

41/170 Exemples : Bloc Exemples de fonctions SQL en Recomposer l adresse d un employé : V AdrComplete : = V Rue CHR( 3 2 ) V V i l l e CHR( 3 2 ) V CodePostal ; Convertir le nom en majuscule V Nom := UPPER (V Nom) ; Extraction d une partie de la chaîne V chr := Substr (, 4, 3 ) ; Replacement d une chaîne par une autre V chr := R e p l a c e ( Serv1 / Prod / t b c l i e n t, Prod, V a l i d ) ;

42/170 Bloc Blocs imbriqués et porté des variables... x BINARY INTEGER ; BEGIN Debut de l a p o r t e e de x... DECLARE y NUMBER; BEGIN debut de l a p o r t e de y... END; f i n de l a p o r t e e de y... END; f i n de l a p o r t e e de x

43/170 Opérateurs Opérateurs dans Identique à SQL Logique Arithmétique Concaténation Parenthèses pour contrôler l ordre des opérations Opérateur supplémentaire : Opérateur d exponentiation **

44/170 Opérateurs Utilisation des variables liées Pour référencer une variable en, on doit préfixer son nom par un : Exemple : : c o d e r e t o u r := 0 ; IF v é r i f i e r c r é d i t o k ( compt no ) THEN : c o d e r e t o u r := 1 ; END IF ;

45/170 Instructions Instructions SQL dans Extraire une ligne de données à partir de la BD par la commande SELECT. Un seul ensemble de valeurs peut être retourné Effectuer des changements aux lignes dans la BD par les commandes du LMD Contrôler des transactions avec les commandes COMMIT, ROLLBACK et SAVEPOINT Déterminer les résultats du LMD avec des curseurs implicites (voir plus loin)

46/170 Instructions Instruction SELECT dans Récupérer une donnée de la BD avec SELECT. Syntaxe SELECT l i s t e s é l e c t i o n INTO { nom var [, nom var ]... nom record } FROM table WHERE c o n d i t i o n ;

47/170 Instructions Instruction SELECT dans La clause INTO est obligatoire Exemple DECLARE BEGIN... END; v deptno NUMBER( 2 ) ; v l o c VARCHAR2( 1 5 ) ; SELECT deptno, l o c INTO v deptno, v l o c FROM dept WHERE nom d = INFORMATIQUE ;

48/170 Instructions Instruction SELECT dans Retourne la somme des salaires de tous les employés d un département donné. Exemple DECLARE BEGIN END; v s o m s a l emp. s a l%type; v deptno NUMBER NOT NULL := 1 0 ; SELECT sum ( s a l ) f o n c t i o n d a g r é INTO v s o m s a l FROM emp WHERE deptno = v deptno ;

49/170 Manipulation de données Manipulation de données en Effectuer des mises à jour des tables de la BD utilisant les commandes du LMD : INSERT UPDATE DELETE

50/170 Manipulation de données Insertion de données Ajouter les informations d un nouvel employé à la table emp Exemple DECLARE v empno NUMBER NOT NULL := 1 0 5 ; BEGIN INSERT INTO emp ( empno, emp nom, poste, deptno ) VALUES ( v empno, Clément, D i r e c t e u r, 1 0 ) ; END;

51/170 Manipulation de données Mise à jour de données Augmenter le salaire de tous les employés dans la table emp qui ont le poste d enseignant. Exemple DECLARE BEGIN END; 1 v a u g m s a l emp. s a l%type := 2000; UPDATE emp SET s a l := s a l + v a u g m s a l WHERE j o b = E n s e i g n a n t ;

52/170 Manipulation de données Suppression de données Suppression des lignes appartenant au département 10 de la table emp Exemple DECLARE BEGIN END; v deptno emp. deptno%type := 1 0 ; DELETE FROM emp WHERE deptno = v deptno ;

53/170 Structure de contrôle Structure de contrôle dans IF conditionnel : IF THEN END IF ; IF THEN ELSE END IF ; IF THEN ELSIF END IF ; Les boucles : LOOP END LOOP; FOR LOOP END LOOP; WHILE LOOP END LOOP;

54/170 Structure de contrôle Instruction IF Syntaxe IF c o n d i t i o n THEN énoncés ; [ ELSIF c o n d i t i o n THEN énoncés ; ] [ ELSE énoncés ; ] END IF ;

55/170 Structure de contrôle Instruction IF Exemple de IF simple Mettre le ID de l employé MARK à 101. I F v nom = MARK THEN v ID := 101; END IF ;

56/170 Structure de contrôle IF simple Si le nom de l employé est CLEMENT, lui attribuer le poste Enseignant, le département n 102 et une commission de 25 % sur son salaire actuel Exemple... IF v nom = Clément THEN v p o s t e := E n s e i g n a n t ; v deptno := 102; v nouv comm := s a l 0. 2 5 ; END IF ;...

57/170 Structure de contrôle IF-THEN-ELSE Si le nom de l employé est CLEMENT, lui attribuer le poste Enseignant, le département n 102 et une commission de 25 % sur son salaire actuel, sinon afficher le message Employé inexistant Exemple... IF v nom = Clément THEN v p o s t e := E n s e i g n a n t ; v deptno := 102; v nouv comm := s a l 0. 2 5 ; ELSE DBMS OUTPUT. PUT LINE ( Employé i n e x i s t a n t ) ; END IF ;...

58/170 Structure de contrôle IF-THEN-ELSIF Pour une valeur donnée en entrée, retourner une valeur calculée Exemple... IF v d e b u t > 100 THEN RETURN ( 2 v d e b u t ) ; ELSIF v d e b u t >= 50 THEN RETURN ( 5 v d e b u t ) ; ELSE RETURN (1 v d e b u t ) ; END IF ;...

59/170 CASE Structure de contrôle Exemple : s e l e c t i d b c r e x p o, i d g e s t f i n, rownum, case when rownum <= 50 then 1 50 rownum rownum when rownum <= 100 then 51 100 rownum rownum e l s e p l u s de 100 end from b c r i. t b g s t f i n a n c e m e n t where rownum <= 100 Cette requête permet de retourner un contenu dans une colonne en fonction d une condition

60/170 Structure de contrôle Boucle de base Syntaxe LOOP d é l i m i t e u r énoncé 1 ; énoncé.... EXIT [ WHEN c o n d i t i o n ] ; énoncé EXIT END LOOP; When : condition est une variable booléenne ou expression (TRUE, FALSE, ou NULL);

61/170 Structure de contrôle Boucle de base Exemple Insérer 10 articles avec la date d aujourd hui.... v Date DATE; v compteur NUMBER( 2 ) := 1 ; BEGIN... v Date := SYSDATE ; LOOP INSERT INTO a r t i c l e ( Artno, ADate ) VALUES ( v compteur, v Date ) ; v compteur := v compteur + 1 ; EXIT WHEN v compteur > 1 0 ; END LOOP;...

62/170 Structure de contrôle Boucle FOR Syntaxe FOR i n d i c e IN [ REVERSE ] b o r n e i n f.. Borne sup LOOP énoncé 1 ; énoncé 2 ;..... END LOOP; Utiliser la boucle FOR pour raccourcir le test d un nombre d itérations Ne pas déclarer l indice, il est déclaré implicitement

63/170 Structure de contrôle Boucle FOR exemple Insérer Nb articles indexés de 1 à Nb avec la date du système en utilisant la boucle FOR ACCEPT Nb PROMPT Donner l e nombre a r t i c l e :... v Date DATE; BEGIN... v Date := SYSDATE ; FOR i IN 1.. &Nb LOOP INSERT INTO a r t i c l e ( Artno, ADate ) VALUES ( i, v Date ) ; END LOOP;...

64/170 Structure de contrôle Boucle WHILE Syntaxe WHILE c o n d i t i o n LOOP énoncé 1 ; énoncé 2 ;..... END LOOP; La condition est évaluée au début de chaque itération Utiliser la boucle WHILE pour répéter des énoncés tant que la condition est vraie

65/170 Structure de contrôle Boucle WHILE Exemple ACCEPT p i t e m t o t PROMPT Donner l e t o t a l max de l a c h a t d un a r t i c l e DECLARE v Date DATE; v compteur NUMBER( 2 ) := 1 ; BEGIN... v Date := SYSDATE ; WHILE v compteur <= &p i t e m t o t LOOP INSERT INTO a r t i c l e ( Artno, ADate ) VALUES ( v compteur, v Date ) ; v compteur := v compteur + 1 ; END LOOP;

66/170 Structure de contrôle Boucles imbriquées et Labels Imbriquer les boucles à niveaux multiples Utiliser les labels pour distinguer les blocs et les boucles Quitter la boucle extérieure avec un EXIT référençant le label

67/170 Structure de contrôle Boucles imbriquées et Labels.... BEGIN << bouc ext >> LOOP v compteur := v compteur + 1 ; EXIT WHEN v compteur > 1 0 ; <<b o u c i n t >> LOOP... EXIT b o u c e x t WHEN t o t a l f a i t = OUI ; q u i t t e r l e s deux b o u c l e s EXIT WHEN i n t f a i t = OUI ; q u i t t e r l a uniquement l a b o u c l e i n t e r n e... END LOOP b o u c i n t ;... END LOOP b o u c e x t ; END;...

68/170 Types de données complexes Types de données complexes Types : RECORDS TABLES Contiennent des composants internes Sont réutilisables

69/170 Types de données complexes Records Contiennent des champs qui sont soit des scalaires, des records ou des tables Structure similaire à des enregistrements dans les langages de programmation classiques Très utiles pour rechercher des lignes de données dans une table et les traiter

70/170 Types de données complexes Création d un record Syntaxe TYPE <Nom Enreg> I S RECORD ( Champ1 Type1.. ChampN TypeN ) ; Exemple TYPE TProd I S RECORD ( VRefPro NUMBER( 4 ), VDesPro VARCHAR2( 3 0 ), VPriUni NUMBER( 7, 2 ) ) ;

71/170 Types de données complexes Attribut %ROWTYPE Déclaration d une variable associée à une collection de colonnes dans une table ou une vue de la BD le nom de la table doit précéder %ROWTYPE Les champs dans le record prennent leurs noms et types des colonnes de la table ou la vue en question

72/170 Types de données complexes Attribut %ROWTYPE Exemples Déclarer une variable pour stocker les mêmes informations concernant une personne telles qu elles sont stockées dans la table PERS p e r s o n n e Pers%ROWTYPE; Déclarer une variable pour stocker les mêmes informations concernant un article telles qu elles sont stockées dans la table ART a r t i c l e Art%ROWTYPE;

73/170 Tables Tables Le type de données complexe TABLE offre au développeur un mécanisme pour traiter les tableaux Il se compose de deux colonnes : Une clé primaire de type BINARY_INTEGER Une colonne de type scalaire ou record

74/170 Tables Création d une table Syntaxe TYPE <Nom table> IS TABLE OF <type> INDEX BY BINARY INTEGER ; Exemple TYPE type etud nom IS TABLE OF etud. nom%type INDEX BY BINARY INTEGER ; etud nom type etud nom ;

75/170 Tables Structure d une table en mémoire Clé primaire Colonne 1 Ritchie 2 Marvin 3 Dennis............ BINARY INTEGER Scalaire

76/170 Tables Créer une table SQL> DECLARE 2 TYPE t y p e e t u d n o m I S TABLE OF v a r c h a r 2 ( 1 0 ) INDEX BY BINARY INTEGER ; 3 etud nom type etud nom ; 4 BEGIN 5 s e l e c t nom 6 i n t o etud nom ( 1 ) 7 from etud 8 where e t u d i d = 6 ; 9 dbms output. p u t l i n e ( etud nom ( 1 ) ) ; 10 dbms output. p u t l i n e ( etud nom ( 2 ) ) ; 11 end ; 12 / mark DECLARE ERREUR à l a l i g n e 1 : ORA 01403: Aucune donnée t r o u v é e ORA 06512: à l i g n e 10

77/170 Tables TABLE de RECORDS en Définit une table dont la deuxième colonne est un enregistrement au lieu d un scalaire Pour définir la deuxième colonne : Soit en utilisant l attribut %ROWTYPE Soit en utilisant un record déjà défini

78/170 Tables TABLE de RECORDS Exemple 1 DECLARE TYPE type etud nom I S TABLE OF etud%rowtype INDEX BY BINARY INTEGER ; etud nom type etud nom ; BEGIN SELECT nom INTO etud nom ( 1 ). nom FROM etud... END;

79/170 Tables TABLE de RECORDS Exemple 2 DECLARE TYPE r e c e t u d I S RECORD( i d etud. e t u d i d%type, nom etud. nom%type ) ; TYPE type etud nom I S TABLE OF r e c e t u d%rowtype INDEX BY BINARY INTEGER ; etud nom type etud nom ; BEGIN SELECT nom INTO etud nom ( 1 ). nom FROM etud... END;

80/170 Curseurs Les curseurs dans SQL Un curseur est une zone de travail privée de SQL (zone tampon) Il y a deux types de curseurs: Curseurs implicites Curseurs explicites Oracle utilise les curseurs implicites pour analyser et exécuter les énoncés de SQL Les curseurs explicites sont déclarés explicitement pas le programmeur

81/170 Curseurs Les attributs des curseurs SQL Les attributs des curseurs SQL permettent de tester les résultats des énoncés SQL SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND SQL%ISOPEN Nombre de lignes affecté par l énoncé SQL le plus récent (renvoie un entier). attribut booléen qui prend la valeur TRUE si l énoncé SQL le plus récent affecte une ou plusieurs lignes. attribut booléen qui prend la valeur TRUE si l énoncé SQL le plus récent n affecte aucune ligne. Prend toujours la valeur FALSE parce que ferment les curseurs implicites immédiatement après leur exécution.

82/170 Curseurs Les attributs des curseurs SQL Supprimer de la table ITEM des lignes ayant un ordre spécifié. Afficher le nombre de lignes supprimées. Exemple DECLARE BEGIN END; v o r d i d NUMBER := 6 0 5 ; DELETE FROM item WHERE o r d i d = v o r d i d ; DBMS OUTPUT. PUT LINE (SQL%ROWCOUNT L i g n e s s u p p r i m é e s ) ; Remarque : ne pas oublier Set ServerOutput on (sous SQLPLUS)

83/170 Les curseurs Curseurs Chaque énoncé SQL exécuté par Oracle a son propre curseur : Curseurs implicites : déclarés pour tout énoncé SELECT du LMD ou Curseurs explicites : déclarés et nommés par le programmeur

84/170 Curseurs Contrôle des curseurs explicites

85/170 Curseurs Contrôle des curseurs explicites

86/170 Curseurs Déclaration des curseurs Syntaxe CURSOR nom du curseur IS un énoncé SELECT; Ne pas inclure la clause INTO dans la déclaration du curseur Si le traitement des lignes doit être fait dans un ordre spécifique, on utilise la clause ORDER BY dans la requête

87/170 Curseurs Déclaration des curseurs Exemple DECLARE CURSOR C1 IS SELECT RefArt, NomArt, QteArt FROM A r t i c l e WHERE QteArt < 500;

88/170 Curseurs Ouverture du curseur Syntaxe OPEN nom du curseur ; Ouvrir le curseur pour exécuter la requête et identifier l ensemble actif Si la requête ne renvoie aucune ligne, aucune exception n aura lieu Utiliser les attributs des curseurs pour tester le résultat du FETCH

89/170 Curseurs Recherche des données dans le curseur Syntaxe FETCH nom du curseur INTO [ v a r i a b l e 1, [ v a r i a b l e 2,... ] nom de record ] ; Rechercher les informations de la ligne en cours et les mettre dans des variables.

90/170 Curseurs Recherche des données dans le curseur Exemples FETCH c1 INTO v RefArt, v NomArt, v QteArt ;.... OPEN Cur Etud ; LOOP FETCH Cur Etud INTO Rec Etud ; { t r a i t e m e n t s des données r e c h e r c h é e s }... END LOOP;...

91/170 Curseurs Fermeture du curseur Syntaxe CLOSE nom du curseur ; Fermer le curseur après la fin du traitement des lignes Rouvrir le curseur si nécessaire On ne peut pas rechercher des informations dans un curseur si ce dernier est fermé

92/170 Curseurs Les attributs du curseur explicite Obtenir les informations d état du curseur (CUR EXP) Attribut Type Description CUR EXP%ISOPEN BOOLEAN Prend la valeur TRUE si le curseur est ouvert CUR EXP%NOTFOUND BOOLEAN Prend la valeur TRUE si le FETCH le plus récent ne retourne aucune ligne CUR EXP%FOUND BOOLEAN Prend la valeur TRUE si le FETCH le plus récent retourne une ligne CUR EXP%ROWCOUNT NUMBER Retourne le nombre de lignes traitées jusqu ici

93/170 Curseurs Contrôle des recherches multiples Traitement de plusieurs lignes d un curseurs en utilisant une boucle Rechercher une seule ligne à chaque itération Utiliser les attributs du curseur explicite pour tester le succès de chaque FETCH

94/170 Attribut %ISOPEN Curseurs La recherche des lignes n est possible que si le curseur est ouvert Utiliser l attribut %ISOPEN avant un FETCH pour tester si le curseur est ouvert ou non Exemple : I F NOT C1%ISOPEN THEN OPEN C1 END IF ; LOOP FETCH C1...

95/170 Curseurs Attributs %FOUND, %NOTFOUND et %ROWCOUNT Utiliser l attribut %ROWCOUNT pour fournir le nombre exact des lignes traitées Utiliser les attributs %FOUND et %NOT FOUND pour formuler le test d arrêt de la boucle

96/170 Curseurs Attributs %FOUND, %NOTFOUND et NOTFOUND%ROWCOUNT Exemple LOOP FETCH c u r s 1 INTO v e t u d i d, v nom ; IF c u r s 1%ROWCOUNT > 20 THEN... EXIT WHEN c u r s 1%NOTFOUND;... END LOOP;

97/170 Curseurs Obtenir les informations d état du curseur Exemple complet DECLARE nom emp. ename%type; s a l a i r e emp. s a l%type; CURSOR C1 IS SELECT ename, NVL( s a l, 0 ) FROM emp ; BEGIN OPEN C1 ; LOOP FETCH C1 INTO nom, s a l a i r e ; EXIT WHEN C1%NOTFOUND; DBMS OUTPUT. PUT LINE ( nom gagne s a l a i r e d o l l a r s ) ; END LOOP; CLOSE C1 ; END;

98/170 Curseurs Les curseurs et les Records Traitement des lignes de l ensemble actif par l affectation des valeurs à des records. Exemple... CURSOR Etud Curs IS SELECT etudno, nom, age, ard FROM etud WHERE age < 2 6 ; Etud Record Etud Curs%ROWTYPE; BEGIN END; OPEN Etud Curs ;... FETCH Etud Curs INTO Etud Record ;...

99/170 Curseurs Les boucles FOR des curseurs Syntaxe FOR nom record IN nom curseur LOOP t r a i t e m e n t des i n f o r m a t i o n s u t i l i s e r des o r d r e s SQL u t i l i s e r des o r d r e s PL / SQL END LOOP;... Un raccourci pour le traitement des curseurs explicites OPEN, FETCH et CLOSE se font de façon implicite Ne pas déclarer le record, il est déclaré implicitement

100/170 Curseurs Les boucles FOR des curseurs Exemple DECLARE CURSOR Cur Etud IS SELECT FROM Etud ; BEGIN FOR Rec Etud IN Cur Etud LOOP DBMS OUTPUT. PUT LINE ( Rec Etud. e t u d i d Rec Etud. nom Rec Etud. adr ) ; END LOOP; END; /

101/170 Exceptions Manipulation des exceptions en Le traitement des exceptions : mécanisme pour manipuler les erreurs rencontrées lors de l exécution Possibilité de continuer l exécution si l erreur n est pas suffisamment importante pour produire la terminaison de la procédure Décision de continuer une procédure après erreur : décision que le développeur doit faire en fonction des erreurs possibles

102/170 Exceptions Types des exceptions Déclenchées implicitement Exceptions Oracle prédéfinies Exceptions Oracle Non-prédéfinies Déclenchées explicitement Exceptions définies par l utilisateur

103/170 Exceptions Capture des exceptions Syntaxe EXCEPTION WHEN e x c e p t i o n 1 [OR e x c e p t i o n 2... ] THEN énoncé1 ; énoncé2 ;... [WHEN e x c e p t i o n 2 [OR e x c e p t i o n 4... ] THEN énoncé3 ; énoncé4 ;... ] [WHEN OTHERS THEN énoncé5 ; énoncé6 ;... ]

104/170 Exceptions Capture des exceptions prédéfinies Faire référence au nom dans la partie traitement des exceptions Quelques exceptions prédéfinies : NO DATA FOUND TOO MANY ROWS INVALID CURSOR ZERO DIVIDE DUP VAL ON INDEX

105/170 Exceptions Exceptions prédéfinies Exemple BEGIN... EXCEPTION WHEN NO DATA FOUND THEN énoncé1 ; énoncé2 ; DBMS OUTPUT. PUT LINE (TO CHAR ( etudno ) Non v a l i d e ) ; WHEN TOO MANY ROWS THEN énoncé3 ; énoncé4 ; DBMS OUTPUT. PUT LINE ( Données i n v a l i d e s ) ; WHEN OTHERS THEN énoncé5 ; énoncé6 ; DBMS OUTPUT. PUT LINE ( A u t r e s e r r e u r s ) ;

106/170 Exceptions Capture des exceptions définies par l utilisateur

107/170 Exceptions Capture des exceptions non-prédéfinies Exemple Capture de l erreur n 2291 (violation de la contrainte intégrité). DECLARE c o n t i n t e g r i t v i o l EXCEPTION; PRAGMA EXCEPTION INIT ( c o n t i n t e g r i t v i o l, 2291);... BEGIN... EXCEPTION WHEN c o n t i n t e g r i t v i o l THEN DBMS OUTPUT. PUT LINE ( v i o l a t i o n de c o n t r a i n t e d i n t é g r i t é ) ;... END;

108/170 Exceptions Capture des exceptions définies par l utilisateur

109/170 Exceptions Exceptions définies par l utilisateur Exemple DECLARE x number : =... ; x t r o p p e t i t EXCEPTION;... BEGIN... IF x < 5 THEN RAISE x t r o p p e t i t ; END IF ;... EXCEPTION WHEN x t r o p p e t i t THEN DBMS OUTPUT. PUT LINE ( l a v a l e u r de x e s t t r o p p e t i t e!! ) ;... END;

110/170 Exceptions Fonctions pour capturer les exceptions SQLCODE : Retourne la valeur numérique du code de l erreur SQLERRM : Retourne le message associé au numéro de l erreur

111/170 Exceptions Fonctions pour capturer les exceptions Exemple... v c o d e e r r e u r NUMBER; v m e s s a g e e r r e u r VARCHAR2( 2 5 5 ) ; BEGIN... EXCEPTION... WHEN OTHERS THEN... v c o d e e r r e u r := SQLCODE; v m e s s a g e e r r e u r := SQLERRM; INSERT INTO e r r e u r s VALUES ( v c o d e e r r e u r, v m e s s a g e e r r e u r ) ; END;

112/170 Sous-programmes Les sous-programmes Un sous programme est une séquence d instruction qui possède un nom On distingue deux types de sous programmes : Les procédures Les fonctions

113/170 Sous-programmes Les sous-programmes Une procédure : sous programme qui ne retourne des résultats seulement dans ses paramètres Une fonction : sous programme qui retourne des résultats dans : Le nom de la fonction Les paramètres de la fonction

114/170 Sous-programmes Les procédures Syntaxe DECLARE... PROCEDURE <Nom Proc >[(P1,..., Pn ) ] [ D é c l a r a t i o n s l o c a l e s ] BEGIN... EXCEPTION... END; BEGIN / Appel de l a p r o c é d u r e /... EXCEPTION... END ; / IS

115/170 Sous-programmes Les procédures Syntaxe des paramètres P1,...,Pn suivent la syntaxe : <Nom Arg> [ IN OUT IN OUT] <Type> Où : IN : Paramètre d entrée OUT : Paramètre de sortie IN OUT : Paramètre d entrée/sortie Par défaut le paramètre est IN

116/170 Sous-programmes Les procédures Exemple DECLARE PROCEDURE NouvSal (PNum IN Emp. Emp Id %Type, PAug NUMBER ) I S VSal NUMBER ( 7, 2 ) ; BEGIN SELECT S a l INTO VSal FROM Emp WHERE emp Id=PNum; UPDATE Emp SET S a l = VSal+PAug WHERE Emp Id=PNum; COMMIT; EXCEPTION WHEN NO DATA FOUND THEN DBMS OUTPUT. PUT LINE ( Employé i n e x i s t a n t ) ; END; BEGIN NouvSal ( 7 5 5 0, 5 0 0 ) ; EXCEPTION WHEN OTHERS THEN DBMS OUTPUT. PUT LINE ( E r r e u r ) ; END ; /

117/170 Sous-programmes Les procédures Exemple DECLARE VErr NUMBER ; PROCEDURE NouvSal (PNum Emp. Emp Id %TYPE, PAug NUMBER, PErr OUT NUMBER ) I S VSal NUMBER ( 7, 2 ) ; BEGIN SELECT S a l INTO VSal FROM Emp WHERE emp Id=PNum; UPDATE Emp SET S a l = VSal+PAug WHERE Emp Id=PNum; COMMIT; PErr :=0 EXCEPTION WHEN NO DATA FOUND THEN PErr :=1 ; END;

118/170 Sous-programmes Les procédures Exemple BEGIN NouvSal ( 7 5 5 0, 5 0 0, VErr ) ; IF VErr = 0 THEN DBMS OUTPUT. PUT LINE ( O p é r a t i o n E f f e c t u é e ) ; ELSE DBMS OUTPUT. PUT LINE ( Employé i n e x i s t a n t ) ; END IF ; EXCEPTION WHEN OTHERS THEN DBMS OUTPUT. PUT LINE ( E r r e u r ) ; END ; /

119/170 Sous-programmes Les fonctions Syntaxe DECLARE [ D é c l a r a t i o n s g l o b a l e s ] FUNCTION <Nom fonc >[(P1,..., Pn ) ] RETURN Type I S [ D é c l a r a t i o n s l o c a l e s ] BEGIN... RETURN v a l e u r ; EXCEPTION... END; BEGIN Appel a l a f o n c t i o n.... EXCEPTION... END ; /

120/170 Sous-programmes Les fonctions Exemple DECLARE VNomComplet VARCHAR2( 4 0 ) ; FUNCTION NomComplet (PNum Emp. Emp I d%type, PErr OUT NUMBER ) RETURN VARCHAR2 I S VLastName Emp. Last Name %Type ; VFirstName Emp. F i r s t N a m e %Type ; BEGIN SELECT Last Name, F i r s t N a m e INTO VLastName, VFirstName WHERE Emp Id=PNum; PErr : =0; RETURN VLastName VFirstName ; EXCEPTION WHEN NO DATA FOUND THEN PErr :=1; RETURN N u l l ; END ;

121/170 Sous-programmes Les fonctions Exemple BEGIN VNomComplet:= NomComplet(&Num, VErr ) ; IF VErr = 0 THEN DBMS OUTPUT. PUT LINE ( Nom Complet e s t : VNomComplet ) ; ELSE DBMS OUTPUT. PUT LINE ( Employé i n e x i s t a n t ) ; END IF ; EXCEPTION WHEN OTHERS THEN DBMS OUTPUT. PUT LINE ( E r r e u r ) ; END ;

122/170 Sous-programmes Le paramètre IN OUT Paramètre jouant le rôle des deux paramètre IN et OUT Obligatoire de le spécifier Exemple : SQL> Create or r e p l a c e p r o c e d u r e affnom ( v nom IN OUT v a r c h a r 2 ) I S 2 BEGIN 3 v nom := UPPER ( v nom ) ; 4 END affnom ; 5 / P r o c é d u r e c r é é e.

123/170 Sous-programmes Appel de affnom de SQL*Plus Définition d une variable liée Initialisation de la variable SQL> v a r name varchar2 ( 1 0 ) ; SQL> begin : name := mark ; end ; / Procédure t e r m i n é e avec s u c c è s SQL> p r i n t name NAME mark

124/170 Sous-programmes Appel de affnom de SQL*Plus Exécution de la procédure avec un paramètre IN OUT Affichage la nouvelle valeur de la variable SQL> execute affnom ( : name ) ; Procédure t e r m i n é e avec s u c c è s. SQL> p r i n t name NAME MARK

125/170 Sous-programmes Passage de paramètres Il y a plusieurs façons de passage de paramètres : Appel de la procédure en spécifiant les paramètres Appel de la procédure sans paramètre si ce dernier est un paramètre d entrée initialisé Appel de la procédure en changeant la position des paramètres (il faut spécifier le nom du paramètre)

126/170 Sous-programmes Passage de paramètres Exemple CREATE OR REPLACE PROCEDURE r e n s e i g n e t u d ( v nom IN etud. nom%type d e f a u l t inconnu, v a d r IN etud. adr%type d e f a u l t inconnu ) IS BEGIN INSERT INTO etud VALUES ( e t u d e t u d i d. n e x t v a l, v nom, v a d r ) ; END;

127/170 Sous-programmes Passage de paramètres Exemple SQL> begin 2 r e n s e i g n e t u d ( mark, p a r i s ) ; 3 r e n s e i g n e t u d ; 4 r e n s e i g n e t u d ( v a d r => l y o n ) ; 5 end ; 6 / Procédure t e r m i n é e avec s u c c è s. SQL> s e l e c t from etud ; ETUDID NOM ADR 6 mark p a r i s 7 inconnu inconnu 8 inconnu l y o n SQL>

128/170 Sous-programmes Les procédures et les fonctions stockées Sont des blocs qui possèdent un nom Consistent à ranger le block compilé dans la base de données (CREATE) Peuvent être réutilisées sans être recompilées (EXECUTE) Peuvent être appelées de n importe bloc Peuvent être regroupées dans un package

129/170 Sous-programmes Les procédures stockées Syntaxe CREATE [ OR REPLACE ] PROCEDURE <Nom Proc >[(P1,..., Pn ) ] [ D é c l a r a t i o n s des v a r i a b l e s l o c a l e s ] BEGIN... EXCEPTION... END; / Procedure Created : La procédure est correcte Ou Procedure Created with compilation errors : Corriger les erreurs SHOW ERRORS;

130/170 Sous-programmes Les procédures stockées Exemple CREATE [ OR REPLACE ] PROCEDURE AjoutProd ( P r e f P r o Prod. RefPro%TYPE,... PPriUni Prod. P r i U n i% TYPE, PErr OUT Number) IS BEGIN INSERT INTO Prod VALUES( PrefPro,..., PPriUni ) ; COMMIT; PErr :=0; EXCEPTION WHEN DUP VAL ON INDEX THEN PErr :=1; / END;

131/170 Sous-programmes Appel des procédures stockées Syntaxe La procédure stockée est appelée par les applications soit : En utilisant son nom dans un bloc (autre procédure) Par execute dans SQL*Plus Dans un bloc : DECLARE BEGIN END; Sous SQL*PLUS : <Nom Procedure >[<P1 >,..., < Pn >]; EXECUTE <Nom Procedure >[<P1 >,..., <Pn >];

132/170 Sous-programmes Appel des procédures stockées Exemple ACCEPT VRefPro... ACCEPT VPriUni... DECLARE VErr NUMBER; BEGIN AjoutProd (&VRefPro,..., & VPriUni, VErr ) ; I F VErr=0 THEN DBMS OUTPUT. PUT LINE ( O p é r a t i o n E f f e c t u e r ) ; ELSE DBMS OUTPUT. PUT LINE ( E r r e u r ) ; END IF ; END ; /

133/170 Sous-programmes Les fonctions stockées Syntaxe CREATE [ OR REPLACE ] FUNCTION <Nom Fonc >[(P1,..., Pn ) ] RETURN Type I S [ D é c l a r a t i o n s des v a r i a b l e s l o c a l e s ] BEGIN I n s t r u c t i o n s SQL e t PL/ Sql RETURN( V a l e u r ) EXCEPTION Traitement des e x c e p t i o n s END; / function Created : La fonction est correcte Ou function Created with compilation errors : Corriger les erreurs SHOW ERRORS;

134/170 Sous-programmes Les fonctions stockées Exemple CREATE [ OR REPLACE ] FUNCTION NbEmp (PNumDep Emp. D e p t I d%type, PErr Out Number ) Return Number I S VNb Number ( 4 ) ; BEGIN S e l e c t Count ( ) I n t o VNb From Emp Where D e p t I d=pnumdep ; PErr :=0 Return VNb ; E x c e p t i o n When No Data Found PErr :=1; Return N u l l ; Then END; /

135/170 Sous-programmes Appel des fonctions stockées Syntaxe La fonction stockée est appelée par les applications soit : Dans une expression dans un bloc Dans une expression dans par la commande EXECUTE (dans SQL*PLUS) Dans un bloc : DECLARE BEGIN END; Sous SQL*PLUS : <var> := <Nom fonction >[<P1 >,..., < Pn>] EXECUTE :< var> := <Nom fonction> [<P1 >,..., < Pn>]

136/170 Sous-programmes Appel des fonctions stockées Exemple Accept VDep... Declare VErr Number ; VNb Number ( 4 ) ; Begin VNb :=NbEmp(&VDep, VErr ) ; I f VErr=0 Then DBMS Output. P u t L i n e ( Le nombre d employées e s t : VNb ) ; E l s e DBMS Output. P u t L i n e ( E r r e u r ) ; End I f ; End ; /

137/170 Sous-programmes Appel des fonctions stockées Exemple SQL> VARIABLE VNb SQL> EXECUTE : VNb:=NbEmp(&VDep, VErr ) ; Procédure t e r m i n é e avec s u c c è s. SQL> PRINT VNb VNB 300

138/170 Sous-programmes Suppression des procédures et des fonctions stockées Syntaxe Comme tout objet manipulé par Oracle, les procédures et les fonctions peuvent être supprimées si nécessaire Cette suppression est assurée par la commande suivante : DROP PROCEDURE nomprocedure ; DROP FUNCTION nomfonction ;

139/170 Sous-programmes Suppression des procédures et des fonctions stockées Exemple SQL> DROP PROCEDURE AjoutProd ; Procedure dropped. SQL> DROP FUNCTION NbEmp ; F u n c t i o n dropped.

140/170 Sous-programmes Les procédures et les fonctions stockées Quelques commandes utiles : SELECT object name, o b j e c t t y p e from o b j ; DESC nomprocedure DESC nomfonction

141/170 Les packages Packages Un objet qui stocke d autres types d objet : procédures, fonctions, curseurs, variables,... Consiste en deux parties : Spécification (déclaration) Corps (implémentation) Ne peut pas être appelé, ni paramétré ni imbriqué Permet à Oracle de lire plusieurs objets à la fois en mémoire

142/170 Packages Développement des packages Sauvegarder l énoncé de CREATE PACKAGE dans deux fichiers différents (ancienne/dernière version) pour faciliter de éventuelles modifications Le corps du package ne peut pas être compilé s il n est pas déclaré (spécifié) Restreindre les privilèges pour les procédures à une personne donnée au lieu de lui donner tout les droits sur toutes les procédures

143/170 Packages La spécification du package Syntaxe Contient la déclaration des curseurs, variables, types, procédures, fonctions et exceptions CREATE [OR REPLACE ] PACKAGE <Nom Package> IS [ D é c l a r a t i o n des v a r i a b l e s e t Types ] [ D é c l a r a t i o n des c u r s e u r s ] [ D é c l a r a t i o n des p r o c é d u r e s e t f o n c t i o n s ] [ D é c l a r a t i o n des e x c e p t i o n s ] END[<Nom Package >]; /

144/170 Packages La spécification du package Exemple Create Or Replace Package PackProd I s Cursor CProd I s Select RefPro, DesPro From P r o d u i t ; Procedure AjoutProd ( PrefPro Prod. RefPro%Type,..., PErr Out Number ) ; Procedure ModifProd ( PrefPro Prod. RefPro%Type,..., PErr Out Number ) ; Procedure SuppProd ( PrefPro Prod. RefPro%Type,..., PErr Out Number ) ; Procedure AffProd ; EndPackProd ; /

145/170 Packages Le corps du package Syntaxe On implémente les procédures et fonctions déclarées dans la spécification Create [ Or Replace ] Package Body <Nom Package> I s [ I m p l é m e n t a t i o n p r o c é d u r e s f o n c t i o n s ] End [<Nom Package >]; /

146/170 Packages Le corps du package Syntaxe Create Or Replace Package Body PackProd I s Procedure AjoutProd ( PrefPro Prod. RefPro%Type,..., PErr Out Number) I s Begin I n s e r t Into Prod Values ( PrefPro,..., PPriUni ) ; Commit ; PErr :=0; Exception When Dup Val On Index Then PErr :=1; When Others Then PErr := 1 ; End ;

147/170 Packages Le corps du package Syntaxe Procedure ModifProd ( PrefPro Prod. RefPro%Type,..., PErr Out Number) I s B Boolean ; Begin... EndPackProd ; /

148/170 Packages Appels des procédures / fonctions du package Syntaxe Les procédures et les fonctions définies dans un package sont appelées de la façon suivante : <NomPackage>.<NomProcedure >[( Paramètres ) ] ; Var := <NomPackage>.<NomFonction >[( Paramètres ) ] ;

149/170 Packages Appels des procédures / fonctions du package Exemple Accept VRef Prompt...... ; Accept VPri Prompt...... ; Declare VErr Number ; Begin PackProd. ModifProd(&VRef,..., &VPri, VErr ) ; End ; / I f VErr= 0 Then DBMS Output. P u t L i n e ( Traitement e f f e c t u é ) ; Else DBMS Output. P u t L i n e ( E r r e u r ) ; End I f ;

150/170 Packages Packages : Exemples Création le corps du package suivant en mode interactif : SQL> create or r e p l a c e package body pack1 i s 2 f u n c t i o n d o u b l e x ( x number ) r e t u r n number i s 3 begin 4 r e t u r n (2 x ) ; 5 end ; 6 end ; 7 / A v e r t i s s e m e n t : Corps de package c r é é avec e r r e u r s de c o m p i l a t i o n.

151/170 Packages Packages : Exemples Pour afficher les erreurs on utilise la commande SHOW ERRORS SQL> show e r r o r s E r r e u r s pour PACKAGE BODY PACK1 : LINE/COL ERROR 0/0 : C o m p i l a t i o n u n i t a n a l y s i s t e r m i n a t e d 1/14 PLS 00201: l i d e n t i f i c a t e u r PACK1 d o i t ê t r e d é c l a r é 1/14 PLS 00304: i m p o s s i b l e de c o m p i l e r l e c o r p s de PACK1 s a n s p é c i f i c a t i o n SQL>

152/170 Triggers Les triggers (Déclencheurs) Un trigger est un programme qui s exécute automatiquement avant ou après une opération LMD (Insert, Update, Delete) Contrairement aux procédures, un trigger est déclenché automatiquement suite à un ordre LMD

153/170 Triggers Evénement-Condition-Action Un trigger est activé par un événement Insertion, suppression ou modification sur une table Si le trigger est activé, une condition est évaluée Prédicat qui doit retourner vrai Si la condition est vraie, l action est exécutée Insertion, suppression ou modification de la base de données

154/170 Triggers Composants du trigger À quel moment se déclenche le trigger? BEFORE : le code dans le corps du triggers s exécute avant les évènements de déclenchement LMD AFTER : le code dans le corps du triggers s exécute avant les évènements de déclenchement LMD

155/170 Triggers Composants du trigger Les évènements du déclenchement : Quelles sont les opérations LMD qui causent l exécution du trigger? INSERT UPDATE DELETE La combinaison des ces opérations

156/170 Triggers Composants du trigger Le corps du trigger est défini par un bloc anonyme [DECLARE] BEGIN [ EXEPTION ] END;

157/170 Triggers Composants du trigger Syntaxe Create [ Or Replace ] Trigger <Nom Trigger> [ B e f o r e A f t e r ] <O p é r a t i o n DML> On <Nom Table> [ For Each Row ] [ When <C o ndition >] Declare Begin Exception End ; /

158/170 Triggers Composants du trigger Exemple Création d un trigger qui remplit la table statistique (Nom Table Nb Insert) lors d une insertion dans la table facture Create Or R e p l a c e Trigger S t a r t F a c t u r e A f t e r I n s e r t On F a c t u r e For Each Row Declare VNbInsert Number ; Begin S e l e c t N b I n s e r t Into VNbInsert From S t a t i s t i q u e Where Nom Table= F a c t u r e ; Update S t a t i s t i q u e Set N b I n s e r t = VNbInsert+1 Where Nom Table= F a c t u r e ; Exception When No Data Found Then I n s e r t Into S t a t i s t i q u e Values ( 1, F a c t u r e ) ; End ; /

159/170 Triggers Manipulation des triggers Activer ou désactiver un Trigger: Alter Trigger <Nom Trigger> [ Enable D i s a b l e ] ; Supprimer un Trigger: Drop Trigger <Nom Trigger >; Déterminer les triggers de votrebd: Select Trigger Name From U s e r T r i g g e r s

160/170 Triggers Les attributs :Old et :New Ces deux attributs permettent de gérer l ancienne et la nouvelle valeurs manipulées Insert(...)... New Delete... Where(...)... Old Update... Set (...)... New Where(...)... Old

161/170 Exemple : Triggers Les attributs :Old et :New E t u d i a n t ( Matr Etu, Nom,..., Cod Cla ) C l a s s e ( Cod Cla, Nbr Etu ) Trigger mettant à jour la table classe suite à une insertion d un nouvel étudiant Create or Replace Trigger MajNbEtud A f t e r I n s e r t On E t u d i a n t For Each Row Begin Update C l a s s e Set Nbr Etud = Nbr Etud+1 Where Cod Cla =:New. Cod Cla ; End ; /

162/170 Triggers Les prédicats inserting, updating et deleting Inserting: True: Le trigger est déclenché suite à une insertion False: Sinon Updating: True: le trigger est déclenché suite à une mise à jour False: sinon Deleting: True: le trigger est déclenché suite à une suppression False: sinon

163/170 Triggers Les prédicats inserting, updating et deleting Exemple Create Or Replace Trigger MajNbEtud A f t e r I n s e r t Or Delete On E t u d i a n t For Each Row Begin I f I n s e r t i n g Then Update C l a s s e Set Nbr Etud = Nbr Etud+1 Where Cod Cla =:New. Cod Cla ; End I f ; I f D e l e t i n g Then Update C l a s s e Set Nbr Etud = Nbr Etud 1 Where Cod Cla =: Old. Cod Cla ; End I f ; End ; /

164/170 Séquences Séquences Syntaxe Auto-incrémentation d une colonne (évite les doublons) Définition : CREATE SEQUENCE sequence name [INCREMENT BY #] [START WITH #] [ MAXVALUE # NOMAXVALUE] [ MINVALUE # NOMINVALUE] [ CYCLE NOCYCLE] Suppression DROP SEQUENCE sequence name Pseudo-colonne CURRVAL : Valeur courante de la séquence Pseudo-colonne NEXTVAL : Incrémentation de la séquence et retourne la nouvelle valeur

165/170 Séquences Exemple Séquences drop sequence SEQ ANNOTATION ; create sequence SEQ ANNOTATION s t a r t with 1 i n c r e m e n t by 1 n o c y c l e maxvalue 30000 INSERT INTO p r o f ( prof num, prof nom, prof prenom ) VALUES (SEQ ANNOTATION. NEXTVAL, Dupond Michel ) SELECT s e q a n n o t a t i o n. CURRVAL from d u a l ;

166/170 SQL dynamique SQL dynamique Construction dans un programme une requête SQL avant de l exécuter Possibilité de création d un code générique et réutilisable (sinon simple paramètrage de valeur de remplacement de la clause where) Execute immediate chaine_de_caractères ; chaine_de_caractères est une commande sql donnée entre...

167/170 SQL dynamique SQL dynamique Exemple 1 : Begin Execute immediate c r e a t e t a b l e t e s t ( c o l 1 : number ) ; ; End ; Exemple 2 : Declare W req varchar2 ( 4 0 0 0 ) ; Begin w req := c r e a t e t a b l e t e s t ( c o l 1 : number ) ; ; Execute immediate w r e q ; End ;

168/170 Contrôle de transactions Contrôle de transactions Commandes COMMIT et ROLLBACK Lancer une transaction avec la première commande du LMD à la suite d un COMMIT ou un ROLLBACK Utiliser le COMMIT ou le ROLLBACK de SQL pour terminer une transaction

169/170 Contrôle de transactions Commande ROLLBACK

170/170 Contrôle de transactions Contrôle de transactions Déterminer le traitement des transactions pour le bloc suivant BEGIN END; INSERT INTO temp ( num col1, num col2, c h a r c o l ) VALUES ( 1, 1, ROW 1 ) ; SAVEPOINT a ; INSERT INTO temp ( num col1, num col2, c h a r c o l ) VALUES ( 2, 2, ROW 2 ) ; SAVEPOINT b ; INSERT INTO temp ( num col1, num col2, c h a r c o l ) VALUES ( 3, 3, ROW 3 ) ; SAVEPOINT c ; ROLLBACK TO SAVEPOINT b ; COMMIT;