Technologie Oracle : Extensions procédurales à SQL



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

TP Contraintes - Triggers

Bases de données avancées

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

Introduction à l'etl et application avec Oracle

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

Devoir Data WareHouse

Oracle Le langage procédural PL/SQL

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

Bases de Données Avancées PL/SQL

Le Langage SQL version Oracle

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

Le Langage De Description De Données(LDD)

Introduction à la modélisation dimensionnelle

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

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

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

Intégrité des données

Présentation du PL/SQL

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

Langage SQL : créer et interroger une base

A QUOI SERVENT LES BASES DE DONNÉES?

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

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

Auto-évaluation Oracle: cours de base

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

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

Historisation des données

Bases de données relationnelles

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

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

Application web de gestion de comptes en banques

A QUOI SERVENT LES BASES DE DONNÉES?

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

Introduction au PL/SQL Oracle. Alexandre Meslé

Les bases de données Page 1 / 8

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

Jérôme FESSY. IUT de Paris 5. Base de Données. Cours Introductif. Base de Données

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

CREATION WEB DYNAMIQUE

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

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

Compte-rendu de projet de Système de gestion de base de données

Bases de données avancées Introduction

Corrigés détaillés des exercices

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

Gestion de base de données

Création et Gestion des tables

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

Du 10 Fév. au 14 Mars 2014

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

Plan de formation : Certification OCA Oracle 11g. Les administrateurs de base de données (DBA) Oracle gèrent les systèmes informatiques

Olivier Mondet

Compétences Business Objects

Optimisation SQL. Quelques règles de bases

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Les bases de données

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

1/ Présentation de SQL Server :

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

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

Le langage procédural PL-PGSQL

SQL Server 2014 Administration d'une base de données transactionnelle avec SQL Server Management Studio

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

OpenPaaS Le réseau social d'entreprise

1 Introduction et installation

AGRÉGATION «ÉCONOMIE ET GESTION»

BIRT (Business Intelligence and Reporting Tools)

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

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

Administration des bases de données

1 Position du problème

CHAPITRE 1 ARCHITECTURE

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

BASES DE DONNEES TP POSTGRESQL

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)

SQL Server Administration d'une base de données transactionnelle avec SQL Server Management Studio (édition enrichie de vidéos)

Programme détaillé. Administrateur de Base de Données Oracle - SQLServer - MySQL. Objectifs de la formation. Les métiers

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Bases de données et sites WEB

Stockage du fichier dans une table mysql:

I. MySQL : Serveur et SGBD

Bases de Données. Le cas des BD relationnelles ouverture sur les BD relationnelles spatiales Séance 2 : Mise en oeuvre

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

Encryptions, compression et partitionnement des données

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

TP3 : Creation de tables 1 seance

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

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

Introduction à MATLAB R

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

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

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

Transcription:

Conception de bases de données Technologie Oracle : Extensions procédurales à SQL http://bdd.crzt.fr STÉPHANE CROZAT Paternité - Partage des Conditions Initiales à l'identique : http://creativecommons.org/licenses/by-sa/.0/fr/ juillet 0

Table des matières I - Théorie : Oracle A. Introduction à Oracle.... Exemple complet BD "Gestion des intervenants".... Présentation.... Particularités LDD.... Dictionnaire de données.... Les séquences.... Particularités LMD.... Fonctions SQL à connaître.... Fonctions de traitement des dates.... SQL*Plus...0 0. Accès inter-schémas.... Fenêtrage des données... B. Le langage procédural PL/SQL.... Présentation du PL/SQL.... Structure d'un bloc PL/SQL.... Variables.... Affichage à l'écran.... Structures de contrôle.... Blocs PL/SQL : Procédure, fonction, bloc anonyme.... Affectation par une requête SELECT INTO.... Exercice.... Curseurs PL/SQL... 0. Exercice...0. Gestion d'exception...0. Durée de tournage d'un film... C. Les triggers....... Principes des triggers... Manipulation des anciennes et nouvelles valeurs dans les triggers... Prédicats d'événement au sein des triggers... Exercice... D. Prise en main de Oracle SQL Developer......... Installation de SQL Developer... Connexion avec SQL Developer... Naviguer dans le catalogue de SQL Developer... Exécuter des requêtes SQL avec SQL Developer... Écrire du PL/SQL avec SQL Developer...0 Exécution de fichiers SQL...

II - Pratique : SQL sous Oracle A. Migration d'une base Access vers Oracle... B. Séquence... C. Extension Médiathèque... D. Transactions... E. Questions avancées en SQL... F. Maintenance de la base... G. Vue... III - Pratique : PL/SQL sous Oracle A. Fonctions stockées... B. Curseurs... C. Triggers... IV - Application : Oracle A. Dictionnaire de données... B. SQL sous Oracle... V - Test : Oracle VI - Questions-réponses sur Oracle VII - En résumé : Oracle VIII - Bibliographie commentée sur Oracle Questions de synthèse Solution des exercices Solution des exercices Signification des abréviations Bibliographie Webographie Index

Théorie : Oracle

I- Théorie : Oracle I Introduction à Oracle Le langage procédural PL/SQL Les triggers Prise en main de Oracle SQL Developer A. Introduction à Oracle Objectifs Utiliser un SGBD professionnel largement répandu Expérimenter l'usage du langage SQL Savoir créer et interroger une base de données sous Oracle Connaître les commandes de base de SQL*Plus Savoir utiliser le dictionnaire de données. Exemple complet BD "Gestion des intervenants" Exemple : Modèle conceptuel MCD "Cours et Intervenants" Exemple : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin)

Théorie : Oracle Exemple 0 CREATE TABLE tintervenant ( pknom varchar(0) PRIMARY KEY, prenom varchar(0) NOT NULL, poste number() ); CREATE TABLE tcours ( pkannee number() check (pkannee>000 and pkannee<00), pknum number(), titre varchar(0), type char() CHECK (type='c' or type='td' or type='tp') NOT NULL, fkintervenant varchar(0) REFERENCES tintervenant(pknom) NOT NULL, debut date, fin date, PRIMARY KEY(pkannee, pknum) ); Exemple 0 : Création des tables : Utilisation du catalogue SELECT table_name FROM user_tables; DESCRIBE tcours; TABLE_NAME -----------------------------TINTERVENANT TCOURS Name ------------PKANNEE PKNUM TITRE TYPE FKINTERVENANT DEBUT FIN Exemple Null -------NOT NULL NOT NULL Type -----------NUMBER() NUMBER() VARCHAR(0) NOT NULL CHAR() NOT NULL VARCHAR(0) DATE DATE : Création d'une séquence CREATE SEQUENCE tcoursseq; SEQUENCE_NAME -----------------------TCOURSSEQ SELECT sequence_name FROM user_sequences; Exemple : Initialisation des données INSERT INTO tintervenant (pknom, prenom, poste) VALUES ('CROZAT', 'Stéphane', ''); INSERT INTO tcours (pkannee, pknum, titre, type, debut, fkintervenant) VALUES ('00', tcoursseq.nextval, 'Introduction','C', '0-JAN00', 'CROZAT');

