SQL sous Oracle SIMPLE QUERY LANGUAGE OLIVIER DEHECQ

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

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

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

Bases de données avancées

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

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

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

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

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

Langage SQL : créer et interroger une base

TP Contraintes - Triggers

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

Devoir Data WareHouse

Olivier Mondet

CREATION WEB DYNAMIQUE

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

Corrigés détaillés des exercices

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

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

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

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

SQL Historique

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

Le Langage De Description De Données(LDD)

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

A QUOI SERVENT LES BASES DE DONNÉES?

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

Optimisation SQL. Quelques règles de bases

Bases de Données Avancées PL/SQL

Le langage SQL Rappels

Le Langage SQL version Oracle

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

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

Création et Gestion des tables

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

Oracle Le langage procédural PL/SQL

Intégrité des données

Les bases de données

Auto-évaluation Oracle: cours de base

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

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

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

A QUOI SERVENT LES BASES DE DONNÉES?

Compétences Business Objects

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

Bases de données et sites WEB

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

Mysql avec EasyPhp. 1 er mars 2006

FileMaker 13. Guide de référence SQL

Introduction au PL/SQL Oracle. Alexandre Meslé

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

Historisation des données

Introduction aux Bases de Données 2004/2005

MySQL / SQL EXEMPLES

Gestion des utilisateurs et de leurs droits

Bases de données relationnelles

Les BASES de DONNEES dans WampServer

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

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

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

Le langage procédural PL-PGSQL

Bases de Données Réparties Concepts et Techniques. Matthieu Exbrayat ULP Strasbourg - Décembre 2007

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

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

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

Les bases fondamentales du langage Transact SQL

Mysql. Les requêtes préparées Prepared statements

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

Quelques aspects du Relationnel-Objet du SGBD Oracle

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

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

OpenPaaS Le réseau social d'entreprise

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

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

Systèmes de Gestion de Bases de Données

Gestion de base de données

Présentation Windows Azure Hadoop Big Data - BI

BTS/CGO P10 SYSTEME INFORMATION Année

TP Bases de données réparties

TP3 : Creation de tables 1 seance

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

Encryptions, compression et partitionnement des données

1. Base de données SQLite

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)

1 Introduction et installation

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

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

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

Durée : 4 heures Le sujet se présente sous la forme de deux dossiers indépendants

Bases de Données Réparties

SQL Server Cyril Gruau. 11 février 2003

Support de cours. Introduction à SQL et MySQL. 2003, Sébastien Namèche

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

SQL Server 2000, Analysis Services et DTS

Access et Org.Base : mêmes objectifs? Description du thème : Création de grilles d écran pour une école de conduite.

Oracle Décisionnel : Modèle OLAP et Vue matérialisée D BILEK

MODE OPERATOIRE OPENOFFICE BASE

Transcription:

2016 SQL sous Oracle SIMPLE QUERY LANGUAGE OLIVIER DEHECQ

Table des matières 1 Règles spécifiques à Oracle... 3 2 Data Definition Language... 4 3 Data Manipulation Language... 5 4 PL/SQL (Procedural Language)... 9 Olivier DEHECQ http://aide.informatique1.fr Page 2

1 Règles spécifiques à Oracle Pas de SELECT sans FROM : Sous Oracle, on ne fait jamais de SELECT sans FROM (DUAL est le nom de la table par défaut) Exemple de requête nécessitant la table DUAL : SELECT sysdate FROM dual; En effet, la date système n est pas inscrite dans une table, c est une variable système d Oracle. Cependant, il s agit bien d une requête SELECT puisqu on veut voir la valeur de cette variable. Il faut donc utiliser la table DUAL. La table DUAL est la table utilisée pour les SELECT qui ne prendraient normalement pas de FROM. En DML, il faut commiter : Une personne qui n a pas l habitude de manipuler des données d Oracle oubliera au moins une fois de valider la modification des transactions. Les modifications du contenu des tables doitêtre commitées (COMMIT;) autrement les ces modifications sont volatives et seulement visibles par l utilisateur qui a modifié ces données. SQL_USER1> UPDATE matable SET colonne2='valeur1' WHERE colonne1='condition'; SQL_USER1> COMMIT; les modifications sont validées et écrites SQL_USER2> SELECT colonne1, colonne2 FROM matable; colonne1 colonne2 condition Valeur1 SQL_USER1> UPDATE matable SET colonne2='newvaleur' WHERE colonne1='condition'; SQL_USER2> SELECT colonne1, colonne2 FROM matable; USER1 n a pas commité colonne1 colonne2 condition Valeur1 on trouve donc Valeur1 au lieu de NewValeur Olivier DEHECQ http://aide.informatique1.fr Page 3

