Vous êtes sur la page 1sur 90

CNAM Paris - NFA011

23/12/2010

Dveloppement dapplications avec les bases de donnes


Michel Crucianu
http://cedric.cnam.fr/~crucianm/abd.html

23 dcembre 2010

NFA011

Contenu du cours

PL/SQL

Variables, structures de contrle Curseurs, interaction avec la base Sous-programmes, paquetages Exceptions Transactions Dclencheurs (triggers) Gnralits Connexion une base Interaction avec la base, curseurs Procdures stockes, procdures externes

JDBC

Relationnel objet
NFA011 2

23 dcembre 2010

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Bibliographie
Bales, D.K. Java programming with Oracle JDBC. OReilly, 2002. Bizoi, R. PL/SQL pour Oracle 10g, Eyrolles. 2006. Date, C. Introduction aux bases de donnes. Vuibert, 2004 (8me dition). Gardarin, G. Bases de donnes, Eyrolles. 2003. Reese, G. JDBC et Java : guide du programmeur. OReilly, 2001. Soutou, C. SQL pour Oracle. Eyrolles, 2008 (3me dition). Suite : NSY135 Applications orientes donnes - patrons, frameworks, ORM

23 dcembre 2010

NFA011

PL/SQL

Procedural Language / Structured Query Language (PL/SQL ) : langage propritaire Oracle Syntaxe de PL/SQL inspire du langage Ada Dautres diteurs de SGBDR utilisent des langages procduraux similaires PL/SQL nest pas trs loign du langage normalis Persistent Stored Modules (PSM) Documentation Oracle (en anglais) :

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/toc.htm
23 dcembre 2010 NFA011 4

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Quel est lintrt de PL/SQL ?

La nature relationnelle, dclarative de SQL rend lexpression des requtes trs naturelle

mais les applications complexes exigent plus :


Pour la facilit et lefficacit de dveloppement : grer le contexte et lier entre elles plusieurs requtes, crer des librairies de procdures catalogues rutilisables Pour lefficacit de lapplication : diminuer le volume des changes entre client et serveur (un programme PL/SQL est excut sur le serveur)

Ncessit dtendre les fonctionnalits de SQL : PL/SQL est une extension procdurale
23 dcembre 2010 NFA011 5

Structure dun programme

Programme PL/SQL = bloc (procdure anonyme, procdure nomme, fonction nomme) :


DECLARE -- section de dclarations -- section optionnelle BEGIN -- traitement, avec dventuelles directives SQL -- section obligatoire EXCEPTION -- gestion des erreurs retournes par le SGBDR -- section optionnelle END; / lance lexcution sous SQL*Plus

23 dcembre 2010

NFA011

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Structure dun programme (2)

Blocs imbriqus :
DECLARE BEGIN EXCEPTION END;

DECLARE BEGIN EXCEPTION END; DECLARE BEGIN EXCEPTION END;

DECLARE BEGIN EXCEPTION END;

Porte dun identificateur : un descendant peut accder aux identificateurs dclars par un parent, pas linverse
NFA011 7

23 dcembre 2010

Identificateurs, commentaires

Identificateur (variable, curseur, exception, etc.) :


Commence par une lettre Peut contenir : lettres, chiffres, $, #, _ Interdits : &, -, /, espace Jusqu 30 caractres Insensible la casse ! (nompilote = NomPILOTE)

Commentaires :
-- Commentaire sur une seule ligne /* Commentaire sur plusieurs lignes */

23 dcembre 2010

NFA011

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Variables

Types de variables PL/SQL :


Scalaires : par exemple NUMBER(5,2), VARCHAR2, DATE, BOOLEAN, Composites : %ROWTYPE, RECORD, TABLE Rfrence : REF LOB (Large Object jusqu 4 Go ; pointeur si externe)

Un programme PL/SQL peut galement manipuler des variables non PL/SQL :


Variables de substitution ou globales dfinies dans SQL*Plus Variables htes (dfinies dans dautres programmes et utilises par le programme PL/SQL)

Toute variable PL/SQL doit obligatoirement tre dclare dans une section DECLARE avant utilisation
NFA011 9

23 dcembre 2010

Variables scalaires

Syntaxe de dclaration :
Identificateur [CONSTANT] type [[NOT NULL] {:= | DEFAULT} expression]; CONSTANT : cest une constante (sa valeur ne peut pas changer, doit tre initialise lors de la dclaration) NOT NULL : on ne peut pas lui affecter une valeur nulle (en cas de tentative, une exception VALUE_ERROR est leve) Initialisation : affectation := ou DEFAULT

Pas de dclaration multiple dans PL/SQL ! number1, number2 NUMBER; dclaration incorrecte ! Autre possibilit pour affecter une valeur une variable
SELECT INTO identificateur FROM ;
NFA011 10

23 dcembre 2010

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Nouveaux types PL/SQL

Nouveaux types prdfinis :


BINARY_INTEGER : entiers signs entre 231 et 231 PLS_INTEGER : entiers signs entre 231 et 231 ; plus performant que NUMBER et BINARY_INTEGER au niveau des oprations arithmtiques ; en cas de dpassement, exception leve

Sous-types PL/SQL : restriction dun type de base


Prdfinis : CHARACTER, INTEGER, NATURAL, POSITIVE, FLOAT, SMALLINT, SIGNTYPE, etc. Utilisateur (restriction : prcision ou taille maximale) : SUBTYPE nomSousType IS typeBase [(contrainte)] [NOT NULL]; Exemple de sous-type utilisateur : SUBTYPE numInsee IS NUMBER(13) NOT NULL;

23 dcembre 2010

NFA011

11

Base pour les exemples


avion :
Numav 14 345 Capacite 25 75 Type A400 B200 Entrepot Garches Lille

pilote :
Matricule 1 2 Nom Durand Dupont Ville Cannes Touquet Age 45 24 Salaire 28004 11758

vol :
Numvol AL12 AF8
23 dcembre 2010

Heure_depart 08-18 11-20

Heure_arrivee 09-12 23-54


NFA011

Ville_depart Paris Paris

Ville_arrivee Lille Rio


12

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Variables scalaires : exemple


DECLARE villeDepart CHAR(10) := Paris; villeArrivee CHAR(10); numVolAller CONSTANT CHAR := AF8; numVolRetour CHAR(10); BEGIN SELECT Ville_arrivee INTO villeArrivee FROM vol WHERE Numvol = numVolAller; -- vol aller numVolRetour := AF9; INSERT INTO vol VALUES (numVolRetour, NULL, NULL, villeArrivee, villeDepart); -- vol retour END;
23 dcembre 2010 NFA011 13

Conversions

Conversions implicites :

Lors du calcul dune expression ou dune affectation Si la conversion nest pas autorise (voir page suivante), une exception est leve

Conversions explicites :
De CHAR NUMBER DATE RAW ROWID TO_CHAR TO_CHAR RAWTOHEX ROWIDTOHEX A CHAR NUMBER TO_NUMBER DATE TO_DATE TO_DATE RAW HEXTORAW ROWID CHARTOROWID

23 dcembre 2010

NFA011

14

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Quelques conversions implicites


De A CHAR VARCHAR2 BINARY_ INTEGER OUI NUMBER LONG DATE RAW ROWID CHAR OUI OUI OUI OUI OUI OUI

VARCHAR2 BINARY_ INTEGER NUMBER

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

OUI

LONG

OUI

OUI

OUI

DATE

OUI

OUI

OUI

RAW

OUI

OUI

OUI

ROWID 23 dcembre 2010

OUI

OUI NFA011 15

Dclaration %TYPE

Dclarer une variable de mme type que

Une colonne (attribut) dune table existante : nomNouvelleVariable NomTable.NomColonne%TYPE [{:= | DEFAULT} expression]; Une autre variable, dclare prcdemment : nomNouvelleVariable nomAutreVariable%TYPE [{:= | DEFAULT} expression];

Cette propagation du type permet de rduire le nombre de changements apporter au code PL/SQL en cas de modification des types de certaines colonnes
NFA011 16

23 dcembre 2010

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Dclaration %TYPE : exemple


DECLARE nomPilote pilote.Nom%TYPE; /* table pilote, colonne nom */

nomCoPilote nomPilote%TYPE; BEGIN SELECT Nom INTO nomPilote FROM pilote WHERE matricule = 1; SELECT Nom INTO nomCoPilote FROM pilote WHERE matricule = 2; END;
23 dcembre 2010 NFA011 17

Variables %ROWTYPE

Dclarer une variable composite du mme type que les tuples dune table :
nomNouvelleVariable NomTable%ROWTYPE;

Les composantes de la variables composite, identifies par nomNouvelleVariable.nomColonne, sont du mme type que les colonnes correspondantes de la table Les contraintes NOT NULL dclares au niveau des colonnes de la table ne sont pas transmises aux composantes correspondantes de la variable ! Attention, on peut affecter un seul tuple une variable dfinie avec %ROWTYPE !
NFA011 18

23 dcembre 2010

M. Crucianu

CNAM Paris - NFA011

23/12/2010

Variables %ROWTYPE : exemple


DECLARE piloteRecord pilote%ROWTYPE; agePilote NUMBER(2) NOT NULL := 35; BEGIN piloteRecord.Age := agePilote; piloteRecord.Nom := Pierre; piloteRecord.Ville := Bordeaux; piloteRecord.Salaire := 45000; INSERT INTO pilote VALUES piloteRecord; END;

23 dcembre 2010

NFA011

19

Variables RECORD

Dclarer une variable composite personnalise (similaire struct en C) :


TYPE nomTypeRecord IS RECORD (nomChamp typeDonnee [[NOT NULL] {:= | DEFAULT} expression] [, nomChamp typeDonnee ]); nomVariableRecord nomTypeRecord;

Les composantes de la variables composite peuvent tre des variables PL/SQL de tout type et sont identifies par nomVariableRecord.nomChamp
NFA011 20

23 dcembre 2010

M. Crucianu

10

CNAM Paris - NFA011

23/12/2010

Variables RECORD : exemple


DECLARE TYPE aeroport IS RECORD (ville CHAR(10), distCentreVille NUMBER(3), capacite NUMBER(5)); ancienAeroport aeroport; nouvelAeroport aeroport; BEGIN ancienAeroport.Ville := Paris; ancienAeroport.DistCentreVille := 20; ancienAeroport.Capacite := 2000; nouvelAeroport := ancienAeroport; END;
23 dcembre 2010 NFA011 21

Variables TABLE

Dfinir des tableaux dynamiques (dimension initiale non prcise) composs dune cl primaire et dune colonne de type scalaire, %TYPE, %ROWTYPE ou RECORD
TYPE nomTypeTableau IS TABLE OF {typeScalaire | variable%TYPE | table.colonne%TYPE | table%ROWTYPE | nomTypeRecord} [NOT NULL] [INDEX BY BINARY_INTEGER]; nomVariableTableau nomTypeTableau;

Si INDEX BY BINARY_INTEGER est prsente, lindex peut tre entre 231 et 231 (type BINARY_INTEGER) ! Fonctions PL/SQL ddies aux tableaux : EXISTS(x),
PRIOR(x), NEXT(x), DELETE(x,), COUNT, FIRST, LAST, DELETE
NFA011 22

23 dcembre 2010

M. Crucianu

11

CNAM Paris - NFA011

23/12/2010

Variables TABLE : exemple


DECLARE TYPE pilotesProspectes IS TABLE OF pilote%ROWTYPE INDEX BY BINARY_INTEGER; tabPilotes pilotesProspectes; tmpIndex BINARY_INTEGER; BEGIN tmpIndex := tabPilotes.FIRST; tabPilotes(4).Age := 37; tabPilotes(4).Salaire := 42000; tabPilotes.DELETE(5); END;
23 dcembre 2010 NFA011 23

Variables de substitution

Passer comme paramtres un bloc PL/SQL des variables dfinies sous SQL*Plus :
SQL> ACCEPT s_matPilote PROMPT Matricule : SQL> ACCEPT s_nomPilote PROMPT Nom pilote : SQL> ACCEPT s_agePilote PROMPT Age pilote : DECLARE salairePilote NUMBER(6,2) DEFAULT 32000; BEGIN INSERT INTO pilote VALUES (&s_matPilote, &s_nomPilote, NULL, &s_agePilote, salairePilote); END; /

23 dcembre 2010

NFA011

24

M. Crucianu

12

CNAM Paris - NFA011

23/12/2010

Variables htes, variables de session

Variables htes :

Dfinies en dehors de PL/SQL et appeles dans PL/SQL Dans le code PL/SQL, prfixer le nom de la variable de :

Variables de session (globales) :


Directive SQL*Plus VARIABLE avant le bloc PL/SQL concern Dans le code PL/SQL, prfixer le nom de la variable de :

SQL> VARIABLE compteurGlobal NUMBER := 0; BEGIN :compteurGlobal := :compteurGlobal - 1; END; / SQL> PRINT compteurGlobal
23 dcembre 2010 NFA011 25