Théorie : Oracle 0 INSERT INTO tcours (pkannee, pknum, titre, type, debut, fkintervenant) VALUES ('00', tcoursseq.nextval, 'Modélisation','TD', '0-JAN00', 'CROZAT'); SELECT pknum, pkannee, titre FROM tcours; PKNUM PKANNEE TITRE ----- ------- ---------------- 00 Introduction 00 Modélisation Exemple : Question avec concaténation SELECT trim(prenom) ' ' trim(pknom) ' (' trim(poste) ')' FROM tintervenant; TRIM(PRENOM) '' TRIM(PKNOM) '(' TRIM(POSTE) ')' ----------------------------------------------------------------------------------STEPHANE CROZAT () Exemple : Question avec CASE SELECT pknum, CASE WHEN type='c' THEN 'Cours' WHEN type='td' THEN 'Travaux dirigés' END AS type_label, debut FROM tcours PKNUM ---- Exemple TYPE_LABEL --------------Cours Travaux dirigés DEBUT --------0-JAN-0 0-JAN-0 : Question avec date SELECT pknum, TO_CHAR(debut, 'fmday') FROM tcours; PKNUM ---- Exemple TO_CHAR(DEBUT,'FMDAY') ---------------------monday tuesday : Insert avec date INSERT INTO tcours (pkannee, pknum, titre, type, debut, fkintervenant) VALUES ('00', tcoursseq.nextval, 'Relationnel','C', TO_DATE('00-00','DD-MM-YYYY'), 'CROZAT'); SELECT debut FROM tcours; DEBUT

Théorie : Oracle --------0-JAN-0 0-JAN-0 0-JAN-0 Exemple 0 0 CREATE OR REPLACE FUNCTION fintervient (pintervenant varchar) RETURN varchar IS vnbinterventions number; SELECT Count(fkintervenant) INTO vnbinterventions FROM tcours WHERE fkintervenant=pintervenant; IF vnbinterventions > 0 THEN RETURN 'OUI'; ELSE RETURN 'NON'; END IF; END; / INSERT INTO tintervenant(pknom, prenom) VALUES ('JOUGLET', 'Antoine'); SELECT pknom, fintervient(pknom) AS I FROM tintervenant; PKNOM -------------------CROZAT JOUGLET Exemple 0 0 0 : Fonction et affectation par une requête I -----OUI NON : Curseur CREATE OR REPLACE PROCEDURE pafficheintervenants IS CURSOR cintervenants IS SELECT pknom, prenom FROM tintervenant; vnom tintervenant.pknom%type; vprenom tintervenant.prenom%type; DBMS_OUTPUT.PUT_LINE('** Liste des intervenants **'); OPEN cintervenants; LOOP FETCH cintervenants INTO vnom, vprenom; EXIT WHEN cintervenants%notfound; DBMS_OUTPUT.PUT_LINE('-' INITCAP(TRIM(vPrenom)) ' ' INITCAP(TRIM(vNom))); END LOOP; END; / CREATE OR REPLACE PROCEDURE pafficheintervenants IS CURSOR cintervenants IS SELECT pknom, prenom FROM tintervenant; DBMS_OUTPUT.PUT_LINE('** Liste des intervenants **'); FOR i IN cintervenants LOOP DBMS_OUTPUT.PUT_LINE('-' INITCAP(TRIM(i.prenom)) ' ' INITCAP(TRIM(i.pknom))); END LOOP;

Théorie : Oracle 0 END; / SET SERVEROUTPUT ON; pafficheintervenants; DBMS_OUTPUT.PUT_LINE(''); pafficheintervenants; END; / ** Liste des intervenants ** -Stéphane Crozat -Antoine Jouglet ** Liste des intervenants ** -Stéphane Crozat -Antoine Jouglet Exemple 0 0 CREATE OR REPLACE PROCEDURE pinsertintervenant (pnom varchar, pprenom varchar) IS INSERT INTO tintervenant (pknom, prenom) VALUES (pnom, pprenom); EXCEPTION WHEN DUP_VAL_ON_INDEX then DBMS_OUTPUT.PUT_LINE('Intervenant déjà existant : ' pnom); WHEN OTHERS THEN RAISE; END; / SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE('*** Programme indépendant ***'); pinsertintervenant('jouglet', 'Antoine'); pinsertintervenant('vincent', 'Antoine'); pafficheintervenants; END; / *** Programme indépendant *** Intervenant déjà existant : JOUGLET ** Liste des intervenants ** -Stéphane Crozat -Antoine Jouglet -Antoine Vincent Exemple : Gestion d'exception : Trigger de calcul de valeur dérivée CREATE OR REPLACE TRIGGER trcours BEFORE INSERT OR UPDATE OF debut ON tcours FOR EACH ROW :new.fin := :new.debut+; END; / UPDATE tcours

Théorie : Oracle 0 SET debut=to_date('-0-00','dd-mm-yyyy') WHERE pknum=; INSERT INTO tcours (pkannee, pknum, titre, type, fkintervenant, debut) VALUES ('00', tcoursseq.nextval, 'SQL', 'C', 'CROZAT', TO_DATE('0-00','DD-MM-YYYY')); SELECT pknum, debut, fin FROM tcours; PKNUM ---- Exemple 0 0 DEBUT --------0-JAN-0 0-JAN-0 -JAN-0 -JAN-0 FIN --------- 0-JAN-0 -JAN-0 : Trigger d'archivage de données CREATE TABLE tintervenantsav ( pknom varchar(0) PRIMARY KEY, prenom varchar(0) NOT NULL ); CREATE OR REPLACE TRIGGER trintervenant BEFORE DELETE OR INSERT ON tintervenant FOR EACH ROW IF DELETING THEN INSERT INTO tintervenantsav VALUES (:old.pknom, :old.prenom); ELSIF INSERTING THEN DELETE FROM tintervenantsav WHERE pknom = :new.pknom; END IF; END; / DELETE FROM tcours; DELETE FROM tintervenant; SELECT * FROM tintervenantsav; PKNOM -------------------CROZAT JOUGLET VINCENT INSERT INTO tintervenant (pknom, prenom, poste) VALUES ('CROZAT', 'Stéphane', ''); PKNOM -------------------JOUGLET VINCENT PRENOM -------------------Stéphane Antoine Antoine SELECT * FROM tintervenantsav; PRENOM -------------------Antoine Antoine. Présentation Le premier SGBDR commercialisé en Il occupe la première place dans le marché des SGBDR (avec IBM)

Théorie : Oracle Évolutions du produit : depuis la version, architecture client-serveur depuis la version, le serveur est objet-relationnel depuis la version i, intégration de couches applicatives Web et multimédia depuis la version i, intégration de types de données XML, extension des couches Web et introduction de fonctions de datawarehousing et de business intelligence Version actuelle (depuis 0) : Il fonctionne sous Unix, Linux, Windows. Site officiel en France : www.oracle.fr Il est possible de télécharger gratuitement Oracle à des fins de développement et de prototypage : http://otn.oracle.com/software/index.html. Particularités LDD Type de données NUMBER(e,d) DATE CHAR(l), VARCHAR(lmax) LONG, CLOB, BLOB, BFILE Remarque Il n'y a pas de type de données booléennes. Remarque : varchar et varchar varchar et varchar se comportent exactement de la même façon pour le moment ; mais Oracle prévoit d'utiliser différemment varchar dans le futur. Oracle recommande de ne pas utiliser varchar, mais d'utiliser varchar. Conseil : Pour entrer dans le détail Vous pouvez consulter Oracle : SQL [w_loria.fr/~roegel()], page et, pour avoir une description plus détaillée des types de données. http://docs.oracle.com/cd/b_0/server./b/datatype.htm Exemple tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple : BD "Gestion des intervenants" : Schéma relationnel : BD "Gestion des intervenants" : Création des tables CREATE TABLE tintervenant ( pknom varchar(0) PRIMARY KEY, prenom varchar(0) NOT NULL, poste number()