2 Data Definition Language Les types de valeurs d une table : VARCHAR(x) / VARCHAR2(x) correspond à du format chaîne de caractères. VARCHAR2(x) est préconisé. (x) correspond à la longueur de la variable. VARCHAR2(10) NUMBER(x,y) correspond à une format numérique. x correspond au nombre de décimales avant la virgule, y correspond au nombre de décimales après la virgule. Exemple NUMBER(5,2) pour un nombre pouvant aller jusqu à 99999,99 Supprimer une table : Syntaxe : DROP PURGE table [CASCADE CONSTRAINT] CASCADE CONSTRAINT : supprime les clés étrangères présentes dans les autres tables se référant à la table supprimée PURGE : supprime physiquement la table (vide les blocs), pas de retour en arrière (ROLLBACK) possible. DROP TABLE vehicules CASCADE CONSTRAINT; Modifier une table : Syntaxe : ALTER TABLE MODIFY ALTER TABLE clients MODIFY ( nom varchar2(50) not null, prenom varchar2(50) ); Changer le nom d'une table : Syntaxe : RENAME nom TO nouveau_nom ; RENAME clients to customers; Retour en arrière : Syntaxe : FLASHBACK TABLE table TO BEFORE DROP; Récupère la structure de la table avant sa suppression Retour à une date antérieure : La transaction doit-être validée (COMMIT) avant. Penser à faire : CREATE TABLE ( ) ENABLE ROW MOVEMENT; FLASHBACK TO TIMESTAMP (22/08/2011 11:51:00, DD/MM/YYYY HH24:MI:SS); Indexer un champ : Syntaxe : CREATE INDEX champ ON table (colonne [DESC][,...]); CREATE INDEX ind_exemple ON clients(nom, prenom); Olivier DEHECQ http://aide.informatique1.fr Page 4

3 Data Manipulation Language Les Fonctions (un site web ici) : La concaténation consiste à fusionner plusieurs valeurs pour n en fait qu une seule. Syntaxe : SELECT CONCAT(a,b); SQL> SELECT CONCAT ('Un','Exemple','Simple'); UnExempleSimple SQL> SELECT CONCAT ('Un',NULL); NULL SELECT ou UPDATE ou INSERT ou DELETE ou renvoit une valeur de type VARCHAR2 renvoit un champ NULL SELECT ou UPDATE ou INSERT ou DELETE ou Syntaxe : SELECT a b; EXECUTE IMMEDIATE 'SELECT ' SELECT col1 FROM table1 ' FROM table2'; Nota : EXECUTE IMMEDIATE 'instruction'; exécute une instruction PL/SQL Il est possible de récupérer des informations sur une valeur Syntaxe : INSTR(c1,c2,n,m) Position de la n ième occurrence (DEFAULT 1) de c2 dans c1, à partir du m ième caractère SQL> INSTR('bonjour','o',1,3) 5 renvoit la position de la 1 ère occurrence de 'o' à partir du 3 ème caractère Il est aussi possible d extraire une partie de chaîne. Syntaxe : SUBSTR(c1,n,m) Extrait m caractères de c1 à partir du n ième caractère. SQL> SELECT SUBSTR('Bonjour',3,4) FROM dual; njou extrait 4 caractères de "Bonjour" à partir du 3 ème caractère CURRENT_DATE renvoie la date Il est possible de convertir une valeur obtenue dans un type différent. TO_CHAR / TO_DATE / TO_NUMBER Syntaxe pour TO_CHAR : TO_CHAR( valeur, [masque de format], [nls_language]) SQL> TO_CHAR(1210.73, ' 9,999.99'); ' 1,210.73' Il est possible de remplacer une valeur NULL par une autre valeur. extrait 4 caractères de "Bonjour" à partir du 3 ème caractère Syntaxe : COALESCE(expr1,expr2, expr_n) SQL> SELECT COALESCE(colonne1,colonne2) colonne3 FROM table1; Si colonne1 n est pas NULL alors colonne3=colonne1, sinon si colonne2 n est pas NULL alors colonne3=colonne2, sinon si colonne2 est NULL alors colonne3 garde sa valeur. Il est possible de remplacer une valeur par une autre valeur. Syntaxe : DECODE(expr1,search,result[,search,result] [,default]) SQL> SELECT colonne1 DECODE(id,1, 'titi',2,'toto','tata') FROM table1; Si id=1 alors colonne1='titi', si id=2 alors colonne1='toto', dans les autres cas, colonne1='tata'. Il est possible de faire des opérations sur les dates. Syntaxe : TRUNC(date,[format]) SQL> TRUNC(TO_DATE('24-NOV-13'), 'YEAR'); 01-JAN-13 renvoie la date correspondant au premier jour de l année de la date définie Syntaxe : ADD_MONTHS(date,n) SQL> ADD_MONTHS('24-NOV-13',1) 24-DEC-13 ajoute 1 mois à la date définie Syntaxe : MONTHS_BETWEEN(date1,date2) SQL> MONTHS_BETWEEN (TO_DATE ('2013/01/01', 'yyyy/mm/dd'), TO_DATE ('2013/03/14', 'yyyy/mm/dd')) -2.41935483870968 il y a -2,42 mois entre le 01/01/2013 et le 14/03/2013 Les instructions Olivier DEHECQ http://aide.informatique1.fr Page 5