Rsolution des noms

Rgles de rsolution des noms :

Le nom dune variable du bloc lemporte sur le nom dune variable externe au bloc (et visible) Le nom dune variable lemporte sur le nom dune table Le nom dune colonne dune table lemporte sur le nom dune variable

tiquettes de blocs :
<<blocExterne>> DECLARE dateUtilisee DATE; BEGIN DECLARE dateUtilisee DATE; BEGIN dateUtilisee := blocExterne.dateUtilisee; END; END blocExterne;

23 dcembre 2010

NFA011

26

M. Crucianu

13

CNAM Paris - NFA011

23/12/2010

Entres et sorties

Paquetage DBMS_OUTPUT :

Mise dans le tampon dune valeur : Mise dans le tampon du caractre fin de ligne : Mise dans le tampon dune valeur suivie de fin de ligne :

PUT(valeur IN {VARCHAR2 | DATE | NUMBER});

NEW_LINE(ligne OUT VARCHAR2, statut OUT INTEGER);

PUT_LINE(valeur IN {VARCHAR2 | DATE | NUMBER});

Rendre les sorties possibles avec SQL*Plus :


SET SERVEROUT ON

(ou SET SERVEROUTPUT ON)


23 dcembre 2010 NFA011 27

Entres et sorties (2)


Lecture dune ligne : GET_LINE(ligne OUT VARCHAR2(255), statut OUT INTEGER); Lecture de plusieurs lignes : GET_LINES(tableau OUT DBMS_OUTPUT.CHARARR, nombreLignes IN OUT INTEGER);

Exemple :
DECLARE lgnLues DBMS_OUTPUT.CHARARR; nombreLignes INTEGER := 2; BEGIN DBMS_OUTPUT.PUT_LINE(Nombre de lignes : || nombreLignes); DBMS_OUTPUT.GET_LINES(lgnLues, nombreLignes); END;

23 dcembre 2010

NFA011

28

M. Crucianu

14

CNAM Paris - NFA011

23/12/2010

Entres et sorties (3)

Autres API pour des E/S spcifiques :

DBMS_PIPE : changes avec les commandes du systme

dexploitation

UTL_FILE : changes avec des fichiers UTL_HTTP : changes avec un serveur HTTP (Web) UTL_SMTP : changes avec un serveur SMTP (courriel) HTP : affichage des rsultats sur une page HTML

23 dcembre 2010

NFA011

29

Structures de contrle

Structures conditionnelles :

IF THEN ELSIF THEN ELSE END IF; CASE WHEN THEN ELSE END CASE;

Structures rptitives :

WHILE LOOP END LOOP; LOOP EXIT WHEN END LOOP; FOR IN LOOP END LOOP;

23 dcembre 2010

NFA011

30

M. Crucianu

15

CNAM Paris - NFA011

23/12/2010

Structures conditionnelles : IF

Syntaxe :
IF condition1 THEN instructions1; [ELSIF condition2 THEN instructions3;] [ELSE instructions2;] END IF;

Conditions : expressions dans lesquelles peuvent intervenir noms de colonnes, variables PL/SQL, valeurs Oprateurs AND et OR :
AND T F NULL T T F NULL F F F F NULL NULL F NULL
NFA011

OR T F NULL

T T T T

F T F NULL

NULL T NULL NULL


31

23 dcembre 2010

IF : exemple
SQL> ACCEPT s_agePilote PROMPT Age pilote : DECLARE salairePilote pilote.Salaire%TYPE; BEGIN IF &s_agePilote = 45 THEN salairePilote := 28004; ELSIF &s_agePilote = 24 THEN salairePilote := 11758; END IF; DBMS_OUTPUT.PUT_LINE(Salaire de base : || salairePilote); END; /
23 dcembre 2010 NFA011 32

M. Crucianu

16

CNAM Paris - NFA011

23/12/2010

Structures conditionnelles : CASE

Syntaxe avec expressions :


[<<etiquette>>] CASE variable WHEN expression1 THEN instructions1; WHEN expression2 THEN instructions2; [ELSE instructionsj;] END CASE [etiquette];

Syntaxe avec conditions (searched case) :


[<<etiquette>>] CASE WHEN condition1 THEN instructions1; WHEN condition2 THEN instructions2; [ELSE instructionsj;] END CASE [etiquette];

Le premier cas valide est trait, les autres sont ignors Aucun cas valide : exception CASE_NOT_FOUND leve !
NFA011 33

23 dcembre 2010

CASE : exemple
SQL> ACCEPT s_agePilote PROMPT Age pilote : DECLARE salairePilote pilote.Salaire%TYPE; BEGIN CASE &s_agePilote WHEN 45 THEN salairePilote := 28004; WHEN 24 THEN salairePilote := 11758; END CASE; DBMS_OUTPUT.PUT_LINE(Salaire de base : || salairePilote); EXCEPTION WHEN CASE_NOT_FOUND THEN DBMS_OUTPUT.PUT_LINE(valuer exprience); END;
23 dcembre 2010 NFA011 34

M. Crucianu

17

CNAM Paris - NFA011

23/12/2010

Structures rptitives : tant que

Syntaxe :
[<<etiquette>>] WHILE condition LOOP instructions; END LOOP [etiquette];

La condition est vrifie au dbut de chaque itration ; tant que la condition est vrifie, les instructions sont excutes

23 dcembre 2010

NFA011

35

Tant que (WHILE) : exemple


DECLARE valeurEntiere INTEGER := 1; produitSerie INTEGER := 1; BEGIN WHILE (valeurEntiere <= 10) LOOP produitSerie := produitSerie * valeurEntiere; valeurEntiere := valeurEntiere + 1; END LOOP; END;

23 dcembre 2010

NFA011

36

M. Crucianu

18

CNAM Paris - NFA011

23/12/2010

Structures rptitives : rpter

Syntaxe :
[<<etiquette>>] LOOP instructions1; EXIT [WHEN condition]; [instructions2;] END LOOP [etiquette];

La condition est vrifie chaque itration ; si elle est vraie, on quitte la boucle Si la condition est absente, les instructions sont excutes une seule fois
NFA011 37

23 dcembre 2010

Rpter : exemple
DECLARE valeurEntiere INTEGER := 1; produitSerie INTEGER := 1; BEGIN LOOP produitSerie := produitSerie * valeurEntiere; valeurEntiere := valeurEntiere + 1; EXIT WHEN valeurEntiere >= 10; END LOOP; END;

23 dcembre 2010

NFA011

38

M. Crucianu

19

CNAM Paris - NFA011

23/12/2010

Rpter : boucles imbriques


DECLARE BEGIN <<boucleExterne>> LOOP LOOP EXIT boucleExterne WHEN ; /* quitter boucle externe */ EXIT WHEN ; -- quitter boucle interne END LOOP; END LOOP; END;
23 dcembre 2010 NFA011 39

Structures rptitives : pour (FOR)

Syntaxe :
[<<etiquette>>] FOR compteur IN [REVERSE] valInf..valSup LOOP instructions; END LOOP;

Les instructions sont excutes une fois pour chaque valeur prvue du compteur Les bornes valInf,valSup sont values une seule fois Aprs chaque itration, le compteur est incrment de 1 (ou dcrment si REVERSE) ; la boucle est termine quand le compteur sort de lintervalle spcifi
NFA011 40

23 dcembre 2010

M. Crucianu

20

CNAM Paris - NFA011

23/12/2010

Pour (FOR) : exemple


DECLARE valeurEntiere INTEGER := 1; produitSerie INTEGER := 1; BEGIN FOR valeurEntiere IN 1..10 LOOP produitSerie := produitSerie * valeurEntiere; END LOOP; END;

23 dcembre 2010

NFA011

41

Interaction avec la base

Interrogation directe des donnes : doit retourner 1 enregistrement (sinon TOO_MANY_ROWS ou NO_DATA_FOUND)
SELECT listeColonnes INTO var1PLSQL [, var2PLSQL ] FROM nomTable [WHERE condition];

Manipulation des donnes :


Insertions : INSERT INTO nomTable (liste colonnes) VALUES (liste expressions); Modifications : UPDATE nomTable SET nomColonne = expression [WHERE condition]; Suppressions : DELETE FROM nomTable [WHERE condition];

23 dcembre 2010

NFA011

42

M. Crucianu

21

CNAM Paris - NFA011

23/12/2010

Curseurs

Les changes entre lapplication et la base sont raliss grce des curseurs : zones de travail capables de stocker un ou plusieurs enregistrements et de grer laccs ces enregistrements Types de curseurs :

Curseurs implicites :

Dclars implicitement et manipuls par SQL Pour toute requte SQL du LMD et pour les interrogations qui retournent un seul enregistrement Dclars et manipuls par lutilisateur Pour les interrogations qui retournent plus dun enregistrement
NFA011 43

Curseurs explicites :

23 dcembre 2010

Curseurs implicites

Nom : SQL ; actualis aprs chaque requte LMD et chaque SELECT non associ un curseur explicite travers ses attributs, permet au programme PL/SQL dobtenir des infos sur lexcution des requtes :

SQL%FOUND : TRUE si la dernire requte LMD a affect au moins 1

enregistrement

SQL%NOTFOUND : TRUE si la dernire requte LMD na affect aucun

enregistrement

SQL%ROWCOUNT : nombre de lignes affectes par la requte LMD

Exemple :
DELETE FROM pilote WHERE Age >= 55; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || pilotes partent la retraite );

23 dcembre 2010

NFA011

44

M. Crucianu

22

CNAM Paris - NFA011

23/12/2010

Curseurs explicites : instructions

Dfinition = association une requte ; dans la section des dclarations :


CURSOR nomCurseur IS SELECT FROM WHERE ;

Ouverture du curseur (avec excution de la requte) :


OPEN nomCurseur;

Chargement de lenregistrement courant et positionnement sur lenregistrement suivant :


FETCH nomCurseur INTO listeVariables;

Fermeture du curseur (avec libration zone mmoire) :


CLOSE nomCurseur;

23 dcembre 2010

NFA011

45

Curseurs explicites : attributs

nomCurseur%ISOPEN : TRUE si le curseur est ouvert IF nomCurseur%ISOPEN THEN END IF; nomCurseur%FOUND : TRUE si le dernier accs (FETCH) a

retourn une ligne


IF nomCurseur%FOUND THEN END IF;

nomCurseur%NOTFOUND : TRUE si le dernier accs (FETCH)

na pas retourn de ligne (fin curseur)


IF nomCurseur%NOTFOUND THEN END IF;

nomCurseur%ROWCOUNT : nombre total de lignes traites jusqu prsent (par ex. nombre de FETCH) DBMS_OUTPUT.PUT_LINE(Lignes traites : || nomCurseur%ROWCOUNT);

23 dcembre 2010

NFA011

46

M. Crucianu

23

CNAM Paris - NFA011

23/12/2010

Curseurs explicites : exemple


DECLARE CURSOR curseur1 IS SELECT Salaire FROM pilote WHERE (Age >= 30 AND Age <= 40); salairePilote pilote.Salaire%TYPE; sommeSalaires NUMBER(11,2) := 0; moyenneSalaires NUMBER(11,2); BEGIN OPEN curseur1; LOOP FETCH curseur1 INTO salairePilote; EXIT WHEN curseur1%NOTFOUND; sommeSalaires := sommeSalaires + salairePilote; END LOOP; moyenneSalaires := sommeSalaires / curseur1%ROWCOUNT; CLOSE curseur1; DBMS_OUTPUT.PUT_LINE(Moyenne salaires 30 40 ans : || moyenneSalaires); END;
23 dcembre 2010 NFA011 47

Curseurs explicites paramtrs


Objectif : paramtrer la requte associe un curseur (procdures, viter de multiplier les curseurs similaires) Syntaxe de dfinition :
CURSOR nomCurseur(param1[, param2, ]) IS ;

avec, pour chaque paramtre,


nomPar [IN] type [{:= | DEFAULT} valeur];

(nomPar est inconnu en dehors de la dfinition !) Les valeurs des paramtres sont transmises louverture du curseur :
OPEN nomCurseur(valeurPar1[, valeurPar2, ]);

Il faut videmment fermer le curseur avant de lappeler avec dautres valeurs pour les paramtres
NFA011 48

23 dcembre 2010

M. Crucianu

24

CNAM Paris - NFA011

23/12/2010

Curseurs paramtrs : exemple


DECLARE CURSOR curseur1(ageInf NUMBER, ageSup NUMBER) IS SELECT Salaire FROM pilote WHERE (Age >= ageInf AND Age <= ageSup); salairePilote pilote.Salaire%TYPE; sommeSalaires NUMBER(11,2) := 0; moyenneSalaires NUMBER(11,2); BEGIN OPEN curseur1(30,40); LOOP FETCH curseur1 INTO salairePilote; EXIT WHEN curseur1%NOTFOUND; sommeSalaires := sommeSalaires + salairePilote; END LOOP; moyenneSalaires := sommeSalaires / curseur1%ROWCOUNT; CLOSE curseur1; DBMS_OUTPUT.PUT_LINE(); END;
23 dcembre 2010 NFA011 49