Théorie : Oracle 0 ); CREATE TABLE tcours ( pkannee number() check (pkannee>000 and pkannee<00), pknum number(), titre varchar(0), type char() CHECK (type='c' or type='td' or type='tp') NOT NULL, fkintervenant varchar(0) REFERENCES tintervenant(pknom) NOT NULL, debut date, fin date, PRIMARY KEY(pkannee, pknum) );. Dictionnaire de données Rappel Le dictionnaire des données contient la description des objets créés et maintenus par le serveur Oracle. Syntaxe : Lister les objets appartenant à l'utilisateur SELECT SELECT SELECT SELECT... * * * * FROM FROM FROM FROM user_tables; user_sequences; user_views; user_procedures; Syntaxe : Décrire un objet describe nom_objet Complément Afficher les différents types d'objets appartenant à l'utilisateur : SELECT object_type FROM user_objects; Afficher la liste des objets appartenant à l'utilisateur : SELECT * FROM user_catalog; Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple catalogue : BD "Gestion des intervenants" : Utilisation du SELECT table_name FROM user_tables; DESCRIBE tcours; TABLE_NAME -----------------------------TINTERVENANT TCOURS

Théorie : Oracle 0 Name ------------PKANNEE PKNUM TITRE TYPE FKINTERVENANT DEBUT FIN Null -------NOT NULL NOT NULL Type -----------NUMBER() NUMBER() VARCHAR(0) NOT NULL CHAR() NOT NULL VARCHAR(0) DATE DATE. Les séquences Définition : Séquence Les séquences permettent de générer automatiquement des numéros uniques (en général pour créer une valeur de clé primaire artificielle). Elles remplissent une fonction de compteur : mémoriser une valeur retourner la valeur incrémenter la valeur Remarque Les séquences sont des objets indépendants des tables. Syntaxe : Création de séquence CREATE SEQUENCE nom_sequence [START WITH x] Syntaxe : Valeur d'une séquence nom_sequence.currval Syntaxe : Incrément de séquence nom_sequence.nextval Remarque : user_sequences Table du catalogue où se trouvent les informations concernant les séquences. Remarque : START WITH La clause START WITH de l'instruction CREATE SEQUENCE permet de définir la première valeur de la séquence. Conseil : Pour entrer dans le détail Vous pouvez consulter Oracle : SQL [w_loria.fr/~roegel()], page, pour avoir une description plus détaillée de la syntaxe des séquences et disposer d'exemples.

Théorie : Oracle Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple séquence : BD "Gestion des intervenants" : Création d'une CREATE SEQUENCE tcoursseq; SEQUENCE_NAME -----------------------TCOURSSEQ SELECT sequence_name FROM user_sequences; Exemple données 0 : BD "Gestion des intervenants" : Initialisation des INSERT INTO tintervenant (pknom, prenom, poste) VALUES ('CROZAT', 'Stéphane', ''); INSERT INTO tcours (pkannee, pknum, titre, type, debut, fkintervenant) VALUES ('00', tcoursseq.nextval, 'Introduction','C', '0-JAN00', 'CROZAT'); INSERT INTO tcours (pkannee, pknum, titre, type, debut, fkintervenant) VALUES ('00', tcoursseq.nextval, 'Modélisation','TD', '0-JAN00', 'CROZAT'); SELECT pknum, pkannee, titre FROM tcours; PKNUM PKANNEE TITRE ----- ------- ---------------- 00 Introduction 00 Modélisation. Particularités LMD Opérateur de concaténation L'opérateur de concaténation s'écrit. Il permet de concaténer des colonnes et/ou des chaînes de caractères. La colonne résultante est une chaîne de caractère. SELECT Attribut '+' Attribut AS "A+A" FROM... Valeurs Null Les expressions mathématiques contenant une valeur Null sont systématiquement évaluées à Null. SELECT x+y FROM t renverra des valeurs Null si x ou y ont la valeur Null.