Il est possible de supprimer l ensemble des lignes d une table. Attention : irréversible, immédiat Syntaxe : TRUNCATE TABLE table; SQL> TRUNCATE TABLE "clients"; Tout SELECT doit être suivi de FROM Syntaxe : SELECT FROM table; SQL> SELECT sysdate FROM dual; Les transactions Sous OracleDB10g, toutes les instructions du DML se passent dans une transaction. renvoit la date système Calcul d'agrégat Fonctionnement de la commande Rollback Il est possible d afficher le résultat du calcul de plusieurs enregistrements. Count : compter le nombre d enregistrements Sum : afficher la somme (sur une colonne numérique ou date) Avg : afficher la moyenne (sur une colonne numérique ou date) Min : affiche la valeur de l enregistrement ayant le plus petit résultat Max : affiche la valeur de l enregistrement ayant le plus grand résultat Group by indique ce qui permet de faire les groupes (exemple : les hommes et les femmes, la première lettre du prénom, l année de naissance, etc.) Having est l équivalent de la clause where lorsqu on fait du calcul d agrégat Syntaxe : SELECT AVG(Champ1) AS "NomDuLibelléDeColonne" FROM Table GROUP BY Champ2 HAVING Champ1>Valeur; Select MAX(Version) AS "DerniereVersionParAnnée" FROM Applications GROUP BY YEAR(Date) HAVING Type='Comptabilité'; Jointures Jointures naturelles Syntaxe : SELECT * FROM Employes NATURAL JOIN Services; Permet de réaliser une jointure automatique en se basant sur l intitulé du champ. Il doit-être identique dans les deux tables. Olivier DEHECQ http://aide.informatique1.fr Page 6

Jointures Internes / Externes inner join permet de regrouper les enregistrements d une tables dans une autre table. INNER JOIN classique : SELECT CONGES.CODEEMP, CONGES.ANNEE,nbJoursAcquis, SUM(nbJoursPris) FROM CONGES INNER JOIN CONGESMENS ON CONGES.CODEEMP = CONGESMENS.CODEEMP AND CONGES.ANNEE = CONGESMENS.ANNEE GROUP BY CONGES.CODEEMP, CONGES.ANNEE, nbjoursacquis; Afficher le contenu de la table congés (contient le code employé, l année et le nombre de jours acquis par l employé pour l année) et mettre le tout dans la table congemens (contient le code employé, l année, le mois et le nombre de jours pris par l employé dans le mois). Cela permet d afficher le nombre de jours pris dans l année. INNER JOIN avec USING : SELECT CODEEMP, ANNEE,nbJoursAcquis, SUM(nbJoursPris) FROM CONGES INNER JOIN CONGESMENS USING (annee,codeemp) GROUP BY CODEEMP, ANNEE, nbjoursacquis; C est la même chose que dans le premier exemple à part que dans ce cas, les colonnes qui servent pour la jointure des deux tables sont définies explicitement. C est plus rapide que la première méthode, mais comme c est du SQL2.0 c est moins répandu. Union, Intersection, Difference Ces opérateurs permettent d obtenir dans une requête des enregistrements provenant de requêtes différentes mais ayant la même forme (même nombre/type/ordre des colonnes). C est-à-dire des requêtes qui touchent à la même chose. Par exemple des requêtes qui concernent les employés : Syntaxe : Tables utilisées dans les exemples suivants SELECT A, B FROM a MINUS UNION INTERSECT SELECT A, B FROM b; MINUS pour faire la différence entre deux tables Permet d afficher les enregistrements de a mais pas ceux de b : SELECT * FROM a MINUS SELECT * FROM b; Olivier DEHECQ http://aide.informatique1.fr Page 7