Boucle FOR avec curseur

Excuter des instructions pour tout enregistrement retourn par la requte associe un curseur :
DECLARE CURSOR nomCurseur() IS ; BEGIN /* un seul OPEN nomCurseur(), implicite, puis un FETCH chaque itration ; enregistrement dclar implicitement de type nomCurseur%ROWTYPE */ FOR enregistrement IN nomCurseur() LOOP END LOOP; -- implicitement CLOSE nomCurseur END;

23 dcembre 2010

NFA011

50

M. Crucianu

25

CNAM Paris - NFA011

23/12/2010

Boucle FOR avec curseur : exemple


DECLARE CURSOR curseur1(ageInf NUMBER, ageSup NUMBER) IS SELECT Salaire FROM pilote WHERE (Age >= ageInf AND Age <= ageSup); sommeSalaires NUMBER(11,2) := 0; moyenneSalaires NUMBER(11,2) := 0; nbPilotes NUMBER(11,0) := 0; BEGIN FOR salairePilote IN curseur1(30,40) LOOP sommeSalaires := sommeSalaires + salairePilote; nbPilotes := curseur1%ROWCOUNT; END LOOP; /* curseur1 ferm, plus possible de lire %ROWCOUNT */ IF nbPilotes > 0 THEN moyenneSalaires := sommeSalaires / nbPilotes; END IF; DBMS_OUTPUT.PUT_LINE(); END;
23 dcembre 2010 NFA011 51

Curseurs et verrouillage

Objectif : lorsquun curseur est ouvert, verrouiller laccs aux colonnes rfrences des lignes retournes par la requte afin de pouvoir les modifier Syntaxe de dclaration :
CURSOR nomCurseur[(parametres)] IS SELECT listeColonnes1 FROM nomTable WHERE condition FOR UPDATE [OF listeColonnes2] [NOWAIT | WAIT intervalle]

Absence de OF : toutes les colonnes sont verrouilles Absence de NOWAIT | WAIT intervalle : on attend (indfiniment) que les lignes vises soient disponibles
NFA011 52

23 dcembre 2010

M. Crucianu

26

CNAM Paris - NFA011

23/12/2010

Modification des lignes verrouilles

Restrictions : DISTINCT, GROUP BY, oprateurs ensemblistes et fonctions de groupe ne sont pas utilisables dans les curseurs FOR UPDATE Modification de la ligne courante dun curseur :
UPDATE nomTable SET modificationsColonnes WHERE CURRENT OF nomCurseur;

Suppression de la ligne courante dun curseur :


DELETE FROM nomTable WHERE CURRENT OF nomCurseur;

23 dcembre 2010

NFA011

53

Modification des lignes : exemple


DECLARE CURSOR curseur1(villePrime pilote.Ville%TYPE) IS SELECT Salaire FROM pilote WHERE (Ville = villePrime) FOR UPDATE; prime pilote.Salaire%TYPE := 5000; BEGIN -- salaireActuel : implicitement curseur1%ROWTYPE FOR salaireActuel IN curseur1(Paris) LOOP UPDATE pilote SET Salaire = salaireActuel.Salaire + prime WHERE CURRENT OF curseur1; END LOOP; END;

23 dcembre 2010

NFA011

54

M. Crucianu

27

CNAM Paris - NFA011

23/12/2010

Variables curseurs

viter de manipuler de nombreux curseurs associs des requtes diffrentes : dfinir des variables curseurs, associes dynamiquement aux requtes Syntaxe de dclaration :
TYPE nomTypeCurseur IS REF CURSOR [RETURN type]; nomVariableCurseur nomTypeCurseur;

Le curseur est typ si RETURN type est prsente (en gnral, type est nomDeTable%ROWTYPE) ; ne peut tre associ quaux requtes ayant le mme type de retour Association une requte et ouverture :
OPEN nomVariableCurseur FOR SELECT FROM WHERE ;

23 dcembre 2010

NFA011

55

Variables curseurs : exemple


DECLARE TYPE curseurNonType IS REF CURSOR; curseur1 curseurNonType; salaireInf pilote.Salaire%TYPE := 25000; salairePilote pilote.Salaire%TYPE; ageInf pilote.Age%TYPE := 27; BEGIN OPEN curseur1 FOR SELECT Salaire FROM pilote WHERE Salaire <= salaireInf; LOOP FETCH curseur1 INTO salairePilote; EXIT WHEN curseur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(Salaire : || salairePilote); END LOOP; CLOSE curseur1; OPEN curseur1 FOR SELECT Age FROM pilote WHERE Age <= ageInf; END;
23 dcembre 2010 NFA011 56

M. Crucianu

28

CNAM Paris - NFA011

23/12/2010

Sous-programmes

Blocs PL/SQL nomms et paramtrs


Procdures : ralisent des traitements ; peuvent retourner ou non un ou plusieurs rsultats Fonctions : retournent un rsultat unique ; peuvent tre appeles dans des requtes SQL

Sont stocks avec la base Intrt de lutilisation de sous-programmes :


Productivit de la programmation : modularit (avantage pour la conception et la maintenance), rutilisation Intgrit : regroupement des traitements dpendants Scurit : gestion des droits sur les programmes qui traitent les donnes

La rcursivit est permise ( utiliser avec prcaution) !


NFA011 57

23 dcembre 2010

Procdures