Théorie : Oracle On peut utiliser la fonction NVL pour procéder différemment : par exemple NVL(X,0) renvoie 0 si X vaut Null. MINUS, UNION ALL, LEFT JOIN, AS... L'opération relationnelle de différence s'écrit MINUS (au lieu de EXCEPT en SQL) UNION ALL est une opération d'union qui ne supprime pas les doublons LEFT JOIN peut s'écrire grâce à l'opérateur "(+)" utilisé dans la clause WHERE : SELECT x,y FROM t,t WHERE y(+)=x Le AS servant pour le renommage de colonne est optionnel. Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple : BD "Gestion des intervenants" : Question avec concaténation SELECT trim(prenom) ' ' trim(pknom) ' (' trim(poste) ')' FROM tintervenant; TRIM(PRENOM) '' TRIM(PKNOM) '(' TRIM(POSTE) ')' ----------------------------------------------------------------------------------STEPHANE CROZAT (). Fonctions SQL à connaître Rappel Par opposition aux fonctions de calcul SQL qui s'appliquent sur toute la table pour réaliser des agrégats (en ne renvoyant qu'une seule valeur par regroupement), les fonctions "mono-ligne" sont des fonctions au sens classique, qui s'appliquent à une ou plusieurs valeurs et renvoient une valeur en retour. Les fonctions "mono-ligne" : Manipulent des éléments de données Acceptent des arguments en entrée et retournent des valeurs en sortie Agissent sur chaque ligne Retournent un seul résultat par ligne Peuvent modifier les types de données Exemple Traitement de chaîne Concat, substr, length, insrt, lpad, trim Lower, upper, initcap Traitement de date months_between, add_months, next_day, last_day, SELECT sysdate FROM dual

Théorie : Oracle Opérations mathématiques sur les dates : SELECT sysdate + 0 FROM dual Traitement numérique Round, Trunc Floor, Ceil Mod Conversion Conversion implicite Conversion explicite : TO_DATE, TO_NUMBER, TO_CHAR Générales NVL (par exemple NVL(X,0) renvoie 0 si X vaut Null) CASE WHEN condition THEN valeur WHEN condition THEN valeur ELSE valeur END Imbrication de fonctions : F(F(F(col,arg),arg),arg) Méthode Les fonctions mono-ligne sont utilisées pour : Transformer les données Formater des dates et des nombres pour l'affichage Convertir des types de données de colonnes... Exemple : Extraction de chaîne La fonction substr(x, A, B) renvoie les B caractères à partir du caractère A dans la chaîne X. Complément Fonctions SQL Vous pouvez consulter Oracle : SQL [w_loria.fr/~roegel()], page à, pour avoir une description plus détaillée des fonctions disponibles sous Oracle. Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple : BD "Gestion des intervenants" : Question avec CASE SELECT pknum, CASE WHEN type='c' THEN 'Cours' WHEN type='td' THEN 'Travaux dirigés' END AS type_label, debut FROM tcours PKNUM TYPE_LABEL DEBUT ----- --------------- --------- - http://docs.oracle.com/cd/b_0/doc/b/sqfunc.htm

Théorie : Oracle Cours 0-JAN-0 Travaux dirigés 0-JAN-0. Fonctions de traitement des dates Syntaxe : Gestion des dates avec TO_DATE La gestion des dates peut poser des problèmes selon les formats paramétrés sur le serveur Oracle (en général par défaut le format est DD-MON-YY). La solution la plus rigoureuse consiste à utiliser la fonction de conversion TO_DATE. to_date('000', 'YYYYMMDD') équivaut à 0-NOV-00. Attention : TO_CHAR(date) et "fm" (format mask) Les paramètres de type fm pour format mask (fmday, fmday, fmday, fmmonth...) permettent de supprimer les zéros et espaces. Ils sont à privilégier en général : TO_CHAR(date,'day') retourne 'saturday ' (avec des espaces à la fin) TO_CHAR(date,'fmday') retourne 'saturday' Exemple : BD "Gestion des intervenants" : Question avec date SELECT pknum, TO_CHAR(debut, 'fmday') FROM tcours; PKNUM ---- Exemple TO_CHAR(DEBUT,'FMDAY') ---------------------monday tuesday : BD "Gestion des intervenants" : Insert avec date INSERT INTO tcours (pkannee, pknum, titre, type, debut, fkintervenant) VALUES ('00', tcoursseq.nextval, 'Relationnel','C', TO_DATE('00-00','DD-MM-YYYY'), 'CROZAT'); SELECT debut FROM tcours; DEBUT --------0-JAN-0 0-JAN-0 0-JAN-0 Complément - TO_CHAR(date) ; TO_CHAR(date) TO_CHAR(number) TO_DATE(char) ; TO_DATE(char) http://docs.oracle.com/cd/b0_0/server.0/b00/functions0.htm http://www.techonthenet.com/oracle/functions/to_char.php http://docs.oracle.com/cd/b0_0/server.0/b00/functions.htm http://docs.oracle.com/cd/b0_0/server.0/b00/functions.htm http://www.techonthenet.com/oracle/functions/to_date.php

Théorie : Oracle Formatage. SQL*Plus Définition : SQL*Plus SQL*Plus est un client Oracle basique en mode texte, qui n'est plus vraiment utilisé (on utilise Oracle SQL Developer à la place). SQL*Plus désigne aussi un langage interne à Oracle destiner à gérer la présentation des résultats de requêtes en mode texte (états textuels). Complément : SQL*Plus dans SQL Developer Oracle SQL Developer utilise également SQL*Plus mais ne supporte pas toutes les fonctions. http://www.oracle.com/technetwork/developer-tools/sql-developer/sql-worksheetcommands-0.html Méthode : Usages Le paramétrage de la présentation des résultats de requête est utile au développeur pour avoir des retours lisibles dans son terminal d'exécution. Il peut aussi servir à des parties applicatives comme le formatage pour un export CSV.... Attention SQL*PLus ne travaille ni sur le contenu ni sur la structure, uniquement sur la présentation. a) Variables d'environnement Syntaxe SQL*Plus permet de fixer la valeur de variables d'environnement avec la commande : SET param valeur Ces paramètres peuvent être lus avec la commande : SHOW param Exemple SET heading off Permet de désactiver l'affichage des entêtes de colonne dans le résultat affiché. Complément http://docs.oracle.com/cd/b0_0/server.0/b/ch00.htm - http://docs.oracle.com/cd/b0_0/server.0/b00/sql_elements00.htm 0

Théorie : Oracle b) Fichiers d'entrée et de sortie Syntaxe : Exécuter un fichier Pour exécuter un fichier contenant des commandes SQL ou SQL*Plus : @path/filename Syntaxe : Sortie dans un fichier Pour enregistrer les résultats d'une exécution de requêtes dans un fichier : SPOOL path/filename -- requêtes dont on veut récupérer les résultats dans le fichier SPOOL OFF Complément Création d'un fichier CSV avec SQL*Plus (cf. Création d'un fichier CSV avec SQL*Plus) c) Formattage d'une colonne de requête Syntaxe COLUMN nom_colonne FORMAT format Largeur de la colonne : An Chiffre (avec ou sans zéro à gauche) : / 0 Symboles monétaires : $ / L Séparateurs de virgule et de milliers :. /,... Exemple COLUMN ename FORMAT A COLUMN sal FORMAT $,0.00 COLUMN mgr FORMAT 0. Accès inter-schémas Un schéma Oracle correspond au sein d'une base de données (instance Oracle) à un espace isolé comportant toutes les tables appartenant à d'un utilisateur du SGBD. Ainsi chaque utilisateur possède un schéma. Pour simplifier on pourrait plutôt dire qu'une base Oracle est en fait une collection de BD et qu'un schéma est une BD. Lorsqu'un utilisateur se connecte il se connecte généralement dans son propre schéma. Il lui est néanmoins possible de travailler sur les tables d'autres schémas, à condition d'avoir les droits associés bien entendu.

Théorie : Oracle Instance Oracle sch tab tab tab sch sch Organisation en schémas d'une instance Oracle Syntaxe : Lecture des données d'une table d'un autre schéma Il suffit de préfixer les noms des tables de leur nom de schéma. SELECT * FROM schema.table;. Fenêtrage des données Syntaxe : Rownum SELECT... FROM... WHERE rownum<=n; -- avec N le nombre de lignes désirées. Rownum La restriction ROWNUM <= N dans la clause WHERE permet filtrer les N premières lignes de la table. Remarque rownum est une pseudo colonne qu'il est bien entendu possible de projeter : SELECT rownum FROM... Syntaxe : Utilisation avancée SELECT a,..., an FROM (SELECT a,..., an, rownum AS rnum FROM t) WHERE rnum BETWEEN n AND n Cette syntaxe permet de sélectionner une fenêtre sur les données et pas seulement les N premières lignes. Méthode : Exploration de données massives Lorsque l'on est en présence de gros volumes de données, et que l'on veut se faire une idée du contenu de ces données, il n'est pas souhaitable de faire un simple SELECT *. En il serait trop long de rapatrier les dizaines de milliers de lignes et de plus cela serait inutile puisque seules quelques unes seraient effectivement lues. L'usage de rownum permet de s'intéresser à des fenêtres de données représentatives, pour se faire une idée générale.

Théorie : Oracle B. Le langage procédural PL/SQL Objectifs Connaître les bases du PL/SQL sous Oracle. Savoir créer et exécuter des procédures et fonctions PL/SQL. Savoir utiliser les curseurs.. Présentation du PL/SQL Description Langage de programmation d'oracle. Permet une manipulation procédurale de requêtes SQL. Avantages Intégration Il est possible d'écrire des fonctions complexes de manipulation de données sans recourir à un langage externe. Amélioration des performances Le code PL/SQL est très proche du moteur Oracle. De plus pour le code stocké, les requêtes qu'il manipule sont pré-compilées, et donc son exécution est optimisée.. Structure d'un bloc PL/SQL Syntaxe [Declare] Variables, curseurs, etc. Begin Instructions SQL et PL/SQL [Exception] Gestion d'erreur. End ; / Attention : / Un bloc PL/SQL est terminé par un ; comme une instruction SQL. Par ailleurs, dans les environnements d'exécution Oracle (comme SQL*Plus, SQL Developer...), il est nécessaire de séparer les blocs par un "/" (sur une nouvelle ligne). Une bonne habitude est donc de terminer les bloc PL/SQL par des "/". Complément http://stackoverflow.com/questions/0/two-plsql-statements-with-beginand-end-run-fine-seperately-but-not-together