UNION pour afficher l ensemble des champs des deux tables Les enregistrements de a + les enregistrements de b : SELECT * FROM a UNION SELECT * FROM b; Nota : UNION ALL affiche les doublons INTERSECT pour afficher les champs communs aux deux tables Les enregistrements communs à a et à b SELECT * FROM a INTERSECT SELECT * FROM b; champ en plus avec UNION ALL Tri Vues Permet de trier les résulats obtenus. DESC permet d afficher par ordre descroissant. Syntaxe : SELECT * FROM table ORDER BY <ChampsDeTri> [DESC]; SELECT * FROM table ORDER BY 2, 1 DESC; Permet de créer une table temporaire. Syntaxe : CREATE VIEW nomvue AS SELECT FROM WHERE ORDER BY WITH CHECK OPTIONS; Séquence Permet de créer une une valeur auto-incrémentée. Syntaxe : 2, 1 : numéros des colonnes à trier CREATE SEQUENCE sq_employes_codeemp START WITH 3; INSERT INTO Employes VALUES (sq_employes_codeemp.nextval, Picasso, ); Synonyme Chaque utilisateur Oracle (chaque personne qui utilise une session différente) utilise un schéma qui lui est attribué. Ce schéma préfixe de façon transparente le nom de chaque table, afin qu il n y ait pas de conflit si deux utilisateurs veulent créer et modifier leur table Employes sur une base de données existante. utilisateur1.employes et utilisateur2.employes Un synonyme permet de rendre publique une table en lui donnant un alias : Syntaxe CREATE [PUBLIC] SYNONYM Empl FOR Z.Employes; PUBLIC publie la table pour tous les utilisateurs Z est le nom du schéma Oracle auquel appartient l objet (login) Cela permet, lorsqu on désigne Employes de faire implicitement référence à Z.Employes Olivier DEHECQ http://aide.informatique1.fr Page 8

4 PL/SQL (Procedural Language) Le PL/SQL est le langage des procédures sous Oracle. L équivalent de PL/SQL pour SQL Server est le Transac. PL/SQL gère : toutes les commandes SQL, les variables, les contrôles, les boucles, le traitement des erreurs. Le bloc : Un bloc est toujours organisé de la façon suivante : --déclaration des variables; --ensemble d instructions SQL et/ou PL/SQL; EXCEPTION --traitement des exceptions ; Gestion des variables : Affichage de base : «valeur de vnb : 1» : vnb INTEGER; vnb :=1 DBMS_OUTPUT.PUT_LINE('valeur de vnb : ' vnb); Récupérer tous les champs d une ligne d une table : lempemployes%rowtype; SELECT * INTO lemp FROM Employes WHERE codeemp=1; DBMS_OUTPUT.PUT_LINE ( lemp.nom lemp.prenom); Récupérer un enregistrement (scalaire) d un champ d une ligne : lempvarchar2(80) Employes.nom%TYPE; SELECT nom INTO lemp FROM Employes WHERE codeemp=1; DBMS_OUTPUT.PUT_LINE (lemp); Les chemins alternatifs IF / THEN / ELSE / END IF; vnb NUMBER := 2; IF vnb> 5 THEN DBMS_OUTPUT.PUT_LINE('plus grand que 5'); ELSE DBMS_OUTPUT.PUT_LINE('plus petit ou egal à 5'); END IF; Olivier DEHECQ http://aide.informatique1.fr Page 9