Syntaxe :
PROCEDURE nomProcedure [(par1 [IN | OUT | IN OUT] [NOCOPY] type1 [{:= | DEFAULT} expression] [, par2 [IN | OUT | IN OUT] [NOCOPY] type2 [{:= | DEFAULT} expression )] {IS | AS} [declarations;] BEGIN instructions; [EXCEPTION traitementExceptions;] END[nomProcedure];

Se termine la fin du bloc ou par une instruction RETURN


NFA011 58

23 dcembre 2010

M. Crucianu

29

CNAM Paris - NFA011

23/12/2010

Fonctions

Syntaxe :
FUNCTION nomFonction [(par1 [IN | OUT | IN OUT] [NOCOPY] type1 [{:= | DEFAULT} expression] [, par2 [IN | OUT | IN OUT] [NOCOPY] type2 [{:= | DEFAULT} expression )] RETURN typeRetour {IS | AS} [declarations;] BEGIN instructions; [EXCEPTION traitementExceptions;] END[nomFonction];

Se termine obligatoirement par RETURN qui doit renvoyer une valeur de type typeRetour
NFA011 59

23 dcembre 2010

Paramtres de sous-programme

Types de paramtres :

Entre (IN) : on ne peut pas lui affecter une valeur dans le sousprogramme ; le paramtre effectif associ peut tre une constante, une variable ou une expression ; toujours pass par rfrence ! Sortie (OUT) : on ne peut pas laffecter ( une variable ou lui-mme) dans le sous-programme ; le paramtre effectif associ doit tre une variable ; par dfaut (sans NOCOPY) pass par valeur ! Entre et sortie (IN OUT) : le paramtre effectif associ doit tre une variable ; par dfaut (sans NOCOPY) pass par valeur !

NOCOPY : passage par rfrence de paramtre OUT | IN OUT, utile

pour paramtres volumineux ; attention aux effets de bord ! Paramtres OUT | IN OUT pour FUNCTION : mauvaise pratique qui produit des effets de bord. Lorsquune fonction doit tre appele depuis SQL, seuls des paramtres IN sont autoriss !
NFA011 60

23 dcembre 2010

M. Crucianu

30

CNAM Paris - NFA011

23/12/2010

Dfinition de sous-programme

Dfinition de procdure ou fonction locale dans un bloc PL/SQL : la fin de la section de dclarations
DECLARE PROCEDURE nomProcedure ; END nomProcedure; FUNCTION nomFonction ; END nomFonction; BEGIN END;

Dfinition de procdure ou fonction stocke (isole ou dans un paquetage) :


CREATE [OR REPLACE] PROCEDURE nomProcedure ; END nomProcedure; CREATE [OR REPLACE] FUNCTION nomFonction ; END nomFonction;

23 dcembre 2010

NFA011

61

Manipulation de sous-programme

Cration ou modification de sous-programme :


CREATE [OR REPLACE] {PROCEDURE | FUNCTION} nom

Oracle recompile automatiquement un sousprogramme quand la structure dun objet dont il dpend a t modifie

Pour une compilation manuelle : ALTER {PROCEDURE | FUNCTION} nom COMPILE Affichage des erreurs de compilation sous SQL*Plus : SHOW ERRORS

Suppression de sous-programme :
DROP {PROCEDURE | FUNCTION} nom

23 dcembre 2010

NFA011

62

M. Crucianu

31

CNAM Paris - NFA011

23/12/2010

Appel de sous-programme

Appel de procdure depuis un bloc PL/SQL :


nomProcedure(listeParEffectifs);

Appel de procdure stocke depuis SQL*Plus :


SQL> EXECUTE nomProcedure(listeParEffectifs);

Appel de fonction depuis un bloc PL/SQL : introduction dans une instruction PL/SQL ou SQL de
nomFonction(listeParEffectifs)

Appel de fonction stocke depuis SQL*Plus : introduction dans une instruction SQL de
nomFonction(listeParEffectifs)
NFA011 63

23 dcembre 2010

Procdure locale : exemple


DECLARE nbPilotesPrimes INTEGER := 0; PROCEDURE accordPrime(villePrime IN pilote.Ville%TYPE, valPrime IN NUMBER, nbPilotes OUT INTEGER) IS BEGIN UPDATE pilote SET Salaire = Salaire + valPrime WHERE (Ville = villePrime); nbPilotes := SQL%ROWCOUNT; END accordPrime; BEGIN accordPrime(Toulouse, 1000, nbPilotesPrimes); DBMS_OUTPUT.PUT_LINE(Nombre pilotes prims : || nbPilotesPrimes); END;

23 dcembre 2010

NFA011

64

M. Crucianu

32

CNAM Paris - NFA011

23/12/2010

Procdure stocke : exemple


CREATE OR REPLACE PROCEDURE accordPrime(villePrime IN pilote.Ville%TYPE, valPrime IN NUMBER, nbPilotes OUT INTEGER) IS BEGIN UPDATE pilote SET Salaire = Salaire + valPrime WHERE (Ville = villePrime); nbPilotes := SQL%ROWCOUNT; END accordPrime;

Appel depuis SQL*Plus :


SQL> EXECUTE accordPrime(Gap,1000,nbPilotesPrimes);

Appel depuis un bloc PL/SQL :


BEGIN accordPrime(Gap, 1000, nbPilotesPrimes); END;

23 dcembre 2010

NFA011

65

Fonction locale : exemple


DECLARE salaireMoyInt pilote.Salaire%TYPE; FUNCTION moyInt(ageInf IN pilote.Age%TYPE, ageSup IN pilote.Age%TYPE) RETURN pilote.Salaire%TYPE IS BEGIN -- la variable du parent est visible ici ! SELECT AVG(Salaire) INTO salaireMoyInt FROM pilote WHERE (Age >= ageInf AND Age <= ageSup); RETURN salaireMoyInt; END moyInt; BEGIN salaireMoyInt := moyInt(32,49); DBMS_OUTPUT.PUT_LINE(Salaire moyen pour ge 32-49 || salaireMoyInt); END;
23 dcembre 2010 NFA011 66

M. Crucianu

33

CNAM Paris - NFA011

23/12/2010

Fonction stocke : exemple


CREATE OR REPLACE FUNCTION moyInt(ageInf IN pilote.Age%TYPE, ageSup IN pilote.Age%TYPE) RETURN pilote.Salaire%TYPE IS salaireMoyInt pilote.Salaire%TYPE; BEGIN SELECT AVG(Salaire) INTO salaireMoyInt FROM pilote WHERE (Age >= ageInf AND Age <= ageSup); RETURN salaireMoyInt; END moyInt; Appel depuis SQL*Plus : SQL> SELECT FROM pilote WHERE (Salaire > moyInt(32,49));

Appel depuis un bloc PL/SQL :


salaireMoyenIntervalle := moyInt(32,49);

23 dcembre 2010

NFA011

67

Paquetages

Paquetage = regroupement de variables, curseurs, fonctions, procdures, etc. PL/SQL qui fournissent un ensemble cohrent de services Distinction entre ce qui est accessible depuis lextrieur et ce qui nest accessible qu lintrieur du paquetage encapsulation Structure :

Section de spcification : dclarations des variables, curseurs, sous-programmes accessibles depuis lextrieur Section dimplmentation : code des sous-programmes accessibles depuis lextrieur + sous-programmes accessibles en interne (privs)
NFA011 68

23 dcembre 2010

M. Crucianu

34

CNAM Paris - NFA011

23/12/2010

Section de spcification

Syntaxe :
CREATE [OR REPLACE] PACKAGE nomPaquetage {IS | AS} [declarationTypeRECORDpublique ; ] [declarationTypeTABLEpublique ; ] [declarationSUBTYPEpublique ; ] [declarationRECORDpublique ; ] [declarationTABLEpublique ; ] [declarationEXCEPTIONpublique ; ] [declarationCURSORpublique ; ] [declarationVariablePublique ; ] [declarationFonctionPublique ; ] [declarationProcedurePublique ; ] END [nomPaquetage];

23 dcembre 2010

NFA011

69

Spcification : exemple
CREATE PACKAGE gestionPilotes AS CURSOR accesPilotes(agePilote pilote.Age%TYPE) RETURN pilote%ROWTYPE; FUNCTION moyInt(ageInf IN pilote.Age%TYPE, ageSup IN pilote.Age%TYPE) RETURN pilote.Salaire%TYPE; PROCEDURE accordPrime(villePrime IN pilote.Ville%TYPE, valPrime IN NUMBER,nbPilotes OUT INTEGER); END gestionPilotes;

23 dcembre 2010

NFA011

70

M. Crucianu

35

CNAM Paris - NFA011

23/12/2010

Section dimplmentation

Syntaxe :
CREATE [OR REPLACE] PACKAGE BODY nomPaquetage {IS | AS} [declarationTypePrive ; ] [declarationObjetPrive ; ] [definitionFonctionPrivee ; ] [definitionProcedurePrivee ; ] [instructionsFonctionPublique ; ] [instructionsProcedurePublique ; ] END [nomPaquetage];

23 dcembre 2010

NFA011

71

Implmentation : exemple
CREATE PACKAGE BODY gestionPilotes AS CURSOR accesPilotes(agePilote pilote.Age%TYPE) RETURN pilote%ROWTYPE IS SELECT * FROM pilote WHERE Age = agePilote; FUNCTION moyInt(ageInf IN pilote.Age%TYPE, ageSup IN pilote.Age%TYPE) RETURN pilote.Salaire%TYPE IS BEGIN SELECT AVG(Salaire) INTO salaireMoyInt FROM pilote WHERE (Age >= ageInf AND Age <= ageSup); RETURN salaireMoyInt; END moyInt; PROCEDURE accordPrime(villePrime IN pilote.Ville%TYPE, valPrime IN NUMBER, nbPilotes OUT INTEGER) IS BEGIN UPDATE pilote SET Salaire = Salaire + valPrime WHERE (Ville = villePrime); nbPilotes := SQL%ROWCOUNT; END accordPrime; END gestionPilotes;
23 dcembre 2010 NFA011 72

M. Crucianu

36

CNAM Paris - NFA011

23/12/2010

Rfrence au contenu dun paquetage


Naturellement, seuls les objets et sous-programmes publics peuvent tre rfrencs depuis lextrieur Syntaxe :
nomPaquetage.nomObjet nomPaquetage.nomSousProgramme()

Les paquetages autorisent la surcharge des noms de fonctions ou de procdures

Toutes les versions (qui diffrent par le nombre et/ou le type des paramtres) doivent tre dclares dans la section de spcification Les rfrences seront les mmes pour les diffrentes versions, le choix est fait en fonction des paramtres effectifs
NFA011 73

23 dcembre 2010

Manipulation dun paquetage

Re-compilation dun paquetage :

Utiliser CREATE OR REPLACE PACKAGE et terminer par / une des sections (sous SQL*Plus) La modification dune des sections entrane la re-compilation automatique de lautre section Affichage des erreurs de compilation avec SQL*Plus : SHOW ERRORS

Suppression dun paquetage :


DROP BODY nomPaquetage; DROP nomPaquetage;

23 dcembre 2010

NFA011

74

M. Crucianu

37

CNAM Paris - NFA011

23/12/2010

Exceptions

Les exceptions correspondent des conditions derreur constates lors de lexcution dun programme PL/SQL ou de requtes SQL PL/SQL propose un mcanisme de traitement pour les exceptions dclenches, permettant dviter larrt systmatique du programme Les programmeurs peuvent se servir de ce mcanisme non seulement pour les erreurs Oracle, mais pour toute condition quils peuvent dfinir ( communication plus riche entre appelants et appels ou blocs imbriqus)
NFA011 75

23 dcembre 2010

Traitement des exceptions

Syntaxe :
EXCEPTION WHEN nomException1 [OR nomException2 ] THEN instructions1; WHEN nomException3 [OR nomException4 ] THEN instructions3; WHEN OTHERS THEN instructionsAttrapeTout; END;

23 dcembre 2010

NFA011

76

M. Crucianu

38

CNAM Paris - NFA011

23/12/2010

Suites de lapparition dune exception


1. Aucun traitement nest prvu : le programme sarrte 2. Un traitement est prvu :

Lexcution du bloc PL/SQL courant est abandonne Le traitement de lexception est recherch dans la section EXCEPTION associe au bloc courant, sinon dans les blocs parents (englobant le bloc courant) ou le programme appelant Lexception est traite suivant les instructions trouves (spcifiques ou attrape-tout) Lexcution se poursuit normalement dans le bloc parent (ou le programme appelant) de celui qui a trait lexception

23 dcembre 2010

NFA011

77

Suites de lapparition dune exception


DECLARE BEGIN EXCEPTION END; DECLARE BEGIN EXCEPTION ? END;

DECLARE BEGIN EXCEPTION ? END;

23 dcembre 2010

NFA011

78

M. Crucianu

39

CNAM Paris - NFA011

23/12/2010

Mcanismes de dclenchement
1. Dclenchement automatique suite lapparition dune des erreurs prdfinies Oracle : VALUE_ERROR, ZERO_DIVIDE, TOO_MANY_ROWS, etc. ou non nommes 2. Dclenchement programm (permet au programmeur dexploiter le mcanisme de traitement des erreurs) :

Dclaration (dans DECLARE) : nomException EXCEPTION; Dclenchement (dans BEGIN) : RAISE nomException;

Il est galement possible de dclencher avec RAISE une exception prdfinie Oracle !
RAISE nomExceptionPreDefinie;
23 dcembre 2010 NFA011 79

Exceptions non nommes

Traitement non spcifique grce lattrape-tout :


WHEN OTHERS THEN instructions;

Exemple :
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM || ( || SQLCODE || ));

Identification et traitement spcifique :


Identification dans la section DECLARE : nomAPrendre EXCEPTION; PRAGMA EXCEPTION_INIT(nomAPrendre, numErrOracle);
Traitement spcifique : WHEN nomAPrendre THEN instructions;

23 dcembre 2010

NFA011

80

M. Crucianu

40

CNAM Paris - NFA011

23/12/2010

Mcanismes de dclenchement (2)

Propagation explicite au parent ou lappelant aprs traitement local :


WHEN nomException1 THEN ; RAISE; -- la mme exception nomException1 WHEN autreException THEN

Dclenchement avec message et code derreur personnalis :


RAISE_APPLICATION_ERROR(numErr, messageErr, [TRUE | FALSE]); Utilise le mcanisme des exceptions non nommes, avec SQLERRM et SQLCODE TRUE : mise dans une pile derreurs propager (par dfaut) ; FALSE : remplace les erreurs prcdentes dans la pile

23 dcembre 2010

NFA011

81

Transactions

Objectif : rendre indivisible une suite de manipulations des donnes


tat cohrent 1 de la base Rollback Instruction 1 LIMD Instruction 2 LIMD Perturbation Instruction n LIMD Commit tat cohrent 2 de la base

23 dcembre 2010

NFA011

82

M. Crucianu

41

CNAM Paris - NFA011

23/12/2010

Transactions : exigences

Indivisibilit (atomicit) des instructions regroupes dans une transaction Maintien de la cohrence : passage dun tat initial cohrent un tat cohrent (qui peut tre le mme que ltat initial si la transaction ne sest pas termine avec succs) Isolation entre plusieurs transactions (srialisation) ; pour des raisons de performance, des niveaux intermdiaires disolation peuvent tre employs Durabilit des oprations : une fois la transaction termine avec succs, le rsultat des oprations quelle regroupe ne peut pas tre remis en question
NFA011 83

23 dcembre 2010

Transactions : contrle

Dbut dune transaction : pas dinstruction explicite


la premire instruction SQL aprs le BEGIN du bloc la premire instruction SQL aprs la fin dune autre transaction Avec succs : COMMIT [WORK]; chec : ROLLBACK [WORK]; Avec succs : la fin normale de la session ou la premire instruction du LDD ou LCD chec : la fin anormale dune session

Fin explicite dune transaction :


Fin implicite dune transaction :

23 dcembre 2010

NFA011

84

M. Crucianu

42

CNAM Paris - NFA011

23/12/2010

Transactions : contrle (2)

Les points de validation intermdiaires rendent possible lannulation dune partie des oprations :
SAVEPOINT nomPoint; -- insertion point de validation ROLLBACK TO nomPoint; -- retour ltat davant nomPoint

Remarques :

Oracle place chaque instruction SQL dans une transaction implicite ; si linstruction choue (par exemple, une exception est leve), ltat redevient celui qui prcde linstruction La sortie dun sous-programme suite une exception non traite ne produit pas de ROLLBACK implicite des oprations ralises dans le sous-programme !

23 dcembre 2010

NFA011

85

Transactions : exemple
DECLARE BEGIN -- changer les heures de dpart de 2 vols SELECT * INTO vol1 FROM Vol WHERE Numvol = numVol1; SELECT * INTO vol2 FROM Vol WHERE Numvol = numVol2; dureeVol1 := vol1.Heure_arrivee vol1.Heure_depart; dureeVol2 := vol2.Heure_arrivee vol2.Heure_depart; UPDATE Vol SET Heure_depart = vol1.Heure_depart, Heure_arrivee = vol1.Heure_depart + dureeVol2 WHERE Numvol = numVol2; UPDATE Vol SET Heure_depart = vol2.Heure_depart, Heure_arrivee = vol2.Heure_depart + dureeVol1 WHERE Numvol = numVol1; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END;
23 dcembre 2010 NFA011 86

M. Crucianu

43

CNAM Paris - NFA011

23/12/2010

Dclencheurs

Dclencheur (trigger) = programme dont lexcution est dclenche (fired) par un vnement (un dclencheur nest pas appel explicitement par une application) vnements dclencheurs :

Instruction LMD : INSERT, UPDATE, DELETE Instruction LDD : CREATE, ALTER, DROP Dmarrage ou arrt de la base Connexion ou dconnexion dutilisateur Erreur dexcution

Usage frquent : implmenter les rgles de gestion non exprimables par les contraintes au niveau des tables
NFA011 87

23 dcembre 2010

Dfinition dun dclencheur

Structure :
1. 2. 3.

Description de lvnement dclencheur ventuelle condition supplmentaire satisfaire pour dclenchement Description du traitement raliser aprs dclenchement

Syntaxe pour dclenchement sur instruction LMD :


CREATE [OR REPLACE] TRIGGER nomDeclencheur {BEFORE | AFTER | INSTEAD OF} {DELETE | INSERT | UPDATE [OF colonne 1, ] [OR ]} ON {nomTable | nomVue} [REFERENCING {OLD [AS] nomAncien | NEW [AS] nomNouveau | PARENT [AS] nomParent } ] [FOR EACH ROW] [WHEN conditionSupplementaire] {[DECLARE ] BEGIN [EXCEPTION ] END; | CALL nomSousProgramme(listeParametres)}

23 dcembre 2010

NFA011

88

M. Crucianu

44

CNAM Paris - NFA011

23/12/2010

Dclencheurs sur instruction LMD

Quand le dclenchement a lieu (si concevable) :


Avant lvnement : BEFORE Aprs lvnement : AFTER la place de lvnement : INSTEAD OF (uniquement pour vues multi-tables) La ou les (OR) instructions, Si lvnement concerne des colonnes spcifiques ([OF colonne 1, ]) ou non, Le nom de la table (ou vue) (ON {nomTable | nomVue})

Description de lvnement (pour instructions LMD) :


23 dcembre 2010

NFA011

89

Dclencheurs sur instruction LMD

Changement des noms par dfaut : REFERENCING

:OLD dsigne un enregistrement effacer (dclencheur sur DELETE, UPDATE) : REFERENCING OLD AS nomAncien :NEW dsigne un enregistrement insrer (dclencheur sur INSERT, UPDATE) : REFERENCING NEW AS nomNouveau :PARENT pour des nested tables : REFERENCING PARENT AS nomParent

FOR EACH ROW : Avec FOR EACH ROW, 1 excution par ligne concerne par linstruction LMD (row trigger) Sans FOR EACH ROW, 1 excution par instruction LMD (statement trigger)
NFA011 90

23 dcembre 2010

M. Crucianu

45

CNAM Paris - NFA011

23/12/2010

Base exemple

Tables de la base (la cl primaire est souligne) :


immeuble (Adr, NbEtg, DateConstr, NomGerant) appart (Adr, Num, Type, Superficie, Etg, NbOccup) personne (Nom, Age, CodeProf) occupant (Adr, NumApp, NomOccup, DateArrivee, DateDepart) propriete (Adr, NomProprietaire, QuotePart)

Exemples de contraintes satisfaire :

Intgrit rfrentielle (cl trangre cl primaire) : lors de la cration de la table propriete : CONSTRAINT prop_pers FOREIGN
KEY (NomProprietaire) REFERENCES personne (Nom)

Condition entre colonnes : lors de la cration de la table occupant :


CONSTRAINT dates CHECK (DateArrivee < DateDepart)

Rgles de gestion : somme quotes-parts pour une proprit = 100 ; date construction immeuble < dates arrive de tous ses occupants dclencheurs
NFA011 91

23 dcembre 2010

Dclencheur sur INSERT

Pour un nouvel occupant, vrifie si occupant.DateArrivee > immeuble.DateConstr (FOR EACH ROW est ncessaire pour avoir accs :NEW, lenregistrement ajout) :

CREATE TRIGGER TriggerVerificationDates BEFORE INSERT ON occupant FOR EACH ROW DECLARE Imm immeuble%ROWTYPE; BEGIN SELECT * INTO Imm FROM immeuble WHERE immeuble.Adr = :NEW.Adr; IF :NEW.DateArrivee < Imm.DateConstr THEN RAISE_APPLICATION_ERROR(-20100, :NEW.Nom || arriv avant construction immeuble || Imm.Adr); END IF; END; vnement dclencheur : INSERT INTO occupant VALUES ;
23 dcembre 2010 NFA011 92

M. Crucianu

46

CNAM Paris - NFA011

23/12/2010

Dclencheur sur INSERT (2)

Si chaque nouvel immeuble doit avoir au moins un appartement, insrer un appartement aprs la cration de limmeuble (FOR EACH ROW est ncessaire pour avoir accs :NEW, lenregistrement ajout) :
CREATE TRIGGER TriggerAppartInitial AFTER INSERT ON immeuble FOR EACH ROW BEGIN INSERT INTO appart (Adr, Num, NbOccup) VALUES (:NEW.Adr, 1, 0); END;

vnement dclencheur : INSERT INTO immeuble VALUES ;


NFA011 93

23 dcembre 2010

Dclencheur sur DELETE

Au dpart dun occupant, dcrmente appart.NbOccup aprs effacement de loccupant (FOR EACH ROW est ncessaire car la suppression peut concerner plusieurs occupants, ainsi que pour avoir accs :OLD, lenregistrement limin) :
CREATE TRIGGER TriggerDiminutionNombreOccupants AFTER DELETE ON occupant FOR EACH ROW BEGIN UPDATE appart SET NbOccup = NbOccup - 1 WHERE appart.Adr = :OLD.Adr AND appart.Num = :OLD.NumApp; END;

vnement dclencheur : DELETE FROM occupant WHERE ;


NFA011 94

23 dcembre 2010

M. Crucianu

47

CNAM Paris - NFA011

23/12/2010

Dclencheur sur UPDATE

En cas de modification dun occupant, met jour les valeurs de appart.NbOccup pour 2 les appartements ventuellement concerns (utilise la fois :OLD et :NEW) :
CREATE TRIGGER TriggerMAJNombreOccupants AFTER UPDATE ON occupant FOR EACH ROW BEGIN IF :OLD.Adr <>:NEW.Adr OR :OLD.NumApp <>:NEW.NumApp THEN UPDATE appart SET NbOccup = NbOccup - 1 WHERE appart.Adr = :OLD.Adr AND appart.Num = :OLD.NumApp; UPDATE appart SET NbOccup = NbOccup + 1 WHERE appart.Adr = :NEW.Adr AND appart.Num = :NEW.NumApp; END IF; END;

vnement dclencheur : UPDATE occupant SET WHERE ;


NFA011 95

23 dcembre 2010

Dclencheur sur conditions multiples

Un seul dclencheur pour INSERT, DELETE, UPDATE qui met jour les valeurs de appart.NbOccup pour le(s) appartement(s) concern(s) :
CREATE TRIGGER TriggerCompletMAJNombreOccupants AFTER INSERT OR DELETE OR UPDATE ON occupant FOR EACH ROW BEGIN IF (INSERTING) THEN ELSIF (DELETING) THEN ELSIF (UPDATING) THEN END IF; END;

Exemple dvnement dclencheur :


INSERT INTO occupant VALUES ;
NFA011 96

23 dcembre 2010

M. Crucianu

48

CNAM Paris - NFA011

23/12/2010

Dclencheurs sur instruction LDD

Syntaxe pour dclenchement sur instruction LDD :


CREATE [OR REPLACE] TRIGGER nomDeclencheur BEFORE | AFTER action [OR action ] ON {[nomSchema.]SCHEMA | DATABASE} {[DECLARE ] BEGIN [EXCEPTION ] END; | CALL nomSousProgramme(listeParametres)}

SCHEMA : dclencheur valable pour schma courant

Quelques actions :

CREATE, RENAME, ALTER, DROP sur un objet du dictionnaire GRANT, REVOKE privilge(s) un utilisateur
NFA011 97

23 dcembre 2010

Dclencheur sur LDD : exemple

Enregistrement des changements de noms des objets du dictionnaire :


historiqueChangementNoms(Date,NomObjet,NomProprietaire) CREATE TRIGGER TriggerHistoriqueChangementNoms AFTER RENAME ON DATABASE BEGIN -- On se sert de 2 attributs systme -- ora_dict_obj_name : nom objet affect -- ora_dict_obj_owner : propritaire objet affect INSERT INTO historiqueChangementNoms VALUES (SYSDATE, ora_dict_obj_name, ora_dict_obj_owner); END;

23 dcembre 2010

NFA011

98

M. Crucianu

49

CNAM Paris - NFA011

23/12/2010

Dclencheurs dinstance

Syntaxe :
CREATE [OR REPLACE] TRIGGER nomDeclencheur BEFORE | AFTER evenement [OR evenement ] ON {[nomSchema.]SCHEMA | DATABASE} {[DECLARE ] BEGIN [EXCEPTION ] END; | CALL nomSousProgramme(listeParametres)}

vnements dclencheurs concerns :


Dmarrage ou arrt de la base : SHUTDOWN ou STARTUP Connexion ou dconnexion dutilisateur : LOGON ou LOGOFF Erreurs : SERVERERROR, NO_DATA_FOUND,

23 dcembre 2010

NFA011

99

Dclencheur dinstance : exemple

Afficher lidentit de lobjet ayant provoqu un dbordement :


CREATE TRIGGER TriggerDebordement AFTER SERVERERROR ON DATABASE DECLARE eno NUMBER; typ VARCHAR2; owner VARCHAR2; ts VARCHAR2; obj VARCHAR2; subobj VARCHAR2; BEGIN IF (space_error_info(eno,typ,owner,ts,obj,subobj) = TRUE) THEN DBMS_OUTPUT.PUT_LINE(L'objet || obj || de || owner || a dbord !); END IF; END;

23 dcembre 2010

NFA011

100

M. Crucianu

50

CNAM Paris - NFA011

23/12/2010

Manipulation dun dclencheur


Tout dclencheur est actif ds sa compilation ! Re-compilation dun dclencheur aprs modification :
ALTER TRIGGER nomDeclencheur COMPILE;

Dsactivation de dclencheurs :
ALTER TRIGGER nomDeclencheur DISABLE; ALTER TABLE nomTable DISABLE ALL TRIGGERS;

Ractivation de dclencheurs :
ALTER TRIGGER nomDeclencheur ENABLE; ALTER TABLE nomTable ENABLE ALL TRIGGERS;

Suppression dun dclencheur :


DROP TRIGGER nomDeclencheur;
NFA011 101

23 dcembre 2010

Droits de cration et manipulation

Dclencheurs dinstance : privilge


ADMINISTER DATABASE TRIGGER

Autres dclencheurs :

Dans tout schma : privilge CREATE ANY TRIGGER Dans votre schma : privilge CREATE TRIGGER (rle RESOURCE)

23 dcembre 2010

NFA011

102

M. Crucianu

51

CNAM Paris - NFA011

23/12/2010

ALL_TRIGGERS, DBA_TRIGGERS, USER_TRIGGERS

ALL_TRIGGERS : dclencheurs de lutilisateur et des tables de lutilisateur OWNER TRIGGER_NAME TRIGGER_TYPE (BEFORE STATEMENT, BEFORE EACH ROW, ) TRIGGERING_EVENT TABLE_OWNER BASE_OBJECT_TYPE (TABLE, VIEW, SCHEMA, DATABASE) TABLE_NAME COLUMN_NAME REFERENCING_NAMES WHEN_CLAUSE STATUS (ENABLED, DISABLED) DESCRIPTION ACTION_TYPE (CALL, PL/SQL) TRIGGER_BODY DBA_TRIGGERS : de la base, USER_TRIGGERS : de lutilisateur
NFA011 103

23 dcembre 2010

JDBC

Java DataBase Connectivity (JDBC) : API de bas niveau permettant de travailler avec une ou plusieurs bases de donnes depuis un programme Java Objectif : interface uniforme assurant lindpendance du SGBDR cible Ralit : indpendance relative du SGBDR, linterface tant assure par un pilote (driver) fourni par lditeur du SGBDR ou par un tiers Versions :

JDBC 1 : SDK 1.1 (java.sql) JDBC 2 : SDK 1.2 (java.sql, javax.sql) JDBC 3 : SDK 1.4
NFA011 104

23 dcembre 2010

M. Crucianu

52

CNAM Paris - NFA011

23/12/2010

JDBC : architecture
Application ou applet Java API JDBC JDBC driverManager API Driver JDBC JDBC driver Oracle propritaire Oracle
23 dcembre 2010

JDBC driver MySQL

JDBC driver Postgres

Bridge JDBC-ODBC propritaire

propritaire MySQL

propritaire Postgres
NFA011

105

Taxonomie des pilotes (JavaSoft)

Type 1 : JDBC-ODBC Bridge

Utilisation comme intermdiaire de Open DataBase Connectivity (ODBC) de Microsoft JDK : sun.jdbc.odbc.JdbcOdbcDriver Exige lexcution par le client (dit pais ) de code non Java, ne peut donc pas tre utilis par les applets Appelle des fonctions natives (non Java) de lAPI du SGBDR Fournis par les diteurs des SGBDR ou par des tiers Exige lexcution par le client (dit pais ) de code non Java, ne peut donc pas tre utilis par les applets

Type 2 : Native-API Partly-Java Driver


23 dcembre 2010

NFA011

106

M. Crucianu

53

CNAM Paris - NFA011

23/12/2010

Taxonomie des pilotes (JavaSoft)

Type 3 : Net-protocol, all Java driver

Utilise, travers une API rseau gnrique, un serveur middleware comme intermdiaire avec le SGBDR Client lger 100% Java, peut donc tre employ par les applets condition que ladresse du middleware soit la mme que celle du serveur Web Interagit avec le SGBDR directement travers des sockets Fournis par les diteurs des SGBDR ou par des tiers Client lger 100% Java, peut donc tre employ par les applets condition que ladresse du SGBDR soit la mme que celle du serveur Web
NFA011 107

Type 4 : Native protocol, all Java driver


23 dcembre 2010

Modles dinteraction

Modle 2-tiers : interaction directe entre le client applet/application Java et le SGBDR


Avantage : facilit de mise en uvre Dsavantages : tout le traitement est du ct du client, dpendance forte entre le client et le SGBDR

Modle 3-tiers : interaction par lintermdiaire dun serveur middleware

Avantages : une partie du traitement peut tre transfre au serveur middleware, flexibilit pour linteraction avec le client, le client peut tre totalement indpendant du SGBDR Dsavantages : difficult de mise en uvre, exige des comptences plus vastes
NFA011 108

23 dcembre 2010

M. Crucianu

54

CNAM Paris - NFA011

23/12/2010

Structure de lapplication Java


1. 2. 3. 4. 5. 6. 7.

Importation de paquetages Enregistrement du pilote tablissement des connexions Prparation des instructions SQL Excution des instructions SQL Traitement des donnes retournes Fermeture
NFA011 109

23 dcembre 2010

Importation de paquetages

Importation du paquetage de base JDBC (obligatoire) :


import java.sql.*;

Importation de paquetages spcifiques :

Additions au paquetage de base : import javax.sql.*; Paquetage permettant dutiliser des types spcifiques Oracle : import oracle.sql.*; Paquetage contenant le pilote Oracle (obligatoire) : import oracle.jdbc.driver.*;

CLASSPATH doit inclure le paquetage employer (en fonction du pilote choisi, par exemple ojdbc14.jar)
NFA011 110

23 dcembre 2010

M. Crucianu

55

CNAM Paris - NFA011

23/12/2010

Enregistrement du pilote

Chargement de la classe du pilote, qui cre une instance et senregistre auprs du DriverManager (pour tous les types de pilotes) :
Class.forName(oracle.jdbc.driver.OracleDriver);

ou

Cration explicite dune instance et enregistrement explicite (pilotes de type 2, 3 ou 4) :


DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

23 dcembre 2010

NFA011

111

tablissement de connexion

Connexion = instance de la classe qui implmente linterface Connection Appel de la mthode getConnection(URLconnexion, login, password) de la classe DriverManager, avec URLconnexion = jdbc:sousProtocole:identifiantBase

jdbc : protocole sousProtocole : odbc pour pilote type 1, oracle:oci pour pilote Oracle de type 2, oracle:thin pour pilote Oracle de type 4, etc. identifiantBase : dpend du pilote utilis ; exemple pour pilote de type 4 : nom de la machine (ou adresse IP) + numro de port + nom de la base
NFA011 112

23 dcembre 2010

M. Crucianu

56

CNAM Paris - NFA011

23/12/2010

tablissement de connexion (2)

Exemple :
Connection nomConnexion = DriverManager.getConnection (jdbc:oracle:thin:@odessa:1521:NFA011, Julien, monpass); Pilote lger de type 4 oracle:thin Nom machine odessa Numro de port 1521 Nom de la base NFA011

DriverManager essaye tous les drivers, respectant le

sous-protocole indiqu, qui se sont enregistrs (dans lordre denregistrement) et utilise le premier qui accepte la connexion
23 dcembre 2010 NFA011 113

Options dune connexion

Aprs louverture dune connexion on peut prciser des options :

Lecture seulement ou non : mthode setReadOnly(boolean) de Connection Commit automatique ou non : mthode setAutoCommit(boolean) de Connection

nomConnexion.setReadOnly(true);

(voir transactions plus loin) nomConnexion.setAutoCommit(false);

Degr disolation : mthode setTransactionIsolation() de Connection


NFA011 114

23 dcembre 2010

M. Crucianu

57

CNAM Paris - NFA011

23/12/2010

Passage des appels SQL

Pour transmettre un appel SQL il faut commencer par crer une instance de classe qui implmente linterface correspondante Interfaces utilisables pour les appels SQL :

Interface Statement : pour les instructions SQL simples Interface PreparedStatement : pour les instructions SQL paramtres (mais peut servir pour les instructions simples) Interface CallableStatement : pour les procdures ou fonctions catalogues (PL/SQL ou autres)

23 dcembre 2010

NFA011

115

Interface Statement

Cration :
Statement stmt = connexion.createStatement();

Mthodes :

ResultSet executeQuery(String) : excute la requte prsente dans le String et retourne un ensemble denregistrements (ResultSet) ; utilise pour SELECT int executeUpdate(String) : excute la requte prsente dans le String et retourne le nombre denregistrements traits (ou 0 pour instructions du LDD) ; utilise pour INSERT, UPDATE, DELETE (LMD), CREATE, ALTER, DROP (LDD)

23 dcembre 2010

NFA011

116

M. Crucianu

58

CNAM Paris - NFA011

23/12/2010

Interface Statement (2)

Mthodes (suite) :

boolean execute(String) : excute la requte prsente dans le String, retourne true si cest un SELECT et false sinon ; employe dans des cas particuliers Connection getConnection() : retourne la connexion correspondante void setMaxRows(int) : borne suprieure sur le nombre denregistrements extraire par toute requte de linstance int getUpdateCount() : nombre denregistrements affects par la dernire instruction SQL associe (-1 si SELECT ou si linstruction na affect aucun enregistrement) void close() : fermeture de linstance

23 dcembre 2010

NFA011

117

Curseurs statiques

Le rsultat dune requte est disponible dans une instance de classe qui implmente linterface ResultSet (quivalent des curseurs PL/SQL) Mthodes de ResultSet :

boolean next() : positionnement sur lenregistrement suivant ; retourne false quand il ny a plus denregistrements getXXX(int) : retourne la colonne de numro donn par largument int et de type XXX de lenregistrement courant updateXXX(int, XXX) : dans lenregistrement courant, donne la colonne de numro int et de type XXX, une valeur de type XXX void close() : fermeture de linstance

Linstance est automatiquement ferme quand le Statement correspondant est ferm ou associ une autre instruction SQL
NFA011 118

23 dcembre 2010

M. Crucianu

59

CNAM Paris - NFA011

23/12/2010

Curseurs statiques : exemple


int delCount; Statement stmt1 = connexion.createStatement(); Statement stmt2 = connexion.createStatement(); ResultSet rset = stmt1.executeQuery(SELECT Nom FROM pilote); while (rset.next()) System.out.println(rset.getString(1)); rset.close(); stmt1.close(); delCount = stmt2.executeUpdate(DELETE FROM vol WHERE Ville_depart = Paris); stmt2.close();
23 dcembre 2010 NFA011 119

Curseurs navigables

Les options du curseur sont dclares comme paramtres de la mthode createStatement :


createStatement(int typeRSet, int modifRSet)

Types possibles (selon paramtre typeRSet) : ResultSet.TYPE_FORWARD_ONLY : non navigable (valeur par
dfaut)

ResultSet.TYPE_SCROLL_INSENSITIVE : navigable mais insensible aux modifications, cest dire ne reflte pas les modifications de la base ResultSet.TYPE_SCROLL_SENSITIVE : navigable et sensible aux modifications (reflte les modifications de la base)
NFA011 120

23 dcembre 2010

M. Crucianu

60

CNAM Paris - NFA011

23/12/2010

Curseurs navigables (2)

Quelques mthodes spcifiques :


int getType() : retourne le type de navigabilit du curseur void setFetchDirection(int) : dfinit la direction du parcours

valeurs du paramtre : ResultSet.FETCH_FORWARD, ResultSet.FETCH_BACKWARD, ResultSet.FETCH_UNKNOWN est aussi mthode de Statement, ayant dans ce cas effet sur tous les curseurs associs !

int getFetchDirection() : retourne la direction courante boolean isBeforeFirst() : indique si le curseur est positionn avant le premier enregistrement (true aprs ouverture, sauf si aucun enregistrement)
NFA011 121

23 dcembre 2010

Curseurs navigables (3)

Quelques mthodes spcifiques (suite) :

void beforeFirst() : positionne le curseur avant le premier enregistrement boolean isFirst() : indique si le curseur est positionn sur le premier enregistrement ; si aucun enregistrement : false boolean absolute(int) : positionne le curseur sur lenregistrement de numro indiqu (depuis dbut si >0, depuis fin si <0) ; false si aucun enregistrement na ce numro boolean relative(int) : positionne le curseur sur le nime enregistrement en partant de la position courante (>0 ou <0) ; false si aucun enregistrement na cette position

23 dcembre 2010

NFA011

122

M. Crucianu

61

CNAM Paris - NFA011

23/12/2010

Curseurs navigables : exemple


Statement stmt = connexion.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rset = stmt.executeQuery(SELECT Nom FROM pilote); if(rset.absolute(5)) { System.out.println(5me pilote : + rset.getString(1)); if(rset.relative(2)) System.out.println(7me pilote : + rset.getString(1)); else System.out.println(Echec, pas de 7me pilote !); } else System.out.println(Echec, pas de 5me pilote !);

23 dcembre 2010

NFA011

123

Curseurs modifiables

Permettent de modifier le contenu de la base Types possibles (selon paramtre modifRSet) : ResultSet.CONCUR_READ_ONLY : nautorise pas la
modification (valeur par dfaut)

ResultSet.CONCUR_UPDATABLE : autorise la modification Pas de verrouillage automatique comme avec CURSOR IS SELECT FOR UPDATE dans PL/SQL ! Seules les requtes qui extraient des colonnes sont autorises produire des curseurs modifiables (SELECT tableau.* plutt que SELECT *, pas de AVG(), ) ; aussi, pas de jointure dans la requte !
NFA011 124

Contraintes dutilisation :

23 dcembre 2010

M. Crucianu

62

CNAM Paris - NFA011

23/12/2010

Curseurs modifiables (2)

Quelques mthodes spcifiques :

int getConcurrency() : retourne la valeur du paramtre dautorisation des modifications void deleteRow() : suppression enregistrement courant void updateRow() : propagation la table des modifications de lenregistrement courant void cancelRowUpdates() : annulation des modifications de lenregistrement courant void moveToInsertRow() : prparation du curseur pour insertion dun enregistrement void insertRow() : propagation la table de linsertion void moveToCurrentRow() : retourne lenregistrement courant
NFA011 125

23 dcembre 2010

Curseurs modifiables : exemple 1


// Exemple de suppression connexion.setAutoCommit(false); Statement stmt = connexion.createStatement (ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet rset = stmt.executeQuery(SELECT Nom FROM pilote); String nomsAEffacer = Philippe; while(rset.next()) { if(rset.getString(1).equals(nomsAEffacer)) { rset.deleteRow(); connexion.commit(); // valide une suppression } } // connexion.commit(); // regroupe les suppressions rset.close();
23 dcembre 2010 NFA011 126

M. Crucianu

63

CNAM Paris - NFA011

23/12/2010

Curseurs modifiables : exemple 2


// Exemple dinsertion Statement stmt = connexion.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rset = stmt.executeQuery(SELECT Matricule, Nom, Ville, Age, Salaire FROM pilote); if(rset.absolute(3)) System.out.println(rset.getString(2)); rset.moveToInsertRow(); rset.updateInt(1,3); rset.updateString(2,Philippe); rset.updateString(3,Paris); rset.updateInt(4,36); rset.updateFloat(5,38000); rset.insertRow(); // demande linsertion dune ligne connexion.commit(); // valide linsertion rset.moveToCurrentRow();
23 dcembre 2010 NFA011 127

Curseurs modifiables : exemple 3


// Exemple de modification Statement stmt = connexion.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rset = stmt.executeQuery(SELECT Nom FROM pilote); while(rset.next()) { if(rset.getString(1).equals(Philipe)) { rset.updateString(1,Philippe); rset.updateRow(); // demande la modification } } connexion.commit(); // valide la modification rset.close();
23 dcembre 2010 NFA011 128

M. Crucianu

64

CNAM Paris - NFA011

23/12/2010

Interface PreparedStatement

Pourquoi : meilleure efficacit (analyse + compilation + planification une seule fois, nombreuses excutions) Cration :
PreparedStatement prepStmt = connexion.prepareStatement(String instrSQL);

PreparedStatement hrite de Statement

Mthodes :

ResultSet executeQuery() : excute la requte prpare et retourne un ensemble denregistrements (ResultSet) ; pour SELECT int executeUpdate() : excute la requte prpare et retourne le nombre denregistrements traits (ou 0 pour instructions du LDD) ; pour INSERT, UPDATE, DELETE (LMD), CREATE, ALTER, DROP (LDD)
NFA011 129

23 dcembre 2010

Interface PreparedStatement (2)

Mthodes (suite) :

boolean execute() : excute la requte prpare, retourne true si cest un SELECT et false sinon ; employe dans des cas particuliers Connection getConnection() : retourne la connexion correspondante void setMaxRows(int) : borne suprieure sur le nombre denregistrements extraire par toute requte de linstance int getUpdateCount() : nombre denregistrements traits par la dernire instruction SQL associe (-1 si SELECT ou si linstruction na affect aucun enregistrement) void close() : fermeture de linstance

23 dcembre 2010

NFA011

130

M. Crucianu

65

CNAM Paris - NFA011

23/12/2010

PreparedStatement : exemple 1
String instrSQL = SELECT Nom FROM pilote; PreparedStatement prepStmt1 = connexion.prepareStatement(instrSQL); ResultSet rset = prepStmt1.executeQuery(); while (rset.next()) System.out.println(rset.getString(1)); rset.close(); prepStmt1.close();
23 dcembre 2010 NFA011 131

Paramtrage PreparedStatement

Dans la chane de caractres qui reprsente linstruction SQL on indique par ? les champs paramtrs Avant lexcution il faut donner des valeurs aux paramtres par des mthodes setXXX de PreparedStatement : prepStmt.setXXX(numeroPar, valeurPar), o numeroPar est la position du ? correspondant et XXX est le type du paramtre Donner la valeur NULL un paramtre :
prepStmt.setNull(numeroPar, typePar)

23 dcembre 2010

NFA011

132

M. Crucianu

66

CNAM Paris - NFA011

23/12/2010

PreparedStatement : exemple 2
int insCount; String instrSQL = INSERT INTO avion VALUES(?,?,?,?); PreparedStatement prepStmt2 = connexion.prepareStatement(instrSQL); prepStmt2.setInt(1,210); prepStmt2.setInt(2,570); prepStmt2.setString(3,A800); prepStmt2.setString(4,Roissy); insCount = prepStmt2.executeUpdate(); prepStmt2.close();
23 dcembre 2010 NFA011 133

Interface CallableStatement

Objectif : appeler des procdures ou fonctions stockes crites en PL/SQL ou un autre langage Cration :
CallableStatement callStmt = connexion.prepareCall(String prepCall); CallableStatement hrite de PreparedStatement

Mthodes :

boolean execute() : voir PreparedStatement Void registerOutParameter(int,int) : dfinit un paramtre de sortie de la procdure appele ; le premier int indique le numro du paramtre lors de lappel, le second indique le type du paramtre (suivant java.sql.Types)
NFA011 134

23 dcembre 2010

M. Crucianu

67

CNAM Paris - NFA011

23/12/2010

Interface CallableStatement (2)

Mthodes (suite) :

void setXXX(int, XXX) : donner une valeur un paramtre ; int est la position du paramtre et XXX son type XXX getXXX(int) : extraire la valeur dun paramtre de sortie (OUT) ; int est la position du paramtre boolean wasNull() : dtermine si la valeur du dernier paramtre de sortie extrait est NULL ; utilisable aprs un get void close() : fermeture de linstance

23 dcembre 2010

NFA011

135

Formats des appels

Format du String pour un appel de procdure stocke :


{call nomProcedure(?,)}

Format du String pour un appel de fonction stocke :


{? = call nomFonction(?,)}

Pour une fonction, la valeur retourne est vue comme paramtre 1 : dclar avec registerOutParameter, rcupr avec getXXX

23 dcembre 2010

NFA011

136

M. Crucianu

68

CNAM Paris - NFA011

23/12/2010

CallableStatement : exemple 1

Procdure PL/SQL appele :


PROCEDURE accordPrime(villePrime IN pilote.Ville%TYPE, valPrime IN NUMBER, nbPilotes OUT INTEGER);

Appel en Java :
String prepCall = {call accordPrime(?,?,?)}; CallableStatement callStmt = connexion.prepareCall(prepCall); callStmt.setString(1,Paris); callStmt.setInt(2,500); callStmt.registerOutParameter(3, java.sql.Types.INTEGER); callStmt.execute(); nbPilotePrimes = callStmt.getInt(3); callStmt.close();

23 dcembre 2010

NFA011

137

CallableStatement : exemple 2

Fonction PL/SQL appele :


FUNCTION moyInt(ageInf IN pilote.Age%TYPE, ageSup IN pilote.Age%TYPE) RETURN pilote.Salaire%TYPE;

Appel en Java :
String prepCall = {? = call moyInt(?,?)}; CallableStatement callStmt = connexion.prepareCall(prepCall); callStmt.registerOutParameter(1,java.sql.Types.NUMBER); callStmt.setInt(2,38); callStmt.setInt(3,55); callStmt.execute(); moyenneSalaires = callStmt.getInt(1); // rsultat callStmt.close();

23 dcembre 2010

NFA011

138

M. Crucianu

69

CNAM Paris - NFA011

23/12/2010

Mta-donnes

Objectif : retrouver les proprits dune base de donnes et de ses tables Interface DatabaseMetaData : retrouver lidentification de lditeur et de la version, la description des tables prsentes, utilisateurs connects, etc. Interface ResultSetMetaData : pour les tables auxquelles des Statement ou PreparedStatement ont accd, retrouver les nombres, noms, types et autre caractristiques des colonnes

23 dcembre 2010

NFA011

139

Mthodes de DatabaseMetaData

String getDatabaseProductName() : retourne le nom de lditeur du SGBD qui a servi crer la base String getDatabaseProductVersion() : retourne le numro de version du SGBD ResultSet getTables(String, String, String, String[]) : retourne une description de toutes les

tables de la base

String getUserName() : retourne le nom de lutilisateur

connect

boolean supportsSavepoints() : retourne true si la base supporte les points de validation pour les transactions
NFA011 140

23 dcembre 2010

M. Crucianu

70

CNAM Paris - NFA011

23/12/2010

Mthodes de ResultSetMetaData

int getColumnCount() : retourne le nombre de

colonnes de la table

String getColumnName(int) : retourne le nom de la

colonne int

int getColumnType(int) : retourne le type de la colonne int (suivant java.sql.Types) String getColumnTypeName(int) : retourne le nom du type de la colonne int int isNullable(int) : indique si la colonne int accepte des valeurs NULL int getPrecision(int) : indique le nombre de chiffres aprs la virgule pour la colonne int
NFA011 141

23 dcembre 2010

Exceptions

Classe SQLException qui hrite de la classe Java


Exception

Mthodes de SQLException :

String getMessage() : retourne le message dcrivant lerreur String getSQLState() : retourne le code derreur SQL

standard

int getErrorCode() : retourne le code derreur SQL du

SGBD

SQLException getNextException() : retourne lexception

suivante si plusieurs ont t leves

23 dcembre 2010

NFA011

142

M. Crucianu

71

CNAM Paris - NFA011

23/12/2010

Exceptions : exemple
try { Connection connexion = DriverManager.getConnection(); String instrSQL = INSERT INTO avion VALUES(?,?,?,?); PreparedStatement prepStmt = connexion.prepareStatement(instrSQL); prepStmt.executeUpdate(); prepStmt.close(); } catch (SQLException excSQL) { while (excSQL != NULL) { System.err.println(excSQL.getMessage()); excSQL = excSQL.getNextException(); } }
23 dcembre 2010 NFA011 143

Transactions

Gestion des transactions avec JDBC :

Par dfaut : chaque instruction SQL excute constitue une transaction (commit implicite) ; ce mode peut tre dsactiv avec nomConnexion.setAutoCommit(false); quand ce mode est dsactiv, lexcution dune instruction du LDD ou la fermeture dune connexion valident implicitement la transaction

Explicite : les mthodes commit et rollback de Connection doivent tre utilises

23 dcembre 2010

NFA011

144

M. Crucianu

72

CNAM Paris - NFA011

23/12/2010

Transactions : points de validation


Objectif : rendre possible lannulation dune partie des oprations ( partir de JDBC 3.0) Mthodes correspondantes de Connection :

Savepoint setSavepoint(NomPoint) : insertion point de validation intermdiaire ; si anonyme, NomPoint est absent void releaseSavepoint(NomPoint) : supprime le point de validation intermdiaire void rollback(nomPoint) : retour ltat davant nomPoint int getSavepointId(Savepoint) : retourne lidentifiant

Mthodes de linterface Savepoint :

(entier) du point (pour les points anonymes)

String getSavepointName(Savepoint) : retourne le nom du

point (vide si le point est anonyme)


23 dcembre 2010 NFA011 145

Transactions : exemple
connexion.setAutoCommit(false); int insCount; String instrSQL = INSERT INTO avion VALUES(?, 250, A400, Garches); PreparedStatement prepStmt = connexion.prepareStatement(instrSQL); prepStmt.setInt(1,210); insCount = prepStmt.executeUpdate(); prepStmt.setInt(1,211); insCount = prepStmt.executeUpdate(); connexion.commit(); prepStmt.close();
23 dcembre 2010 NFA011 146

M. Crucianu

73

CNAM Paris - NFA011

23/12/2010

Procdures et fonctions stockes Java


Procdure/fonction stocke Java = mthode compile (byte-code), stocke avec la base et excute par la JVM tapes :
1. Programmation de la classe qui contient la mthode vise :
public class NomClasse { public static TypeJava nomMethode(paramtres) { } }

2. Compilation de la classe (vrifier dabord CLASSPATH)


javac NomClasse.java

3. Chargement dans la base de la ressource Java contenant la classe :


loadjava user nom/motdepasse NomClasse.class

(on peut charger aussi des archives .jar, des fichiers sources .java)
23 dcembre 2010 NFA011 147

Procdures et fonctions stockes Java

tapes (suite) :
4. Publication de la mthode Java comme une procdure ou fonction stocke PL/SQL :
CREATE [OR REPLACE] { FUNCTION nomFonction (paramtres) RETURN TypeSQL | PROCEDURE nomProcedure (paramtres) } { IS | AS } LANGUAGE JAVA NAME NomClasse.nomMethode(paramtres) [return TypeJava];

5. Appel de la mthode :

partir de linterface SQL*Plus : VARIABLE nomVariableGlobale TypeSQL; SET SERVEROUTPUT ON SIZE 10000 CALL DBMS_JAVA.SET_OUTPUT(10000); CALL nomFonction(paramtres) INTO :nomVariableGlobale; CALL nomProcedure(paramtres);
NFA011 148

23 dcembre 2010

M. Crucianu

74

CNAM Paris - NFA011

23/12/2010

Procdures et fonctions stockes Java

partir de SQL (pour les fonctions) : SELECT FROM WHERE nomColonne = nomFonction(paramtres);

Comme un dclencheur : CREATE [OR REPLACE] TRIGGER nomDeclencheur {BEFORE | AFTER | INSTEAD OF} {DELETE | INSERT | UPDATE [OF colonne 1, ] [OR ]} ON {nomTable | nomVue} [FOR EACH ROW] BEGIN nomProcedure(paramtres); END;

partir dun programme PL/SQL : comme toute fonction ou procdure catalogue partir dun programme Java : avec CallableStatement (comme toute fonction ou procdure catalogue)
NFA011 149

23 dcembre 2010

Procdures et fonctions stockes Java

Si un paramtre de la procdure/fonction Java stocke est dclar OUT ou IN OUT, il doit correspondre en Java un tableau 1 lment (exemple : float[] table;) et la valeur transmise est celle dindice 0 (table[0]) Communication de la procdure/fonction Java stocke avec la base :

Par dfaut, pilote JDBC interne :


Connection connexion = DriverManager.getConnection (jdbc:default:connection:);

Dautres connexions peuvent tre tablies avec un autre schma que celui de lutilisateur appelant la procdure (ou avec une autre base), en utilisant explicitement dautres pilotes
NFA011 150

23 dcembre 2010

M. Crucianu

75

CNAM Paris - NFA011

23/12/2010

Procdures et fonctions externes Java


Procdure/fonction externe Java = mthode compile (byte-code), excute par la JVM, mais non stocke avec la base tapes :
1. Programmation de la classe qui contient la mthode vise 2. Compilation de la classe, le rsultat tant plac dans un rpertoire repertoireClasse (en gnral externe aux rpertoires Oracle) 3. Cration dune librairie :
CREATE DIRECTORY repProcExternes AS repertoireClasse;

4. Chargement de la classe :
CREATE JAVA CLASS USING BFILE(repProcExternes, NomClasse.class);

5. Publication : comme pour une procdure/fonction stocke Java 6. Appel : comme pour une procdure/fonction stocke Java
23 dcembre 2010 NFA011 151

Insuffisances de JDBC

API de bas niveau, qui exige une bonne connaissance de SQL et de la base avec laquelle il faut travailler Aucun contrle avant excution pour

La validit syntaxique des instructions SQL transmises La bonne correspondance entre ces instructions et la structure des tables

mise au point difficile des programmes

Indpendance relative du SGBDR utilis

23 dcembre 2010

NFA011

152

M. Crucianu

76

CNAM Paris - NFA011

23/12/2010

SQLJ

Principe : API au-dessus de JDBC, qui permet linclusion directe dinstructions SQL dans le code Java et, grce un prcompilateur, les traduit en appels des mthodes JDBC Le pr-compilateur assure galement la vrification de la validit des instructions SQL (par rapport un SGBDR particulier, chaque SGBDR aura donc son pr-compilateur SQLJ mais le code SQLJ sera plus portable !) Contrainte : les instructions SQL utilises doivent tre connues lors de lcriture du programme (alors que JDBC permet de les construire dynamiquement) ; Oracle propose une solution propritaire qui vite cette contrainte
NFA011 153

23 dcembre 2010

Environnement et connexions

Environnement : CLASSPATH doit inclure

Pr-compilateur : Oracle_home/sqlj/lib/translator.jar (ou .zip) JDK : Oracle_home/sqlj/lib/classes11.jar (ou .zip), Oracle_home/sqlj/lib/classes12.jar (ou .zip) Pilote JDBC : Oracle_home/sqlj/lib/runtime11.jar (ou .zip), Oracle_home/sqlj/lib/runtime12.jar (ou .zip)

Connexion : fichier connect.properties


sqlj.url = jdbc:oracle:thin:@odessa:1521:NFA011 sqlj.user = Julien sqlj.password = monpass

23 dcembre 2010

NFA011

154

M. Crucianu

77

CNAM Paris - NFA011

23/12/2010

Introduction de SQL dans Java

Introduction dinstructions SQL :


#sql{CREATE TABLE avion (Numav INTEGER, Capacite INTEGER, Type VARCHAR2, Entrepot VARCHAR2)}; #sql{INSERT INTO avion VALUES (14, 25, A400, Garches)};

Introduction de blocs PL/SQL :


#sql{ [DECLARE ] BEGIN [EXCEPTION ] END; };

23 dcembre 2010

NFA011

155

Affectation et extraction

Affectation dune valeur une variable Java (traite dans SQL comme variable hte) :
#sql{SET :variableJava = expression};

Exemple :
#sql{SET :dateJava = SYSDATE};

Extraction dun seul enregistrement :


#sql{SELECT col1, INTO :var1Java, FROM listeTables WHERE condition};

Exemple :
#sql{SELECT Ville_arrivee INTO :villeArrivee FROM vol WHERE Numvol = :numVolAller};
23 dcembre 2010 NFA011 156

M. Crucianu

78

CNAM Paris - NFA011

23/12/2010

Extraire plusieurs enregistrements

Avec une instance de ResultSet comme variable hte :


ResultSet rset; #sql{ BEGIN OPEN :OUT rset FOR SELECT Ville_arrivee FROM vol; END; }; while(rset.next())

Avec un itrateur SQLJ (exploitable directement en SQL ou en Java travers son ResultSet) :
#sql iterator nomTypeIterateur (type1 col1,); nomTypeIterateur nomIterateur; #sql nomIterateur = {SELECT }; nomIterateur.close();

23 dcembre 2010

NFA011

157

Appels de sous-programmes

Appel de fonction stocke :


#sql :variableJava = {VALUES(nomFonction(parametres))};

Appel de procdure stocke :


#sql{CALL nomProcedure(parametres)};

Les paramtres effectifs sont des expressions qui peuvent inclure des variables Java comme variables htes :
:IN numVolAller, :OUT villeArrivee,

23 dcembre 2010

NFA011

158

M. Crucianu

79

CNAM Paris - NFA011

23/12/2010

Autres API Java SGBDR

JDO (Java Data Objects) : possibilit de rendre persistants (de faon transparente) des objets Java ; le support de la persistance est assur par un SGBDR, un SGBDO, des fichiers ordinaires, etc. JavaBlend : correspondance automatique relationnel objet ; par exemple, classe Java table et instance de classe enregistrement Serveurs dapplication EJB (Enterprise Java Beans)

23 dcembre 2010

NFA011

159

Relationnel Objet

Modle relationnel et modle objet Comment intgrer les aspects relationnels et objet ? Intgration ou interfaage ? JDO (Java Data Objects) et les objets persistants Frameworks qui emploient la persistance

Exemple de Hibernate

NSY135 Applications orientes donnes - patrons, frameworks, ORM - au second semestre, enseigne par Philippe Rigaux
23 dcembre 2010 NFA011 160

M. Crucianu

80

CNAM Paris - NFA011

23/12/2010

Modle relationnel

Points forts

Reprsentation relationnelle conceptuellement simple et bien adapte aux applications de gestion Grande maturit du modle et des SGBDR (optimisation, gestion des transactions) Pas de support direct (dans le modle) dattributs dont les valeurs ont une structure interne Pas de support pour lencapsulation car sparation entre donnes et traitements

Points faibles

Modle largement dominant dans les bases de donnes


NFA011 161

23 dcembre 2010

Modle objet

Points forts

Support dobjets complexes (qui prsentent une structure interne) Hritage, permettant la dfinition de traitements gnriques Encapsulation grce lintgration entre donnes et traitements Modlisation plus complexe Support plus difficile doprations doptimisation Transition difficile du tout relationnel au tout objet

Points faibles

Modle largement dominant dans le dveloppement dapplications


NFA011 162

23 dcembre 2010

M. Crucianu

81

CNAM Paris - NFA011

23/12/2010

Intgrer les aspects relationnels et objet

Extension des SGDBR et du langage ( SQL3) pour inclure des aspects du modle objet
+ Types dfinis par lutilisateur (Abstract Data Types) incluant des mthodes ( donnes complexes, encapsulation)

Rfrences dobjets types rcursifs (par ex. nuds darbres)

+ Hritage : types dfinis par lutilisateur, tables + Prservation de mcanismes performants dans les SGBDR : optimisation, gestion des transactions Absence de support thorique complet Diffrences syntaxiques importantes entre diteurs de SGBD Interrogation : prise en compte partielle des aspects objet mentionns
23 dcembre 2010 NFA011 163

Types dfinis par lutilisateur

Cration de type
CREATE OR REPLACE TYPE DESCTECHAVION AS OBJECT ( SERIEMODELE NUMBER(10), FICHETECHNIQUE VARCHAR(1024), FICHEMAINTENANCE VARCHAR(1024), FICHESECURITE VARCHAR(1024))

Affichage dun type


DESC DESCTECHAVION;

Destruction dun type


DROP TYPE DESCTECHAVION;

Des instances persistantes ou non peuvent tre cres et utilises dans un programme PL/SQL
NFA011 164

23 dcembre 2010

M. Crucianu

82

CNAM Paris - NFA011

23/12/2010

Types dfinis par lutilisateur (2)

Table avec attribut un type dfini par lutilisateur


CREATE TABLE avions ( NUMAV NUMBER(4), CAPACITE NUMBER(4), TYPE VARCHAR(10), ENTREPOT VARCHAR(10), DESCTECH DESCTECHAVION);

Insertion
INSERT INTO avions VALUES (25, 250, A320, Garches, DESCTECHAVION(3205520012, STX34V55, GV22FDT45667B, EUS0955VAP12));

Interrogation
SELECT NUMAV, a.DESCTECH.SERIEMODELE FROM avions a;

23 dcembre 2010

NFA011

165

Types dfinis par lutilisateur (3)

Table avec lignes de type dfini par lutilisateur


CREATE TABLE descriptionstechniques OF DESCTECHAVION ( CONSTRAINT descPK PRIMARY KEY (SERIEMODELE));

Insertion
INSERT INTO descriptionstechniques VALUES (3205520012, STX34V55, GV22FDT45667B, EUS0955VAP12);

Interrogation
SELECT SERIEMODELE, FICHESECURITE FROM descriptionstechniques;

23 dcembre 2010

NFA011

166

M. Crucianu

83

CNAM Paris - NFA011

23/12/2010

Types dfinis par lutilisateur (4)

Extraction valeurs des membres dun objet


SELECT VALUE(d) FROM descriptionstechniques d;

Affectation des valeurs des membres dun objet


DECLARE description DESCTECHAVION; BEGIN SELECT VALUE(d) INTO description FROM descriptionstechniques d WHERE SERIEMODELE = 3205520012;

23 dcembre 2010

NFA011

167

Hritage

Cration de super-classe et classe drive


CREATE OR REPLACE TYPE DESCTECHAVION AS OBJECT ( ) NOT FINAL / CREATE OR REPLACE TYPE DESCTECHAVIONMARCHANDISES UNDER DESCTECHAVION ( FICHECHARGEMENT VARCHAR(1024), FICHEDOUANIERE VARCHAR(1024)) /

23 dcembre 2010

NFA011

168

M. Crucianu

84

CNAM Paris - NFA011

23/12/2010

Hritage (2)

Utilisation

Une instance de sous-classe peut tre affecte une variable du type de la super-classe Une rfrence du type de la super-classe peut pointer vers une instance de la sous-classe

INSERT INTO descriptionstechniques VALUES (DESCTECHAVIONMARCHANDISES (3205520012, STX34V55, GV22FDT45667B, EUS0955VAP12, LU3202005680, USE428065)); SELECT TREAT(DESCTECHAVION AS DESCTECHAVIONMARCHANDISES) FROM avions;

23 dcembre 2010

NFA011

169

Rfrences dobjets
CREATE TABLE avionsCpct ( NUMAV NUMBER(4), CAPACITE NUMBER(4), TYPE VARCHAR(10), ENTREPOT VARCHAR(10), REFDESCTECH REF DESCTECHAVION);

Insertion
INSERT INTO avionsCpct VALUES (25, 250, A320,Garches, (SELECT REF(d) FROM descriptionstechniques d WHERE d.SERIEMODELE = 3205520012));

Interrogation
SELECT a.NUMAV FROM avionsCpct a WHERE a.REFDESCTECH.SERIEMODELE = 3205520012; SELECT a.REFDESCTECH.SERIEMODELE FROM avionsCpct a WHERE a.NUMAV = 25; SELECT DEREF(REFDESCTECH) FROM avionsCpct WHERE NUMAV = 25;

23 dcembre 2010

NFA011

170

M. Crucianu

85

CNAM Paris - NFA011

23/12/2010

Mthodes avec PL/SQL

Spcification CREATE OR REPLACE TYPE DESCTECHAVION AS OBJECT ( SERIEMODELE NUMBER(10), MEMBER PROCEDURE UpdateFicheMaintenance (), STATIC FUNCTION CheckAllDesc RETURN BOOLEAN, CONSTRUCTOR FUNCTION DESCTECHAVION ( ) RETURN SELF AS RESULT) Implmentation CREATE TYPE BODY DESCTECHAVION AS MEMBER PROCEDURE IS BEGIN END; STATIC FUNCTION IS BEGIN END; CONSTRUCTOR FUNCTION DESCTECHAVION () RETURN SELF AS RESULT IS BEGIN END; END;
NFA011 171

23 dcembre 2010

Mthodes avec PL/SQL (2)

Appel depuis PL/SQL


DECLARE ficheMaj DESCTECHAVION; ficheCourante DESCTECHAVION; BEGIN IF CheckAllDesc() THEN ficheMaj.UpdateFicheMaintenance(); ficheCourante := NEW DESCTECHAVION(); END IF; END;

23 dcembre 2010

NFA011

172

M. Crucianu

86

CNAM Paris - NFA011

23/12/2010

Hibernate

Framework : bibliothques, guide architectural et conventions pour faciliter le dveloppement dapplications Persistance des donnes : conservation des donnes entre diffrentes excution dun programme Hibernate : framework open source pour le mapping objetrelationnel (Object Relational Mapping, ORM)

Dfinition dclarative de correspondances (mapping) entre des objets et une base de donnes relationnelle Les changes entre lapplication et la base sont assurs grce la persistance des objets, prcise par le mapping les programmeurs peuvent viter le dtail des changes Environnement Web lger (ex. Apache Tomcat) ou environnement J2EE complet (ex. JBoss Application Server)

23 dcembre 2010

NFA011

173

Hibernate : architecture
Architecture lgre Architecture complte

(schmas issus de la doc. de rfrence Hibernate 2.1.8) 23 dcembre 2010 NFA011 174

M. Crucianu

87

CNAM Paris - NFA011

23/12/2010

Hibernate : exemple configuration

Fichier de configuration XML (hibernate.cfg.xml)

<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <!- 1 SessionFactory = 1 base de donnes --> <property name="connection.datasource">java:comp/env/jdbc/quickstart </property> <!- adresse JNDI pour le pool de connexions --> <property name="show_sql">false</property> <!- sans log SQL --> <property name="dialect">net.sf.hibernate.dialect.PostgreSQLDialect </property> <!-- fichiers de mapping --> <mapping resource="Cat.hbm.xml"/> <!- mapping classe Cat --> </session-factory> </hibernate-configuration> (exemple issu de la documentation de rfrence Hibernate 2.1.8)
23 dcembre 2010 NFA011 175

Hibernate : exemple classe persistante


package net.sf.hibernate.examples.quickstart; // classe de type Plain Old Java Objects (POJO) public class Cat { private String id; private String name; public Cat() { } public String getId() { return id; } private void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
23 dcembre 2010 NFA011 176

M. Crucianu

88

CNAM Paris - NFA011

23/12/2010

Hibernate : exemple fichier mapping


<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <!- fichier Cat.hbm.xml --> <class name="net.sf.hibernate.examples.quickstart.Cat" table="CAT"> <!-- cl 32 caractres hexadcimaux, gnre par Hibernate --> <id name="id" type="string" unsaved-value="null" > <column name="CAT_ID" sql-type="char(32)" not-null="true"/> <generator class="uuid.hex"/> </id> <!-- nom qui ne doit pas tre trop long --> <property name="name"> <column name="NAME" length="16" not-null="true"/> </property> </class> </hibernate-mapping>
23 dcembre 2010 NFA011 177

Hibernate : exemple dutilisation


A partir des mapping, le schma de la base peut tre gnr automatiquement (LDD SQL) par l'outil SchemaExport d'Hibernate Cration objet persistant (note : HibernateUtil est ici une classe utilisateur) SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Cat princesse = new Cat(); princesse.setName("Princesse"); session.save(princesse); tx.commit(); HibernateUtil.closeSession();

23 dcembre 2010

NFA011

178

M. Crucianu

89

CNAM Paris - NFA011

23/12/2010

Hibernate : exemple dutilisation (2)

Rcupration depuis la base dobjets persistants, avec HQL


Transaction tx = session.beginTransaction(); nChats = 0; catName = Princesse; Query query = session.createQuery("select c from Cat as c where c.name = :nom"); query.setCharacter("nom", chatNom); for (Iterator it = query.iterate(); it.hasNext(); nChats++) { Cat chat = (Cat) it.next(); // autres oprations } out.println(nChats + " chats de nom " + chatNom); tx.commit();

NSY135 Applications orientes donnes - patrons, frameworks, ORM - au second semestre, enseigne par Philippe Rigaux
23 dcembre 2010 NFA011 179

M. Crucianu

90

Vous aimerez peut-être aussi