Théorie : Oracle. Variables Attention En PL/SQL les variables doivent être déclarées avant le (après DECLARE pour les blocs anonymes et IS pour les fonctions et procédures). Types de variables Scalaires VARCHAR, DATE, CHAR, LONG, BOOLEAN, INTEGER RECORD Déclaration d'un type RECORD : TYPE nom_type IS RECORD (déclaration de propriétés); Déclaration d'une variable enregistrement de ce type : nom_variable nom_type; Curseurs Permettent de manipuler des résultats de requête. Syntaxe : Déclaration des variables identifiant [CONSTANT] type [NOT NULL] [:= valeur]; Exemple : Déclaration des variables DECLARE v_deptno NUMBER() NOT NULL := 0; v_hiredate DATE; v_location VARCHAR() := 'Atlanta'; c_comm CONSTANT NUMBER := 00;... Syntaxe : Affectation des variables variable := valeur variable Exemple : Affectation des variables x:=0; x:=y; Conseil : Référence à un type de colonne existant On peut faire référence au type d'une colonne d'une table par la syntaxe suivante en remplacement du type de données : nom_table.nom_colonne%type. Exemple : Référence à un type de colonne existant vpersonne temploye.anom%type

Théorie : Oracle. Affichage à l'écran Syntaxe SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE ('Hello World'); END;. Structures de contrôle Syntaxe : Structure conditionnelle IF THEN instructions ELSIF THEN instructions ELSE instructions END IF; Syntaxe : Boucle FOR FOR compteur IN [REVERSE] inf...sup LOOP instructions END LOOP; Syntaxe : Boucle WHILE WHILE condition LOOP instructions END LOOP; Syntaxe : Boucle REPEAT LOOP instructions EXIT [WHEN condition]; END;. Blocs PL/SQL : Procédure, fonction, bloc anonyme Syntaxe : Procédure CREATE OR REPLACE PROCEDURE nom_proc IS...... [EXCEPTION]... END ;

Théorie : Oracle Exemple : Procédure CREATE OR REPLACE PROCEDURE phello (who VARCHAR) IS DBMS_OUTPUT.PUT_LINE('Hello ' who); END; / Syntaxe : Fonction 0 FUNCTION nom_func RETURN type_retourné IS...... RETURN valeur; [EXCEPTION]... END ; Exemple : Fonction CREATE OR REPLACE FUNCTION fdatedujour RETURN date IS vdate date; SELECT SYSDATE INTO vdate FROM DUAL; RETURN vdate; END; / Attention Le type de retourné par une fonction ne doit pas spécifier de taille : RETURN varchar et non RETURN varchar(0) http://docs.oracle.com/cd/b_0/server.0/b0/statements_00.htm Syntaxe : Anonyme [DECLARE]...... [EXCEPTION]... END ; Exemple : Script anonyme SET SERVEROUTPUT ON; phello('world'); DBMS_OUTPUT.PUT_LINE(fDateDuJour);

Théorie : Oracle END; /. Affectation par une requête SELECT INTO Syntaxe SELECT propriété, propriété,... INTO variable_name, variable_name,... FROM relations WHERE condition; A condition que la requête ne renvoie qu'un tuple et qu'elle projette autant de propriétés de ce tuple que de variables référencées dans la clause INTO. Exemple 0 DECLARE v_deptno dept.deptno%type; v_loc dept.loc%type; SELECT deptno, loc INTO v_deptno, v_loc FROM dept WHERE dname = 'SALES';... END; Remarque : Syntaxe %TYPE Cette syntaxe est largement recommandée pour l'affectation depuis une requête. Remarque : Affectation d'une variable RECORD Il est possible avec la clause INTO d'affecter des résultats de requête à plusieurs colonnes dans une variable RECORD. Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple : BD "Gestion des intervenants" : Fonction et affectation par une requête 0 CREATE OR REPLACE FUNCTION fintervient (pintervenant varchar) RETURN varchar IS vnbinterventions number; SELECT Count(fkintervenant) INTO vnbinterventions FROM tcours WHERE fkintervenant=pintervenant; IF vnbinterventions > 0 THEN RETURN 'OUI'; ELSE

Théorie : Oracle 0 RETURN 'NON'; END IF; END; / INSERT INTO tintervenant(pknom, prenom) VALUES ('JOUGLET', 'Antoine'); SELECT pknom, fintervient(pknom) AS I FROM tintervenant; PKNOM -------------------CROZAT JOUGLET I -----OUI NON. Exercice [Solution n p ] Soit la séquence d'instructions suivante sous Oracle : 0 0 CREATE TABLE t_personnes ( a_nom varchar(0), a_prenom varchar(0) ); INSERT INTO t_personnes VALUES ('dupond', 'paul'); INSERT INTO t_personnes VALUES ('dupond', 'pierre'); CREATE FUNCTION fcherche (p_nom varchar) RETURN varchar IS TYPE r_personne IS RECORD (nom varchar(0), prenom varchar(0)); v_personne r_personne; SELECT a_nom, a_prenom INTO v_personne FROM t_personnes WHERE a_nom=p_nom; RETURN v_personne.nom; EXCEPTION WHEN OTHERS THEN RETURN ('erreur'); END; Que renvoie la fonction "fcherche" si on lui passe en paramètre la chaîne 'dupond'?. Curseurs PL/SQL Définition : Curseur Un curseur est un pointeur sur un résultat de requête.

Théorie : Oracle Syntaxe : Syntaxe OPEN/FETCH 0 DECLARE CURSOR c_moncurseur IS SELECT prop, prop,... FROM relations; vprop relation.prop%type; vprop... OPEN c_moncurseur; LOOP FETCH c_moncurseur INTO vprop, vprop,...; EXIT WHEN c_moncurseur%notfound; instructions END LOOP; END; Remarque : Syntaxe FOR/IN DECLARE CURSOR c_moncurseur IS SELECT prop, prop,... FROM relations; FOR c_montuple IN c_moncurseur LOOP instructions END LOOP; END; Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple : BD "Gestion des intervenants" : Traitement de données et curseur 0 0 CREATE OR REPLACE PROCEDURE pafficheintervenants IS CURSOR cintervenants IS SELECT pknom, prenom FROM tintervenant; vnom tintervenant.pknom%type; vprenom tintervenant.prenom%type; DBMS_OUTPUT.PUT_LINE('** Liste des intervenants **'); OPEN cintervenants; LOOP FETCH cintervenants INTO vnom, vprenom; EXIT WHEN cintervenants%notfound; DBMS_OUTPUT.PUT_LINE('-' INITCAP(TRIM(vPrenom)) ' ' INITCAP(TRIM(vNom))); END LOOP; END; / CREATE OR REPLACE PROCEDURE pafficheintervenants IS CURSOR cintervenants IS SELECT pknom, prenom FROM tintervenant; DBMS_OUTPUT.PUT_LINE('** Liste des intervenants **'); FOR i IN cintervenants LOOP