CASE / WHEN / ELSE / END CASE; CASE WHEN condition1 THEN action1; WHEN condition2 THEN action2; ELSE action3; END CASE; Les boucles répétitives LOOP (complexe): <<boucle>> LOOP -- Instructions; -- Changement valeur de variable; EXIT boucle WHEN condition; END LOOP boucle; FOR (pas de 1 ou -1 seulement) : FOR vn IN [REVERSE] 1..10 LOOP REVERSE : pas de -1 ; 1..10 (de 1 à10) -- Instructions; END LOOP; WHILE (à retenir) : Variable := ValeurDeDébut WHILE condition LOOP; -- Instruction; -- Changement valeur de variable; END LOOP; Les curseurs Un curseur récupère les numéros d enregistrements à partir d une requête SELECT. Il est ensuite possible de passer tous les enregistrements les uns à la suite des autres. Le but est de pouvoir faire des manipulations sur les lignes de cette requête Ecriture de la procédure Fonctionnement des curseurs CURSOR cemp IS SELECT codeemp, nom, prenom FROM Employes; lempcemp%rowtype; OPEN cemp; FETCH cemp INTO lemp; DBMS_OUTPUT.PUT_LINE('employé : ' lemp.nom ' ' lemp.prenom); CLOSE cemp; Olivier DEHECQ http://aide.informatique1.fr Page 10

Explications CURSOR cemp IS requête_select; Déclaration et définition des valeurs du curseur lempcnon%rowtype; lemp est formaté pour correspondre aux types des champs de la requête decemp OPEN CLOSE cemp; Ouverture / fermeture de l utilisation du curseur cemp FETCH cemp INTO lemp FETCH passe à la valeur suivante de cemp. La première utilisation de FETCH (après un OPEN) envoie à la première valeur trouvée de cemp Curseur dans une boucle FOR C est la façon la plus simple de l utiliser. Passe en revue les enregistrements de la requête l un après l autre jusqu au dernier. Le but est de faire des mises à jour sélectives de tables/champs. CURSOR cemp IS SELECT codeemp, nom, prenom FROM Employes; lempcemp%rowtype; FOR lemp IN cemp LOOP DBMS_OUTPUT.PUT_LINE('employé : ' lemp.nom ' ' lemp.prenom); END LOOP; Attention à l ordre : FETCH cemp INTO lemp est différent de FOR lemp IN cemp LOOP La gestion des erreurs Il existe deux types d erreurs : Les erreurs prédéfinies dans Oracle (trop de champs par rapport au résultat attendu, aucun enregistrement retourné, etc.), Les erreurs définies par le développeur. Les erreurs prédéfinies dans Oracles vnomemployes.nom%type; SELECT nom INTO vnom FROM Employes WHERE codedepartement='compt'; DBMS_OUTPUT.PUT_LINE('L''unique employé est ' vnom); SELECT nom INTO vnom FROM Employes; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Il y a plus d''un employé dans ce service'); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Il n''y a aucun employé dans ce service'); WHEN OTHERS DBMS_OUTPUT.PUT_LINE('Erreur autre'); Construction : WHEN nom_de_lerreur THEN -- Instructions jusqu au prochain WHEN ou Quitte ensuite le bloc. Il n est pas possible de revenir à la procédure après une erreur. Olivier DEHECQ http://aide.informatique1.fr Page 11