Théorie : Oracle 0 DBMS_OUTPUT.PUT_LINE('-' INITCAP(TRIM(i.prenom)) ' ' INITCAP(TRIM(i.pknom))); END LOOP; END; / SET SERVEROUTPUT ON; pafficheintervenants; DBMS_OUTPUT.PUT_LINE(''); pafficheintervenants; END; / ** Liste des intervenants ** -Stéphane Crozat -Antoine Jouglet ** Liste des intervenants ** -Stéphane Crozat -Antoine Jouglet 0. Exercice [Solution n p ] Quelles instructions SQL renvoient la même valeur que la fonction PL/SQL sous Oracle suivante : 0 CREATE FUNCTION ftruc RETURN number IS CURSOR c IS SELECT a FROM t; x number; y number; y:=0; OPEN c; LOOP FETCH c INTO x; EXIT WHEN c%notfound; y:=y+x; END LOOP; RETURN y; END; SELECT a FROM t; SELECT count(a) FROM t; SELECT avg(a) FROM t;. Gestion d'exception Qu'est-ce qu'une exception? Un identifiant PL/SQL, de type erreur, déclenché pendant l'exécution du bloc. Comment est-elle déclenchée? 0 Implicitement, par une erreur Oracle (NO_DATAFOUND, INVALID_CURSOR,

Théorie : Oracle TOO_MANY_ROWS, etc.) Explicitement, par le programme (défini par l'utilisateur) : commande "RAISE nom_exception" Par le développeur : Raise_application_error( -00, 'message') Comment la traiter? En interceptant les exceptions En la propageant à l'environnement appelant Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple 0 0 : BD "Gestion des intervenants" : Gestion d'exception CREATE OR REPLACE PROCEDURE pinsertintervenant (pnom varchar, pprenom varchar) IS INSERT INTO tintervenant (pknom, prenom) VALUES (pnom, pprenom); EXCEPTION WHEN DUP_VAL_ON_INDEX then DBMS_OUTPUT.PUT_LINE('Intervenant déjà existant : ' pnom); WHEN OTHERS THEN RAISE; END; / SET SERVEROUTPUT ON DBMS_OUTPUT.PUT_LINE('*** Programme indépendant ***'); pinsertintervenant('jouglet', 'Antoine'); pinsertintervenant('vincent', 'Antoine'); pafficheintervenants; END; / *** Programme indépendant *** Intervenant déjà existant : JOUGLET ** Liste des intervenants ** -Stéphane Crozat -Antoine Jouglet -Antoine Vincent. Durée de tournage d'un film [0 min] Soit le modèle UML de la relation Film ci-après.

Théorie : Oracle Film (méthode) Soit la table Film implémentée sous Oracle et correspondant au modèle relationnel : Film(#isan:char(),titre:varchar,debut:date,fin:date) Question [Solution n p ] Écrire une fonction duree permettant de retourner un nombre entier de jours entre deux dates passées en argument. Indice : On pourra utiliser la conversion des dates en Julian day, c'est à dire le nombre de jours depuis le 0/0/-. to_char(d,'j') retourne le Julian day de la date d sous la forme d'une chaîne de caractères. Exemple : to_char( to_date('00000','yyyymmdd')) = '' to_number(to_char(d,'j'),'') retourne le Julian day de la date d sous la forme d'un entier de chiffres. Exemple : to_number(to_char( = to_date('00000','yyyymmdd'),'') Question [Solution n p ] Créer en SQL une vue vfilm affichant tous les attributs de Film, avec une colonne supplémentaire affichant la durée. C. Les triggers Objectifs Comprendre le fonctionnement événementiel des triggers. Savoir créer un trigger sous Oracle.. Principes des triggers Définition : Trigger Un trigger (ou déclencheur) est un bloc PL/SQL associé à une table permettant de

Théorie : Oracle déclencher une action avant ou après un INSERT, UPDATE ou DELETE sur cette table. Les triggers sont stockés dans la base. A quoi servent les triggers? Ils permettent de renforcer l'intégrité des données (mais on préférera des contraintes "check", "unique" ou "foreign key" quand c'est possible). Ils permettent d'auditer des actions sur une table. Ils permettent de calculer des valeurs dérivées pour d'autres colonnes de la table. Ils constituent ainsi une des solutions pour l'implémentation des attributs dérivés. Types de triggers Il existe deux types de triggers : Trigger sur ligne le trigger est exécuté pour chaque ligne concernée par l'instruction insert, update ou delete (option "for each row"). Trigger sur instruction le trigger est exécuté une seule fois pour l'instruction insert, update ou delete, même si elle traite plusieurs lignes d'un coup. Syntaxe : Trigger CREATE [OR REPLACE] TRIGGER nom_trigger {BEFORE AFTER} [INSERT OR][UPDATE [OF nom_colonne] OR][DELETE] ON nom_table [FOR EACH ROW [WHEN (condition)] ] DECLARE [variable declarations] instructions END; Remarque : Avant ou après? En général les triggers sont de type "before", en particulier pour les triggers sur ligne, c'est à dire qu'ils s'exécutent avant que l'action considérée soit exécutée, ce qui permet d'infléchir le résultat de cette action. Alors qu'un trigger "after" ne pourra plus modifier le tuple considéré et agira seulement sur d'autres tuples. Attention : Triggers multiples Une même table peut avoir plusieurs triggers, mais cela est à éviter en général, pour des raisons de facilité de maintenance et de performance. Attention : Exception Si l'exécution du trigger échoue, l'action (insert, update ou delete dans la table) est annulée (et retourne une exception Oracle).

Théorie : Oracle. Manipulation des anciennes et nouvelles valeurs dans les triggers Pour les triggers de type "for each row", les colonnes de la ligne courante doivent être référencées spécifiquement selon que l'on veut l' ancienne ou la nouvelle valeur : :old.nom_colonne :new.nom_colonne Fondamental Il ne faut pas lire des données d'une table en cours de modification autrement que par les accès ":old" et ":new". Attention : Anciennes valeurs en lecture seule Il n'est jamais possible de modifier une colonne ":old". Attention : Valeurs en lecture seule après Pour les trigger "after", il n'est plus possible de modifier les colonnes ":new". Remarque : Valeurs nulles Pour les triggers "on insert" les colonnes ":old" ont la valeur NULL. Pour les triggers "on delete" les colonnes ":new" ont la valeur NULL. Attention Il ne faut pas modifier de données dans les colonnes des "primary key", "foreign key", ou "unique key" d'une table. Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple : BD "Gestion des intervenants" : Trigger de calcul de valeur dérivée 0 CREATE OR REPLACE TRIGGER trcours BEFORE INSERT OR UPDATE OF debut ON tcours FOR EACH ROW :new.fin := :new.debut+; END; / UPDATE tcours SET debut=to_date('-0-00','dd-mm-yyyy') WHERE pknum=; INSERT INTO tcours (pkannee, pknum, titre, type, fkintervenant, debut) VALUES ('00', tcoursseq.nextval, 'SQL', 'C', 'CROZAT', TO_DATE('0-00','DD-MM-YYYY'));

Théorie : Oracle SELECT pknum, debut, fin FROM tcours; PKNUM ---- DEBUT --------0-JAN-0 0-JAN-0 -JAN-0 -JAN-0 FIN --------- 0-JAN-0 -JAN-0. Prédicats d'événement au sein des triggers INSERTING DELETING UPDATING UPDATING(nom_colonne) Prédicats pour savoir dans quel contexte d'appel du trigger on est, ce qui permet dans un même trigger de s'adapter aux différents cas de déclenchement. Rappel : BD "Gestion des intervenants" : Schéma relationnel tintervenant (#pknom, prenom, poste) tcours (#pkannee, #pknum, titre, type, fkintervenant=>tintervenant, debut, \fin) Exemple données 0 0 : BD "Gestion des intervenants" : Trigger d'archivage de CREATE TABLE tintervenantsav ( pknom varchar(0) PRIMARY KEY, prenom varchar(0) NOT NULL ); CREATE OR REPLACE TRIGGER trintervenant BEFORE DELETE OR INSERT ON tintervenant FOR EACH ROW IF DELETING THEN INSERT INTO tintervenantsav VALUES (:old.pknom, :old.prenom); ELSIF INSERTING THEN DELETE FROM tintervenantsav WHERE pknom = :new.pknom; END IF; END; / DELETE FROM tcours; DELETE FROM tintervenant; SELECT * FROM tintervenantsav; PKNOM -------------------CROZAT JOUGLET VINCENT INSERT INTO tintervenant (pknom, prenom, poste) VALUES ('CROZAT', 'Stéphane', ''); PRENOM -------------------Stéphane Antoine Antoine SELECT * FROM tintervenantsav;

Théorie : Oracle PKNOM -------------------JOUGLET VINCENT PRENOM -------------------Antoine Antoine. Exercice [Solution n p ] Quelle valeur renvoie la dernière instruction de la liste ci-dessous, sous le SGBDR Oracle : 0 CREATE TABLE t (a integer, b integer); CREATE TRIGGER trig_t BEFORE UPDATE ON t FOR EACH ROW :new.b := :old.a; END; INSERT INTO t (a, b) VALUES (, ); UPDATE t SET a=a+, b=b+; UPDATE t SET a=a+, b=b+; SELECT sum(b) FROM t; D. Prise en main de Oracle SQL Developer. Installation de SQL Developer Site Web http://www.oracle.com/technology/products/database/sql_developer (Téléchargement pour Windows, Mac et Linux) Complément Documentation en ligne disponible à la même adresse.. Connexion avec SQL Developer Créer une connexion à la base de données Oracle de l'utc. Clic droit sur Connexions, puis Nouvelle connexion. Entrez vos paramètres : Nom libre Username / Password Hôte : sme-oracle.sme.utc SID : nf

Théorie : Oracle Image Fenêtre de connexion SQL Developer. Naviguer dans le catalogue de SQL Developer L'espace de gauche permet de naviguer dans le catalogue de la base de données et donc de visualiser les tables, vues, index, etc. Image Fenêtre principale SQL Developer

Théorie : Oracle Attention Pour rafraîchir la vue de gauche (catalogue) après une requête LDD, il faut faire un clic droit sur l'élément du catalogue (par exemple Tables après une création de table) puis sélectionner Régénérer.. Exécuter des requêtes SQL avec SQL Developer L'espace de droite permet d'écrire des requêtes SQL (en haut) et de visualiser le résultat de l'exécution (en bas). Appuyer sur le bouton Exécuter un script ou faire F pour exécuter les requêtes saisies. Image SQL (script) Remarque Pour effacer les résultats d'exécution précédents, cliquer sur Effacer. Exécuter une seule requête au sein d'un script Pour n'exécuter qu'une seule requête parmi celle saisies dans la zone du haut, la sélectionner, puis cliquer sur Exécuter un script ou faire F.

Théorie : Oracle Image SQL (instruction par instruction) Exécuter une seule requête SELECT Pour les requêtes SELECT, SQL Developer propose un affichage sous forme de tableau, plus lisible que l'affichage texte. Pour exécuter une requête SELECT et obtenir un tel affichage, cliquer sur Exécuter l'instruction ou faire F.

Théorie : Oracle Image SQL (une seule instruction SELECT) Attention Le bouton Exécuter l'instruction n'affiche pas les erreurs d'exécution ou les confirmations de création ou insertion (requêtes CREATE, INSERT, UPDATE), il est donc à réserver aux requêtes SELECT valides (si le résultat n'est pas correct, utiliser Exécuter un script). Conseil Dans le doute utilisez toujours F et jamais F.. Écrire du PL/SQL avec SQL Developer Pour créer des blocs PL/SQL, procéder comme pour le SQL, avec le bouton Exécuter un script. 0

Théorie : Oracle Image PL/SQL (Fonction compilée avec succès) Attention : Traiter les erreurs de compilation Pour voir les erreurs de compilation, il faut faire un clic droit sur le nom de la fonction ou de la procédure (zone de gauche), puis choisir Compiler pour le débogage. L'instruction show errors ne fonctionne pas.

Théorie : Oracle Image PL/SQL (Fonction en erreur). Exécution de fichiers SQL Méthode Pour enregistrer un script SQL ou PL/SQL écrit dans Oracle SQL Developer sous la forme d'un fichier utiliser la fonction file > save as. Méthode Pour exécuter un fichier SQL ou PL/SQL utiliser la commande @fichier.sql Exemple : script.sql @file.sql @file.sql @file.sql

Pratique : SQL sous Oracle II - II Migration d'une base Access vers Oracle Séquence Extension Médiathèque Transactions Questions avancées en SQL Maintenance de la base Vue Objectifs Apprendre à se servir d'oracle Approfondir SQL Dans cette première partie, vous allez aborder les aspects classiques des BD et du SQL, sur le cas particulier d'oracle. Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des réalisations. Attention : Oracle est un système transactionnel, il faut terminer chaque séquence de requêtes par une instruction SQL "commit;". A. Migration d'une base Access vers Oracle Après un an de bons et loyaux services au sein de l'association "Objectifs", vous en laissez la présidence à Marc. En effet, suite à votre excellent travail de structuration des activités de l'association dans une base Access, l'association des anciens élèves vous invite à venir lui faire profiter de vos compétences, ce que vous avez accepté avec plaisir. Après une nouvelle année, Marc vous demande de bien vouloir revenir dans l'association "Objectifs" pour l'aider dans un projet ambitieux. La base de données que vous aviez créée sous Access doit être migrée sous Oracle, sur préconisation du service informatique. Question Prenez connaissance de la documentation (diagramme UML et code SQL de création et d'initialisation de la base de données), afin de préparer la migration de l'existant.