Les erreurs définies par le développeur (erreurs personnalisées) trop EXCEPTION; vnbjourspris NUMBER; vnbjourspris := 47; IF vnbjourspris > 31 THEN RAISE trop; END IF; INSERT INTO CongesMens VALUES (1,2011,10, vnbjourspris); EXCEPTION WHEN trop THEN INSERT INTO CongesMens VALUES (1,2011,10, 31); Construction : On définit un nom d erreur (son type est EXCEPTION). Pour envoyer à la résolution de l erreur on RAISE l erreur, ce qui amène à la section EXCEPTION. Alternative Il est aussi possible, sans ajouter l erreur à la section EXCEPTION, de définir l erreur ainsi : RAISE_APPLICATION_ERROR (NumeroDeLErreur, Description) ; RAISE_APPLICATION_ERROR (-20100, 'le nombre de jours est supérieur à 30'); Nota : Le numéro d erreur doit être compris entre -20000 et -20999 Les blocs nommés Procédures : ensemble d instructions, ne retourne pas de valeur Fonctions : ensemble d instructions, retourne une seule valeur à la fin Les procédures Syntaxe : CREATE [OR REPLACE] PROCEDURE nom [(paramètres)] AS IS Bloc PL/SQL (sans le mot, finit par ) Les paramètres : [(nomparam {IN OUT IN OUT} type* [DEFAULT NULL**](,nomparam2 )] * sans la taille exemple : VARCHAR, NUMBER ** pour un paramètre optionnel Appel : Olivier DEHECQ http://aide.informatique1.fr Page 12

/* Création d'une procédure */ CREATE PROCEDURE bonjour(nom IN VARCHAR2) AS DBMS_OUTPUT.PUT_LINE('Bonjour ' nom '!'); /* Appel depuis un bloc */ vnom VARCHAR2(30) := 'Olivier Dehecq'; bonjour(vnom); /* Appel direct */ EXECUTE bonjour('mc Guyver'); Les fonctions (revoit UNE valeur à la fin) Syntaxe : CREATE [OR REPLACE] FUNCTION nom [(paramètres)] RETURN type* AS IS Bloc PL/SQL (sans le mot, finit par ) RETURN (variable) ; * le type de la valeur qui est renvoyée par la fonction Les paramètres : [(nomparam [IN] type* [DEFAULT NULL**](,nomparam2 )] *sans la taille exemple : VARCHAR, NUMBER ** pour un paramètre optionnel Appel : Exemples : /* Creation d'une fonction */ CREATE OR REPLACE FUNCTION addition(a NUMBER, b IN NUMBER) RETURN NUMBER AS RETURN (a+b); /* Appel d'une fonction */ SELECT addition(112,78) FROM DUAL; /* Création d'une fonction plus longue */ CREATE OR REPLACE FUNCTION departement(numdep NUMBER) RETURN VARCHAR2 AS vnomdep VARCHAR2(30); CASE numdep WHEN 1 THEN vnomdep := 'AIN'; WHEN 2 THEN vnomdep := 'AISNE'; WHEN 3 THEN vnomdep := 'ALLIER'; ELSE vnomdep := 'Autredépartement'; END CASE; RETURN (vnomdep); /* Appel d'une fonction */ SELECT departement(44) FROM DUAL; Les TRIGGERS : Un TRIGGER est un bout de code qui s enclenche automatiquement lors d un INSERT / UPDATE / DELETE. Olivier DEHECQ http://aide.informatique1.fr Page 13

Il se déclenche soit avant, soit après la mise à jour de la table. Peut s exécuter plusieurs une seule fois pour plusieurs mises à jours, ou bien à chaque enregistrement modifié. Mise en place Trigger validant ou non la modification de la table : CREATE [OR REPLACE] TRIGGER bf_insert_employe {BEFORE AFTER} {INSERT UPDATE MODIFY} ON Table [FOR EACH ROW] Bloc complet (avec ); Trigger modifiant les données avant la mise à jour de la table : CREATE [OR REPLACE] TRIGGER bf_insert_employe INSTEAD OF {INSERT UPDATE MODIFY} ON Table [FOR EACH ROW] Bloc complet (avec ); Exemples : /* Creation d'un trigger */ CREATE OR REPLACE TRIGGER bf_insert_employe BEFORE INSERT ON Employes FOR EACH ROW existe INTEGER; --> vérifie si le service existe sinon il est créé SELECT COUNT(*) INTO existe FROM Departements WHERE codedepartement= :NEW.codeDepartement; IF existe = 0 THEN INSERT INTO DepartementsVALUES(:NEW.codeDepartement, 'Service ' :NEW.codeDepartement); END IF; --> verification de la clé primaire SELECT COUNT(*) INTO existe FROM Employes WHERE CodeEmp= :NEW.codeEmp; IF existe!= 0 OR :NEW.codeEmp IS NULL THEN SELECT MAX(codeEmp)+1 INTO :NEW.codeEmp FROM Employes; END IF; (Des)activer un trigger: ALTER TRIGGER bf_insert_employe DISABLE; ALTER TRIGGER bf_insert_employe ENABLE; Olivier DEHECQ http://aide.informatique1.fr Page 14