Pratique : SQL sous Oracle Vérifiez que les données dont vous disposez sont cohérentes. Vérifier que le code SQL LDD et LMD a été correctement adapté pour une implémentation sous Oracle. Image Modèle UML de la base de données de gestion de projets 0 0 create table SPECIALITE ( intitule varchar(0), constraint PK_SPECIALITE primary key (intitule) ); create table MEMBRE ( prenom varchar(0), nom varchar(0), specialite varchar(0), constraint PK_MEMBRE primary key (prenom), constraint FK_MEMBRE_SPECIALITE foreign key (specialite) references SPECIALITE(intitule) ); create table PROJET ( num number, nom varchar(0), debut date, fin date, chefprojet varchar(0), specialite varchar(0), constraint PK_PROJET primary key (num), constraint FK_PROJET_MEMBRE foreign key (chefprojet) references MEMBRE(prenom), constraint FK_PROJET_SPECIALITE foreign key (specialite) references SPECIALITE(intitule)

Pratique : SQL sous Oracle 0 0 0 0 ); create table TACHE ( num number, projet number, nom varchar(0), debut date, fin date, constraint FK_TACHE_PROJET foreign key (projet) references PROJET(num), constraint PK_TACHE primary key (num, projet) ); create table PARTENAIRE ( nom varchar(0), description varchar(), constraint PK_PARTENAIRE primary key (nom) ); create table PARTICIPE ( prenom varchar(0), tache number, projet number, fonction varchar(0), constraint FK_PARTICIPE_MEMBRE foreign key (prenom) references MEMBRE(prenom), constraint FK_PARTICIPE_TACHE foreign key (tache, projet) references TACHE(num, projet), constraint PK_PARTICIPE primary key (prenom, tache, projet) ); create table ESTASSOCIE ( nom varchar(0), projet number, role varchar(), constraint FK_ESTASSOCIE_PARTENAIRE foreign key (nom) references PARTENAIRE(nom), constraint FK_ESTASSOCIE_PROJET foreign key (projet) references PROJET(num), constraint PK_ASTASSOCIE primary key (nom, projet) ); INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO Specialite Specialite Specialite Specialite Specialite Specialite INSERT INSERT INSERT INSERT INTO INTO INTO INTO Membre Membre Membre Membre VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('Ville'); ('Université'); ('Sport'); ('Entreprise'); ('Culture'); ('International'); ('Nathalie', 'Dupont', 'Culture'); ('Pierre', 'Perret', 'Sport'); ('Alain', 'Durand', 'Culture'); ('Julien', 'Dujnou', 'Université'); INSERT INTO Projet VALUES (, 'Comédie Musicale', to_date('0000','yyyymmdd'), to_date('000','yyyymmdd'), 'Nathalie', 'Culture'); INSERT INTO Projet VALUES (, 'Science en fête', to_date('0000','yyyymmdd'), to_date('0000','yyyymmdd'), 'Pierre', 'Ville'); INSERT INTO Projet VALUES (, 'Nuit du Picolo', to_date('000','yyyymmdd'), to_date('000','yyyymmdd'), 'Julien', 'Université'); INSERT INTO Tache VALUES (,, to_date('0000','yyyymmdd'), INSERT INTO Tache VALUES (,, to_date('0000','yyyymmdd'), INSERT INTO Tache VALUES (,, to_date('0000','yyyymmdd'), 'Dossier financement', to_date('0000','yyyymmdd')); 'Casting', to_date('0000','yyyymmdd')); 'Script', to_date('0000','yyyymmdd'));

Pratique : SQL sous Oracle 0 0 0 INSERT INTO Tache VALUES (,, to_date('0000','yyyymmdd'), INSERT INTO Tache VALUES (,, to_date('0000','yyyymmdd'), INSERT INTO Tache VALUES (,, to_date('000','yyyymmdd'), INSERT INTO Tache VALUES (,, to_date('00','yyyymmdd'), INSERT INTO Tache VALUES (,, to_date('000','yyyymmdd'), 'Répétition', to_date('000','yyyymmdd')); 'Réservation salle', to_date('000','yyyymmdd')); 'Publicité', to_date('00','yyyymmdd')); 'Vente billets', to_date('000','yyyymmdd')); 'Programme', to_date('000','yyyymmdd')); INSERT INTO Participe VALUES ('Alain',,, 'Prospection'); INSERT INTO Participe VALUES ('Nathalie',,, 'Rédaction'); INSERT INTO Partenaire (Nom) INSERT INTO Partenaire (Nom) INSERT INTO Partenaire (Nom) INSERT INTO Partenaire (Nom, de fabrication de bière'); INSERT INTO EstAssocie INSERT INTO EstAssocie INSERT INTO EstAssocie INSERT INTO EstAssocie 'Publicitaire'); INSERT INTO EstAssocie bières'); VALUES ('Mairie'); VALUES ('Ministère'); VALUES ('Association des commerçants'); Description) VALUES ('', 'Entreprise VALUES VALUES VALUES VALUES ('Mairie',, ('Mairie',, ('Ministère', ('Association 'Financeur'); 'Financeur');, 'Logistique'); des commerçants',, VALUES ('',, 'Réduction sur les COMMIT; Indice : On notera que pour protéger l'insertion des dates sous Oracle, la solution la plus rigoureuse consiste à utiliser la fonction de conversion TO_DATE. Par exemple : INSERT INTO Projet VALUES (, 'Comédie Musicale', to_date('0000', 'YYYYMMDD'), to_date('000', 'YYYYMMDD'), 'Nathalie', 'Culture'); Question Procédez à la création et à l'initialisation de la base Oracle. B. Séquence Marc a une formation solide en marketing. Dans son discours pour sa seconde investiture à la présidence de l'association, il promet de donner un nouveau souffle à l'association suite à des malentendus avec les supports financiers. Après concertation des membres de l'association, Marc décide alors de donner une dimension commerciale aux activités de l'association dans le but d'autosubventionner ses projets. Dans cette perspective, Marc lance un nouveau projet intitulé "Médiathèque", spécialisé dans la vente de produits multimédia (CD-ROM, DVD, Vidéo, etc.) à distance (via Internet). Ce projet est composé de trois tâches : "Marketing", "Prospection" et "Service après-vente", et s'inscrit dans la spécialité "Commerce". Question [Solution n p ] Afin de profiter au mieux des fonctions proposées par Oracle, associez une séquence à la table Projet pour gérer l'itération automatique des numéros de projet. Indice :

Pratique : SQL sous Oracle La clause START WITH de l'instruction CREATE SEQUENCE permet de définir la première valeur de la séquence. Question [Solution n p ] Écrire et exécuter les requêtes LMD nécessaires à la gestion du nouveau projet "Médiathèque virtuelle", en utilisant la séquence. C. Extension Médiathèque Submergé par la demande de la clientèle, Marc fait appel à vous pour étendre le schéma de la base de données de l'association afin d'automatiser les tâches de marketing (analyse des ventes, analyse des profils des clients) et commerciales (facturation). Cette extension doit inclure les nouvelles entités : client, produit, et facture. Les règles suivantes doivent être respectées dans la conception du schéma : Une facture comporte un ou plusieurs produits. Un produit peut paraître dans plusieurs factures. Une facture est associée à un seul client. Un client peut établir plusieurs factures. Question [Solution n p ] Faites le schéma conceptuel de l'extension. Question [Solution n p ] Dériver le modèle relationnel. Vous demandez à un collègue de réaliser pour vous les instructions de création et d'initialisation des tables, sur la base des données dont vous disposez. Question [Solution n p ] Vérifier que les scripts de création et d'initialisation sont corrects, corrigez les sinon, puis exécutez les. D. Transactions Lors de la saisie d'une facture, le client peut changer d'avis : il n'a plus envie d'acheter un article, il se rend compte qu'il n'a pas assez d'argent avec lui, etc. Pour gérer ces cas (et d'autres plus critiques, comme les cas de panne), on utilise un mécanisme qui permet de valider ou d'annuler une transaction, c'est à dire une série d'instructions SQL. Question Le client souhaite acheter exemplaire du produit, mais il change d'avis au moment de valider. Exécutez le script SQL suivant et expliquez ce qui se passe. select * from facture;