Vous êtes sur la page 1sur 83

Oracle PL/SQL

Auteur : Clotilde Attouche Version 1.1 Du 6 Mars 2010

www.tellora.fr

Oracle PL/SQL www.tellora.fr

Sommaire
1 2 3 La base de donnes Oracle 11g .................................................................................... 5 La documentation ...................................................................................................... 10 Les Outils daccs la base ....................................................................................... 11 1.1 1.2
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5

Loutil iSQL*Plus .............................................................................................. 11 Loutil SQL*Plus ............................................................................................... 12


Environnement de travail ........................................................................................ 13 Le prompt SQL*Plus ............................................................................................... 15 Quelques commandes SQL*Plus ............................................................................ 16 Gnrer un fichier rsultat appel spool .......................................................... 16 Dclarer un diteur ................................................................................................. 17

1.3 4 5

Utilisation de paramtres ................................................................................... 17

Le dictionnaire de donnes ........................................................................................ 18 La base Exemple ........................................................................................................ 20


1.3.1 1.3.2 1.3.3 1.3.4 Modle Conceptuel de Donnes Tahiti ..................................................................... 20 Les contraintes dintgrit ...................................................................................... 21 Rgles de passage du MCD au MPD ......................................................................... 21 Modle Physique de donnes Tahiti : ...................................................................... 22

Le langage SQL .......................................................................................................... 23 1.4 1.5 Notion de schema ............................................................................................. 23 Rgles de nommage .......................................................................................... 23 Structure dun programme P/SQL ........................................................................ 24 Les diffrentes types de donnes ......................................................................... 25
Conversion implicite ............................................................................................... 26 Conversion explicite................................................................................................ 26

Le langage PL/SQL .................................................................................................... 24 1.6 1.7


1.7.1 1.7.2

1.8 1.9 8 1.10 1.11 1.12 1.13 1.14 1.15 9 10

Les variables et les constantes ............................................................................ 26 Les structures................................................................................................... 27 Condition ......................................................................................................... 28 Itration .......................................................................................................... 28 Lexpression CASE ............................................................................................. 29 Expression GOTO .............................................................................................. 31 Expression NULL ............................................................................................... 32 Gestion de laffichage ........................................................................................ 33

Les instructions de bases ........................................................................................... 28

Tables et tableaux ..................................................................................................... 34 Les curseurs ........................................................................................................... 36

Page 2/83

Oracle PL/SQL www.tellora.fr

1.16 1.17 1.18 1.19 1.20 11 1.21 1.22 1.23 1.24 1.25 1.26 12 13

Oprations sur les curseurs ................................................................................ 36 Attributs sur les curseurs ................................................................................... 38 Exemple de curseur ........................................................................................... 38 Exemple de curseur avec BULK COLLECT .............................................................. 39 Variables curseur .............................................................................................. 40 Implmenter des exceptions utilisateurs ............................................................... 43 Implmenter des erreurs Oracle .......................................................................... 45 Fonctions pour la gestion des erreurs ................................................................... 47 Exemples de programmes PL/SQL ....................................................................... 48 Compilation native du code PL/SQL...................................................................... 49 Transactions autonomes .................................................................................... 50

Les exceptions ........................................................................................................ 42

Procdures, Fonctions et Packages ......................................................................... 54 Procdures ............................................................................................................. 55


1.26.1 Crer une procdure .............................................................................................. 55

1.27 1.28 14 15 16 1.29

Modifier une procdure ...................................................................................... 57 Correction des erreurs ....................................................................................... 57 Crer une fonction ............................................................................................ 60

Fonctions ................................................................................................................ 60 Packages ................................................................................................................ 62 Triggers .................................................................................................................. 66 Crer un trigger ................................................................................................ 67 Activer un trigger .............................................................................................. 71 Supprimer un Trigger ........................................................................................ 71 Triggers rattach aux vues ................................................................................. 72 Triggers sur vnements systmes ...................................................................... 72 Procdures stockes JAVA .................................................................................. 77 Procdures externes .......................................................................................... 77
Ordres partags ..................................................................................................... 77

1.30 1.31 1.32 1.33 1.34 17 1.35 1.36


1.36.1

Architecture du moteur PL/SQL .............................................................................. 74

1.37 18 1.38
1.38.1 1.38.2 1.38.3 1.38.4

Vues du dictionnaire de donnes ......................................................................... 78 Dpendances des procdures et des fonctions ....................................................... 79
Dpendances directes ............................................................................................ 79 Dpendances indirectes ......................................................................................... 80 Dpendances locales et distantes .......................................................................... 80 Impacte et gestion des dpendances ..................................................................... 80

Les dpendances .................................................................................................... 79

1.39 19 1.40

Packages ......................................................................................................... 81 Le package DBMS_OUTPUT ................................................................................ 82

Quelques packages intgrs ................................................................................... 82

Page 3/83

Oracle PL/SQL www.tellora.fr

1.41 1.42

Le package UTL_FILE......................................................................................... 82 Le package DBMS_SQL ...................................................................................... 83

Page 4/83

Oracle PL/SQL www.tellora.fr

La base de donnes Oracle 11g

Oracle Database 11g reprsente la nouvelle gnration de la gestion des informations en entreprise, qui permet de faire face aux exigences qu'imposent la croissance rapide des volumes de donnes, l'volution constante de l'environnement et la ncessit de fournir une qualit de service maximale tout en rduisant et en contrlant les cots informatiques. Oracle Database 11g reste centr sur le grid computing : il permet de constituer des matrices de serveurs et de systmes de stockage conomiques capables de traiter les donnes de faon rapide, fiable et volutive, en supportant les environnements les plus exigeants, qu'il s'agisse de datawarehouse, de transactionnel ou de gestion de contenus. Oracle Database 11g intgre de multiples nouveauts et amliorations. Ainsi, Oracle 11g offre une performance amliore du stockage sur fichiers, des fonctionnalits renforces pour la scurit, d'importantes amliorations de performances pour Oracle XML DB, et des fonctions nouvelles pour l'OLAP et le datawarehouse.

Oracle 11g multiplie les outils de gestion et introduits de nouvelles fonctionnalits d'auto gestion et d'automatisation. Automatic SQL, Partitioning Advisor ou Support Workbench accompagnent les administrateurs pour amliorer les performances et les informer le plus rapidement possible des incidents. Ainsi -- Oracle Flashback Transaction permet de revenir plus facilement sur une erreur de transaction et des dpendances. Parallel Backup and Restore augmente les performances des sauvegardes sur les grosses bases. -- Hot Patching permet d'appliquer les mises jour sans arrter les bases. -- Data Recovery Advisor accompagne les administrateurs pour dterminer intelligemment les plans de secours. -- Oracle Fast Files adopte un comportement proche des systmes de fichiers (file systems), ce qui est un gage de performances avec les LOBs (Large Objects) ou des fichiers contenant du texte, des images, ou des donnes XML, objets tridimensionnels, etc. -- Oracle XML DB permet de stockes et manipules nativement les donnes XML. Le langage XML se rvle lourd, et avec cette approche Oracle 11g limite la dgradation de ses performances. De mme la base supporte les interfaces standard XQuery, Java Specification Requests (JSR)-170 et SQL/XML. -- Oracle Transparent Data Encryption permet de crypter les donnes des tables, des index ou encore les donnes stockes de type LOB. -- Cubes OLAP, apporte des fonctionnalits de datawarehouse (fermes de donnes), Oracle 11g embarque les cubes OLAP pour visualiser les informations stockes, ce qui autorise le dveloppement de requtes au format SQL. -- Continuous Query Notification notifie immdiatement les changements apports dans la base. -- avec Query Result Caches, requtes et fonctionnalit de la base ou d'applications tierces sont places en cache afin de les acclrer ou de les rutiliser. -- Database Resident Connection Pooling est destin aux applications qui ne sont pas multithreades (ou les dveloppeurs qui ne matrisent pas cette technologie parallle), en particulier pour les systmes web, Oracle 11g permet de crer des 'pool' de connexions.

Page 5/83

Oracle PL/SQL www.tellora.fr

Les diffrents produits dOracle sont proposs en trois gammes : Enterprise Edition - La gamme pour les grosses applications critiques de lentreprise. Standard Edition - La gamme pour les applications des groupes de travail ou des dpartements de lentreprise, elle est destine des serveurs possdant 4 processeurs. Standard Edition ONE - la gamme destine un bi-processeur. Personal Edition - La gamme pour lutilisateur indpendant (dveloppeur, consultant, ), elle utilise un noyau Enterprise Edition.

Les composants dvelopps par Oracle pour le Grid Computing sont : Real Application cluster (RAC) : Supporte lexcution dOracle sur un cluster dordinateurs qui utilisent un logiciel de cluster indpendant de la plate forme assurant la transparence de linterconnexion. Automatic Storage Management (ASM) : Regroupe des disques de fabricants diffrents dans des groupes disponibles pour toute la grille. ASM simplifie ladministration car au lieu de devoir grer de nombreux fichiers de bases de donnes, on ne gre que quelques groupes de disques. Oracle Ressource Manager : Permet de contrler lallocation des ressources des nuds de la grille Oracle Scheduler : contrle la distribution des jobs aux nuds de la grille qui disposent de ressources non utilises. Oracle Streams : Transfre des donnes entre les nuds de la grille tout en assurant la synchronisation des copies. Reprsente la meilleure mthode de rplication.

Quatre nouvelles options offrent des possibilits exclusives de gestion des donnes pour Oracle Database 11g Enterprise Edition : Oracle Real Application Testing Oracle Advanced Compression Oracle Total Recall Oracle Active Data Guard

Oracle Real Application Testing aide ces clients rduire les dlais, les risques et les cots de test de ces modifications de leur environnement informatique, de faon contrle et conomique. Outil de tests et de gestion des changements, cet outil est bienvenu l o les infrastructures et environnements sont plus que jamais multiples. Oracle Advanced Compression intgre de nouveaux mcanismes de compression applicables tous les types de donnes permettant d'atteindre des taux de compression de 2x ou 3x, et parfois plus. Associ de nouveaux mcanismes de partitionnement, Oracle Advanced Compression permet de dployer dans la base de donnes des stratgies de gestion du cycle de vie des informations, sans avoir modifier les applications, afin de rduire encore plus les besoins de stockage. Oracle Total Recall permet de conserver et de retrouver les historiques des donnes modifies, mais aussi d'en simplifier l'accs.Les administrateurs peuvent intervenir plus tt dans les processus, ce qui apporte une nouvelle dimension de temps dans la gestion des donnes, comme le tracking (suivi, en temps rel des flux d'informations), les audits ou le respect des rgles. Oracle DATA GUARD porte la protection des donnes jusqu'aux risques de dfaillances des systmes et de dsastres. L'application permet simultanment d'crire et rcuprer les donnes

Page 6/83

Oracle PL/SQL www.tellora.fr

d'une base de donnes, ce qui augmente les performances et apporte une solution conomique de 'Disaster Recovery'. Oracle Active Data Guard peut tre employ pour amliorer la performance des bases de donnes de production en transfrant vers une base de donnes physique secondaire des oprations requrrant beaucoup de ressources, telles que certaines requtes ou les sauvegardes. Cette solution amliore fortement le retour sur investissement pour une base de donnes physique de secours, car celle-ci peut tre utilise la fois pour la protection en cas de panne gnrale et pour l'amlioration de la qualit de service de l'environnement de production.

Notion de Grid Computing La base de donnes intgre la notion de Grid Computing (rseau distribu dordinateurs htrognes en grille). Le but du Grid est de crer des pools de ressources : de stockage de serveurs

Le Grid Computing autorise un accs transparent et volutif (en termes de capacit de traitement et de stockage) un rseau distribu dordinateurs htrognes. Oracle 11g permet ces machines dintroprer ; lensemble tant considr comme une seule ressource unifie. Chaque ressource est vue comme un service. Il est possible de mettre en place des rseaux grille nationaux, voire mondiaux. Ainsi chaque nouveau systme peut tre rapidement mis disposition partir du pool de composants

Exemple dapplication en Grid Computing Les deux applications prsentes ci-dessous, Facturation et Comptabilit se partagent des ressources de deux serveurs. Chacune peut tre hberge sur nimporte lequel dentre eux et les fichiers de base de donnes peuvent se trouver sur nimporte quel disque.

Page 7/83

Oracle PL/SQL www.tellora.fr

La nouvelle fonctionnalit Automatic Storage Management (ASM) permet la base de donnes de grer directement les disques bruts, elle limine le besoin pour un gestionnaire de fichier de grer la fois des fichiers de donnes et des fichiers de journaux. LASM rpartit automatiquement toutes les donnes de bases de donnes entre tous les disques, dlivrant le dbit le plus lev sans aucun cot de gestion. Au fur et mesure de lajout et de labandon de disques, lASM actualise automatiquement la rpartition des donnes. Pour utiliser ASM vous devez dmarrer une instance appele ASM instance qui doit tre dmarre avant de dmarrer linstance de votre propre base de donnes. Les instances ASM ne montent pas de base de donnes (ensemble de fichiers constituant la base) mais gre les metadatas requises pour rendre les fichiers ASM disponibles nimporte quelle instance de base de donnes. Les deux, instance ASM et instance ordinaire ont accs au contenu des fichiers. Communicant avec linstance ASM seulement pour connatre le layout des fichiers utiliss.

Page 8/83

Oracle PL/SQL www.tellora.fr

Outils de dveloppement Oracle offre l'accs un choix d'outils et processus de dveloppement, avec de nouvelles fonctionnalits comme Client Side Caching, Binary XML, un nouveau compilateur Java, l'intgration native avec Microsoft Visual Studio 2005 pour les applications .NET, Oracle Application Express pour les outils de migration, ou encore SQL Developer pour coder rapidement les routines SQL et PL/SQL.

Page 9/83

Oracle PL/SQL www.tellora.fr

La documentation

La documentation Oracle est galement consultable partir du serveur : http://www.oracle.com

La documentation Oracle est galement consultable partir du serveur : http://tahiti.oracle.com

Page 10/83

Oracle PL/SQL www.tellora.fr

Les Outils daccs la base

Trois outils sont prsents pour accder une base de donnes Oracle iSQL*Plus, peut tre utilis en application indpendante ou connect un rfrentiel Oracle Management Server (OMS) SQL*Plus (sqlplus), interface daccs la base de donnes en mode commande Oracle Enterprise Manager (OEM), appel Grid Control ou Database Control. o o Database control est cr la cration dune base oracle et ne permet dadministrer graphiquement que cette base de donnes Grid control est un outil qui permet dadministrer une ferme de bases de donnes (oracle ou non oracle).

1.1

Loutil iSQL*Plus

Outil Internet daccs une base de donnes Oracle, permettant dcrire des requtes SQL (dune faon plus ou moins graphique).

Par dfaut, seule la connexion en tant quutilisateur normal (non SYSDBA ou SYSOPER) est autorise. Par contre, la connexion en tant quutilisateur SYSDBA ou SYSOPER est protge par une authentification au niveau du serveur HTTP

Page 11/83

Oracle PL/SQL www.tellora.fr

Pour lautoriser, il faut au choix : Ajouter des entres (utilisateur / mot de passe) laide de lutilitaire htpasswd dans un fichier dauthentification du serveur HTTP (dfini par dfaut dans le fichier de configuration isqlplus.conf : ORACLE_HOME\sqlplus\admin\iplusdba.pw Dsactiver lauthentification du serveur HTTP pour ce type de connexion (directive <Location /isqlplusdba> dans le fichier de configuration isqlplus.conf)

Lors dune connexion SYSDBA ou SYSOPER, lURL est modifie en : http://serveur[:port]/isqlplusdba

1.2

Loutil SQL*Plus

Outil ligne de commande nomm SQLPLUS.

SQLPLUS [ connexion ] [ @fichier_script [argument [,]] ]

Il permet de saisir et dexcuter des ordres SQL ou du code PL/SQL et dispose en plus dun certain nombre de commandes.

-- sans connexion C:\> SQLPLUS /NOLOG -- avec connexion C:\> SQLPLUS system/tahiti@tahiti -- avec connexion et lancement dun script sur la ligne de commande C:\> SQLPLUS system/tahiti@tahiti @info.sql -- sous dos --------------set ORACLE_SID=TAHITI -- connection sans fichier de mot de passe SQL> connect /as sysdba Connect. SQL> show user USER est "SYS" -- sous unix --------------Export ORACLE_SID=TAHITI -- Connexion avec un fichier de mots de passe SQL> connect sys/secret as sysdba Connect. SQL> show user USER est "SYS" SQL>

Page 12/83

Oracle PL/SQL www.tellora.fr

1.2.1

Environnement de travail

SQL*PLUS est avant tout un interprteur de commandes SQL. Il est galement fortement interfac avec le systme d'exploitation. Par exemple, sous UNIX, on pourra lancer des commandes UNIX sans quitter sa session SQL*PLUS. Un SGBDR est une application qui fonctionne sur un systme dexploitation donn. Par consquent, il faut se connecter au systme avant douvrir une session ORACLE. Cette connexion peut tre implicite ou explicite. Pour lancer SQL Plus sans se connecter une base de donnes utilisez la commande :
C:\> sqlplus /nolog

Pour dmarrer une session SQL Plus sous dos il suffit de se mettre en commande DOS puis dexcuter la commande SQL PLUS .

-- avec connexion C:\> SQLPLUS charly/secret@tahiti SQL> show user USER est "charly" SQL>

Page 13/83

Oracle PL/SQL www.tellora.fr

Nous avons install au pralable les couches clients ORACLE sur le Poste Client. Cette installation est simple, il suffit de renseigner les modules installer et le protocole TCP/IP utiliser (il peut y en avoir plusieurs sur une mme machine). Depuis le groupe ORACLE, double cliquer sur licne SQL*Plus ...

La bote de dialogue suivante permet de saisir un compte et un mot de passe ORACLE ...

Le nom de la Chane hte correspond au nom du service Oracle Net de la base de donne laquelle lutilisateur veut se connecter. Celle ci se trouve le plus souvent sur un serveur distant. La session SQL*PLUS est ouverte ...

Pour se positionner dans le rpertoire courant il suffit deffectuer la manipulation suivante : Fichier Ouvrir (jusqu se que lon voit le contenu du rpertoire de travail dans la bote de dialogue) OK pour sortir de la bote de dialogue

Oracle mmorise le chemin du rpertoire affich.

Page 14/83

Oracle PL/SQL www.tellora.fr

1.2.2

Le prompt SQL*Plus

Une fois une session SQL*PLUS dbute lutilisateur peut travailler en interactif ou non. Dans le premier cas il saisira ses commandes sous le prompt SQL et devra les terminer par le caractre ; pour lancer linterprtation. Dans le second cas, il construit ses scripts (avec lextension .sql ) et les lance sous le prompt SQL en les faisant prcder de start ou @. Une session SQL*PLUS se termine par la commande exit. La transaction en cours est alors valide. Une requte peut scrire sur plusieurs lignes. A chaque retour chariot linterprteur incrmente le numro de ligne jusquau ; final qui marque la fin de la saisie.

SQL> select * 2 from 3 avion; ID_AVION ---------1 2 3 4 NOM_AVION -----------------------------Caravelle Boeing Planeur A_Caravelle_2

Un script se lance par la commande start nom_script ou @ nom_script...

SQL> start all_avion; ID_AVION ---------1 2 3 4 NOM_AVION -----------------------------Caravelle Boeing Planeur A_Caravelle_2

Lditeur par dfaut avec lequel sinterface SQL*PLUS est le Bloc Notes (c:\windows\notepad.exe). Les principes prcdents restent les mmes.

SQL*Plus est un outil compos de commandes de mise en forme et daffichage A ne pas confondre avec des commandes SQL.

Page 15/83

Oracle PL/SQL www.tellora.fr

1.2.3

Quelques commandes SQL*Plus

COL COL

ADRESSE

FORMAT

A20, formater laffichage dune colonne ADRESSE sur 20 caractres 99.99, formater laffichage dune colonne PRIXUNIT

PRIXUNIT FORMAT

CLEAR

COL, r-initialiser la taille des colonnes par dfaut

SET LINESIZE 100, reformater la taille de la ligne 100 caractres SET SHOW PAUSE ON, afficher un rsultat page par page

USER, visualiser le user sous lequel on est connect

CONNECT , se connecter linstance User/MotPass@adresseServeur , permet de changer de session utilisateur CLEAR SCREEN, r-initialiser lcran

SET SQLPROMPT TEST> , afficher le prompt SQL en : TEST> DESC Nom_Table, afficher la structure dune table ou dune vue @ nom_ficher, permet dexcuter le contenu dun fichier sql /, r-active la dernire commande SET ECHO ON/OFF, affiche ou non le texte de la requte ou de la commande excuter SAVE nom_ficher [append|create|replace], permet de sauvegarder le contenu du buffer courant dans un fichier .sql . TIMING ON|OFF, provoque laffichage dinformations sur le temps coul, le nombre dE/S aprs chaque requte TI ON|OFF, provoque laffichage de lheure avec linvite TERM [ON|OFF], supprime tout laffichage sur le terminal lors de lexcution dun fichier VER [ON|OFF], provoque laffichage des lignes de commandes avant et aprs chaque substitution de paramtre. SQL }, spcifie le caractre } comme tant le caractre de continuation dune commande SQL*Plus. SUFFIX txt, spcifie lextension par dfaut des fichiers de commande SQL*Plus

1.2.4

Gnrer un fichier rsultat appel spool

La commande SPOOL permet de gnrer un fichier rsultat contenant toutes les commandes passes lcran SPOOL NomFichier.txt, permet dactiver un fichier de format texte dans lequel on retrouvera les commandes et rsultas affichs dans SQL Plus.

Page 16/83

Oracle PL/SQL www.tellora.fr

SPOOL OFF, permet de dsactiver le spool ouvert prcdemment.

SPOOL MonFichier.txt -- commandes SQL affiches -- commandes SQL affiches -- commandes SQL affiches Spool OFF

1.2.5

Dclarer un diteur

Pour dclarer NotPad comme diteur SQL*PLUS, et lextension .txt pour excuter un script il suffit de saisir ces deux lignes de commandes :

SET

SUFFIX

TXT

DEFINE

_EDITOR = NOTPAD

Aprs avoir tap ces 2 lignes de commandes taper : ED Pour afficher lditeur NotPad.

1.3

Utilisation de paramtres

Linstruction ACCEPT permet de saisir des valeurs de paramtres (ce ne sont pas des variables et ce titre ne ncessitent aucune dclaration).
ACCEPT reference NUMBER PROMPT 'Entrez la rfrence dun avion: ' select * from avion where Id_avion=&reference;

SQL> @essai Entrez la rfrence dun avion: 1 ID_AVION NOM_AVION ---------- -----------------------------1 Caravelle

Page 17/83

Oracle PL/SQL www.tellora.fr

Le dictionnaire de donnes

Cest un ensemble de tables et de vues qui donne des informations sur le contenu dune base de donnes. Il contient : Les structures de stockage Les utilisateurs et leurs droits Les objets (tables, vues, index, procdures, fonctions, )

Le dictionnaire de donnes charg en mmoire est utilis par Oracle pour traiter les requtes.

Il appartient lutilisateur SYS et est stock dans le tablespace SYSTEM. Sauf exception, toutes les informations sont stockes en MAJUSCULE. Il contient plus de 866 vues.

Il est cr lors de la cration de la base de donnes, et mis jour par Oracle lorsque des ordres DDL (Data Dfinition Langage) sont excuts, par exemple CREATE, ALTER, DROP

Il est accessible en lecture par des ordres SQL (SELECT) et est compos de deux grands groupes de tables/vues : Les tables et vues statiques Bases sur de vraies tables stockes dans le tablespace SYSTEM Accessible uniquement quand la base est ouverte OPEN Les tables et vues dynamiques de performance Sont en fait uniquement bases sur des informations en mmoire ou extraites du fichier de contrle Sinterrogent nanmoins comme de vraies tables/vues Donnent des informations sur le fonctionnement de la base, notamment sur les performances (do leur nom) Pour la plupart accessibles mme lorsque la base nest pas compltement ouverte (MOUNT)

Les vues statiques de performances sont stockes dans le fichier de contrle, et disponibles louverture de celui-ci (voir dmarrage et arret dune base Oracle).

Page 18/83

Oracle PL/SQL www.tellora.fr

Les vues statiques sont constitues de 3 catgories caractrises par leur prfixe : USER_* : Informations sur les objets qui appartiennent lutilisateur ALL_* : Information sur les objets auxquels lutilisateur a accs (les siens et ceux sur lesquels il a reu des droits) DBA_* : Information sur tous les objets de la base

Derrire le prfixe, le reste du nom de la vue est reprsentatif de linformation accessible. Les vues DICTIONARY et DICT_COLUMNS donnent la description de toutes les tables et vues du dictionnaire. Oracle propose des synonymes sur certaines vues :

Synonyme cols dict ind obj seq syn tabs

Vue correspondante User_tab_columns Dictionnary User_indexes User_objects User_sequences User_synonyms User_tables

Les vues dynamiques de performance sont : Prfixes par V$ Derrire le prfixe, le reste du nom de la vue est reprsentatif de linformation accessible Dcrites dans les vues DICTIONARY et DICT_COLUMNS

Exemple de vues dynamiques V$INSTANCE V$DATABASE V$SGA V$DATABASE V$PARAMETER

Page 19/83

Oracle PL/SQL www.tellora.fr

La base Exemple

Nous vous prsentons la base de donnes TAHITI qui servira de support aux exemples prsents dans le cours.

1.3.1

Modle Conceptuel de Donnes Tahiti

Modle Conceptuel de Donnes Projet Auteur : Tahiti : Clotilde Attouche Version 22/08/2004 Modle : Tahiti

Vol No_Vol Vol_Depart Vol_Arrive Destination 1,1 I DT DT A20 0,n

Utilise

Est Equipage

Est Patron de 0,n 0,n Avion Id_Avion Nom_Avion I VA30 Employe ID_Emp I Nom VA30 Salaire N4 Emploi VA20 1,n Dirige

0,1 A pour Patron

Page 20/83

Oracle PL/SQL www.tellora.fr

1.3.2

Les contraintes dintgrit

Les contraintes dintgrit Oracle sont prsentes ci-dessous : UNIQUE pour interdire les doublons sur le champ concern, NOT NULL pour une valeur obligatoire du champ Cl primaire (PRIMARY KEY) pour lidentification des lignes (une valeur de cl primaire = une et une seule ligne), Cl trangre (FOREIGN KEY) prcisant quune colonne rfrence une colonne dune autre table, CHECK pour prciser des domaines de valeurs.

Une cl primaire induit la cration de deux contraintes NOT NULL et UNIQUE

1.3.3

Rgles de passage du MCD au MPD

Le passage du Modle Conceptuel de Donnes en Modle Physique de donnes se fait en appliquant les rgles cites ci-dessous : Les entits deviennent des tables Les identifiants des entits deviennent les cls primaires de ces tables Les relations ternaires, dont toutes les cardinalits sont 0,N ou 1,N de chaque ct de la relation deviennent des tables La concatnation des identifiants des entits qui concourent la relation devient la cl primaire de la table issue de la relation ; chacun, pris sparment, devient cl trangre. Pour les relations possdant des cardinalits 0,1 ou 1,1 dun seul ct de la relation, on fait migrer lidentifiant cot 0,N dans lentit cot 0,1 devenue table, lidentifiant devient alors cl trangre ; Pour les relations possdant des cardinalits 0,1 et 1,1 de chaque ct de la relation, il est prfrable de crer une table, mais lon peut galement faire migrer lidentifiant dans lune des deux entits ; celui ci devient alors cl trangre (cest ce que font des outils comme Power AMC)

Page 21/83

Oracle PL/SQL www.tellora.fr

1.3.4

Modle Physique de donnes Tahiti :

Nous appliquons les rgles de passage du MCD au MPD pour gnrer le modle prsent ci-dessous avec Power AMC . Le Modle Physique de Donnes cr, une phase doptimisation doit tre effectue avant de crer la base de donnes . Durant cette phase, des index sont positionns sur les colonnes des tables les plus couramment utilises dans des requtes ; des informations seront dupliques.

Modle Physique de Donnes Projet : Tahiti Version 22/08/2004 Modle : Tahiti Auteur : Clotilde Attouche

VOL NO_VOL VOL_DEPART VOL_ARRIVE DESTINATION ID_AVION INTEGER DATE DATE CHAR(20) INTEGER not null not null null not null not null

NO_VOL = NO_VOL

EST_EQUIPAGE
ID_AVION = ID_AVION

ID_EMP NO_VOL

INTEGER not null INTEGER not null

ID_EMP = ID_EMP

ID_EMP = EMP_ID_EMP

ID_AVION NOM_AVION

AVION INTEGER VARCHAR2(30)

not null null

ID_EMP NOM SALAIRE EMPLOI EMP_ID_EMP

EMPLOYE INTEGER VARCHAR2(30) NUMBER(4) VARCHAR2(20) INTEGER

not null not null not null null null

Page 22/83

Oracle PL/SQL www.tellora.fr

Le langage SQL

Le langage SQL (Structured Query Langage) sappuie sur les normes SQL ANSI en vigueur et est conforme la norme SQL92 ou SQLV2 (ANSI X3.135-1889n, ISO Standard 9075, FIPS 127). Il a t dvelopp dans le milieu des annes 1970 par IBM (System R). En 1979 Oracle Corporation est le premier commercialiser un SGBD/R comprenant une incrmentation de SQL. Oracle comme acteur significatif intgre ses propres extensions aux ordres SQL. Depuis larrive dinternet et de lobjet Oracle fait voluer la base de donnes et lui donne une orientation objet, on parle SGBDR/O : System de Base de Donnes relationnel Objet. Les sous langages du SQL sont : LID : Langage dInterrogation des donnes, verbe SELECT LMD : Langage de Manipulation des Donnes, utilis pour la mise jour des donnes, verbes INSERT, UPDATE, DELETE, COMMIT, ROLLBACK LDD : Langage de dfinition des donnes, utilis pour la dfinition et la manipulation dobjets tels que les tables, les vues, les index , verbe CREATE, ALTER, DROP, RENAME, TRUNCATE LCD : Langage de Contrle des Donnes, utilis pour la gestion des autorisations et des privilges, verbe GRANT, REVOKE

1.4

Notion de schema

Le terme SCHMA dsigne lensemble des objets qui appartiennent un utilisateur, ces objets sont prfixs par le nom de lutilisateur qui les a crs. En gnral on indique sous le terme de schma, lensemble des tables et des index dune mme application. Principaux types dobjets de schma : Tables et index Vues, squences et synonymes Programmes PL/SQL (procdures, fonctions, packages, triggers)

1.5

Rgles de nommage

Un nom de structure Oracle doit respecter les rgles suivantes : 30 caractres maximums Doit commencer par une lettre Peut contenir des lettres, des chiffres et certains caractres spciaux (_$#) Nest pas sensible la casse Ne doit pas tre un mot rserv Oracle

Page 23/83

Oracle PL/SQL www.tellora.fr

Le langage PL/SQL

Le langage PL/SQL est une extension procdurale du langage SQL. Il permet de grouper des commandes et de les soumettre au noyau comme un bloc unique de traitement. Contrairement au langage SQL, qui est non procdural (on ne se soucie pas de comment les donnes sont traites), le PL/SQL est un langage procdural qui sappuie sur toutes les structures de programmations traditionnelles (variables, itrations, tests, squences). Le PL/SQL sintgre dans les outils SQL*FORMS, SQL*PLUS, PRO*C, ...il sert programmer des procdures, des fonctions, des triggers, et donc plus gnralement, des packages

1.6

Structure dun programme P/SQL

Un programme PL/SQL se dcompose en trois parties :

DECLARE ------------------BEGIN ------------------EXCEPTION ------------------END ; /

La zone DECLARE sert la dclaration des variables, des constantes, ou des curseurs, La zone BEGIN constitue le corps du programme, La zone EXCEPTION permet de prciser les actions entreprendre lorsque des erreurs sont rencontres (pas de rfrence article trouve pour une insertion, ...), Le END rpond au BEGIN prcdent, il marque la fin du script.

Page 24/83

Oracle PL/SQL www.tellora.fr

1.7

Les diffrentes types de donnes

Les diffrents types utiliss pour les variables PL/SQL sont :

TYPE BINARY-INTEGER POSITIVE / NATURAL NUMBER INTEGER CHAR (n) VARCHAR2 (n) LONG DATE RAW

VALEURS entiers allant de 2**31 2**31) entiers positifs allant jusqu 2**31 -1 Numrique (entre 2**418 2**418) Entier stock en binaire (entre 2**126 2**126) Chane fixe de 1 32767 caractres (diffrent pour une colonne de table) Chane variable (1 32767 caractres) idem VARCHAR2 (maximum 2 gigaoctets) Date (ex. 01/01/1996 ou 01-01-1996 ou 01-JAN96 ...) Permet de stocker des types de donnes binaire relativement faibles( <= 32767 octets) idem VARCHAR2. Les donnes RAW ne subissent jamais de conversion de caractres lors de leur transfert entre le programme et la base de donnes.

LONG RAW CLOB

Idem LONG mais avec du binaire Grand objet caractre. Objets de type long stocks en binaire (maximum 4 giga octets) Dclare une variable grant un pointeur sur un grand bloc de caractres, mono-octet et de longueur fixe, staock en base de donnes.

BLOB

Grand objet binare. Objets de type long (maximum 4 giga octets) Dclare une variable grant un pointeur sur un grand objet binaire stock dans la base de donnes (Son ou image).

Page 25/83

Oracle PL/SQL www.tellora.fr

NCLOB

Support en langage nationale (NLS) des grands objets caractres. Dclare une variable grant un pointeur sur un grand bloc de caractres utilisant un jeu de caractres mono-octets, multi-octets de longueur fixe ou encore multi-octets de longueur variable et stock en base de donnes. Compos de 6 octets binaires permettre didentifier une ligne par son adresse physique dans la base de donnes. Le U de UROWID signifie Universel, une variable de ce type peut contenir nimporte quel type de ROWID de nimporte quel type de table. Boulen, prend les valeurs TRUE, FALSE, NULL

ROWID

UROWID

BOOLEAN

1.7.1

Conversion implicite

Le PL/SQL opre des conversions de type implicites en fonctions des oprandes en prsence. Il est ncessaire de bien connatre ces rgles comme pour tous les langages. Cependant, le typage implicite des variables (cf. chapitre sur les variables) permet de simplifier la dclaration des variables.

1.7.2

Conversion explicite

Le programmeur peut tre matre doeuvre du typage des donnes en utilisant des fonctions standards comme to_char, to_date, etc. ..Des exemples seront donns plus loin dans le support.

1.8

Les variables et les constantes

La dclaration dune variable ou dune constante se fait dans la partie DECLARE dun programme PL/SQL. On peut dclarer le type dune variable dune faon implicite ou explicite.

DECLARE nouveau_vol ancien_vol autre_vol

article.prixunit%TYPE ; NUMBER ; NUMBER DEFAULT 0 ;

-- type implicite -- type explicite -- initialisation 0

Page 26/83

Oracle PL/SQL www.tellora.fr

Lutilisation de lattribut %ROWTYPE permet la variable dhriter des caractristiques dune ligne de table
DECLARE V_vol vol%ROWTYPE ;

Si une variable est dclare avec loption CONSTANT, elle doit tre initialise. Si une variable est dclare avec loption NOT NULL, elle doit tre initialise et la valeur NULL ne pourra pas lui tre affecte durant lexcution du programme.

1.9

Les structures

Dfinition dune structure art_qtecom (article et quantit commande)


/* cration du type enregistrement typ_vol*/ type typ_vol is record ( v_novol vol.no_vol%type , v_dest vol.destination%type ) ;

Dclaration dune variable de type v_vol :


/* affectation du type typ_vol v_vol*/ v_vol typ_vol;

Accs aux membres de la structure :


v_vol.v_dest := Tahiti;

Source complet DECLARE type typ_vol is record ( v_novol vol.no_vol%type , v_dest vol.destination%type ) ; v_vol typ_vol; BEGIN v_vol.v_dest := Tahiti; END; /

Page 27/83

Oracle PL/SQL www.tellora.fr

Les instructions de bases

1.10 Condition
Exemple : une socit dinformatique augmente le salaire de ses employs dun montant variant de 100 500 euros, en fonction de la demande de leur supperieur hirarchique :

IF salaire < =1000 THEN nouveau_salaire := ancien_salaire + 100; ELSEIF salaire > 1000 AND emp_id_emp = 1 THEN nouveau_salaire := ancien_salaire + 500; ELSE nouveau_salaire := ancien_salaire + 300; END IF;

1.11 Itration
On dispose de linstruction LOOP que lon peut faire cohabiter avec les traditionnelles WHILE et FOR. La commande EXIT permet dinterrompre la boucle.

OPEN curs1; LOOP FETCH curs1 into ancien_salaire; EXIT WHEN curs1%NOTFOUND; IF salaire < =1000 THEN nouveau_salaire := ancien_salaire + 100; ELSEIF salaire > 1000 AND emp_id_emp = 1 THEN nouveau_salaire := ancien_salaire + 500; ELSE nouveau_salaire := ancien_salaire + 300; end if; update employe set salaire = nouveau_salaire where current of curs1; END LOOP;

Syntaxes gnrales
FOR compteur IN borne_infrieure..borne_suprieure LOOP squences END LOOP; WHILE condition LOOP squences END LOOP;

Page 28/83

Oracle PL/SQL www.tellora.fr

1.12 Lexpression CASE


Lexpression CASE, introduite en version 8.1.6, permet dimplmenter en SQL une logique de type IFTHENELSE.

CASE expression WHEN expression_comparaison THEN expression_rsultat [ ] [ ELSE expression_rsultat_par_dfaut ] END

- Toutes les expressions doivent tre de mme type. - Oracle recherche la premire clause WHEN..THEN, telle que expression est gale expression_comparaison et retourne : lexpression_rsultat associe - Si aucune clause WHENTHEN ne vrifie cette condition et quune clause ELSE existe, Oracle retourne lexpression_rsultat_par_dfaut associe - NULL sinon

-- instruction CASE : premire syntaxe BEGIN FOR l IN (SELECT nom,sexe FROM employe WHERE emploi = Aviateur) LOOP CASE l.sexe WHEN 'M' THEN DBMS_OUTPUT.PUT_LINE('Monsieur ' || l.nom); WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Madame ' || l.nom); ELSE DBMS_OUTPUT.PUT_LINE(l.nom); END CASE; END LOOP; END; /

Page 29/83

Oracle PL/SQL www.tellora.fr

Deuxime syntaxe
CASE WHEN condition THEN expression_rsultat [ ] [ ELSE expression_rsultat_par_dfaut ] END CASE

Mme principes, que la premire syntaxe, mais avec recherche de la premire clause WHENTHEN telle que condition est vraie.

La deuxime syntaxe offre plus de libert dans les conditions ; la premire syntaxe est limite des conditions dgalit. Par contre, pour des conditions dgalit, la premire syntaxe est plus performante, lexpression tant value une seule fois. Bien noter que linstruction CASE gnre une exception si aucune condition nest vrifie et quil ny a pas de ELSE. Sil est normal quaucune condition ne soit vrifie, et quil ny a rien faire dans ce cas l, il est possible de mettre une clause ELSE NULL; (linstruction NULL ne faisant justement rien). Par contre, dans les mmes circonstances, lexpression CASE ne gnre pas dexception mais retourne une valeur NULL.

Performance
CASE expression WHEN expression1 THEN rsultat1 WHEN expression2 THEN rsultat2

est plus performant que

CASE WHEN expression = expression1 THEN rsultat1 WHEN expression = expression2 THEN rsultat2

Lexpression CASE ne supporte pas plus de 255 arguments, chaque clause WHENTHEN comptant pour 2.

Page 30/83

Oracle PL/SQL www.tellora.fr

-- Premire syntaxe SELECT nom, CASE sexe WHEN 'M' THEN 'Monsieur' WHEN 'F' THEN CASE marie WHEN 'O' THEN 'Madame' WHEN 'N' THEN 'Mademoiselle' END ELSE 'Inconnu' END CASE FROM employe / --Deuxime syntaxe SELECT nom, CASE sexe WHEN sexe = 'M' THEN 'Monsieur' WHEN sexe = 'F' AND marie = 'O' THEN 'Madame' WHEN sexe = 'F' AND marie = 'N' THEN 'Mademoiselle' ELSE 'Inconnu' END CASE FROM employe /

Il est possible davoir des instructions CASE imbriques.

1.13 Expression GOTO


Linstruction GOTO effectue un branchement sans condition sur une autre commande de la mme section dexcution dun bloc PL/SQL. Le format dune instruction GOTO est le suivant :

GOTO Nom_Etiquette ; <<Nom_Etiquette>> instructions

- Nom_Etiquette est le nom dune tiquette identifiant linstruction cible

Page 31/83

Oracle PL/SQL www.tellora.fr

BEGIN GOTO deuxieme_affichage Dbms_output.putline(Cette ligne ne sera jamais affiche) ; <<deuxieme_affichage>> dbms_output.putline(Cette ligne sera toujours affiche) ; END ; /

Limites de linstruction GOTO


Linstruction GOTO comporte plusieurs limites : Ltiquette doit tre suivie dau moins un ordre excutable Ltiquette cible doit tre dans la mme porte que linstruction GOTO, chacune des structures suivantes maintien sa propre porte : fonctions, procdures blocs anonymes, instruction IF, boucles LOOP, gestionnaire dexceptions, instruction CASE. Ltiquette cible doit tre dans la mme partie de bloc que le GOTO

1.14 Expression NULL


Lorsque vous voulez demander au PL/SQL de ne rien faire, linstruction NULL devient trs pratique. Le format dune instruction NULL est le suivant :

NULL;

Le point virgule indique quil sagit dune commande et non pas de la valeur NULL.

-IF :etat.selection = detail Then Exec_etat_detaille; Else NULL ; -- ne rien faire END IF ;

Page 32/83

Oracle PL/SQL www.tellora.fr

1.15 Gestion de laffichage


Il est videmment possible dutiliser des fonctions prdfinies dentre/sortie. Ces fonctions servent essentiellement durant la phase de test des procdures PL/SQL (laffichage tant gnralement gr du ct client).

Il faut dabord activer le package DBMS_OUTPUT par la commande set serveroutput on. Ensuite on peut utiliser la fonction put_line de ce package.

affiche.sql set serveroutput on DECLARE message varchar2(100); BEGIN message := 'Essai d''affichage'; DBMS_OUTPUT.put_line ('Test : ' || message); END; /

Excution SQL> @affiche Test : Essai d'affichage

PL/SQL procedure successfully completed.

Noter lemploi de '' pour pouvoir afficher le caractre ', et du double pipe || pour pouvoir concatner plusieurs chanes de caractres. La concatnation est souvent ncessaire car la fonction put_line naccepte quune seule chane de caractres en argument. Lorsque les donnes affiches dfilent trop vite on pourra utiliser deux mthodes : Utiliser la commande set pause on (une commande set pause off devra lui correspondre pour revenir la normale). Il faut alors frapper la touche RETURN pour faire dfiler les pages daffichage. Utiliser la commande spool nom_fichier. Elle permet de diriger laffichage, en plus de la sortie standard qui est lcran, vers un fichier nomm nom_fichier.lst. La commande spool off est ncessaire pour arrter la re-direction (attention aux fichiers de spool qui grossissent inconsidrment).

Page 33/83

Oracle PL/SQL www.tellora.fr

Tables et tableaux

Un tableau en PL/SQL est en fait une table qui ne comporte quune seule colonne. Cette colonne ne peut correspondre qu un type scalaire et non un type compos (table ou record). La structure de donnes ncessaire pour grer une table ORACLE ncessitera donc autant de types tables que la table possde de colonnes. On pourra ventuellement regrouper ces tables lintrieur dun RECORD. Une table PL/SQL est indexe par une cl de type BINARY_INTEGER.

Dfinition de deux types table contenant respectivement des rfrences articles et des dsignations.
TYPE tab_destination is TABLE of vol.destination%TYPE index by binary_integer;

Dclaration dune variable de type tab_destination :


ma_destination tab_destination;

Dclaration dune variable permettant de balayer la table :


j integer := 1;

Accs au premier poste de la table :


ma_destination(j) := Tahiti;

Utilisation de tables lintrieur dun RECORD : Exemple de RECORD dfini laide de tables :

DECLARE TYPE tab_vol is table of vol.no_vol%TYPE index by binary_integer; TYPE tab_destination is table of vol.destination%TYPE index by binary_integer;

TYPE rec_vol is RECORD (v_vol tab_vol, v_destination tab_destination); mon_vol ind rec_vol; integer ;

Page 34/83

Oracle PL/SQL www.tellora.fr

BEGIN ind := 1 ; mon_vol.v_vol(ind) := 2048; mon_vol.v_destination(ind) := Tahiti; END; /

Page 35/83

Oracle PL/SQL www.tellora.fr

10 Les curseurs
Un curseur est une variable qui pointe vers le rsultat dune requte SQL. La dclaration du curseur est lie au texte de la requte. Lorsquune requte nextrait quune seule ligne lutilisation dun curseur nest pas ncessaire. Par contre, si plusieurs lignes sont retournes, il faut pouvoir les traiter une une la manire dun fichier. Un curseur permet de lire squentiellement le rsultat dune requte. On peut ainsi traiter les lignes rsultantes une par une en dchargeant les donnes lues dans des variables htes. Ce mcanisme est ncessaire car on ne peut crire une instruction qui remplirait dun coup toute notre structure ma_struct de lexemple prcdent. Linstruction suivante entrane une erreur de type :
select no_vol into mes_vols from vol ; PLS-00385: type mismatch found at 'mes_vols' in SELECT...INTO statement

1.16 Oprations sur les curseurs


Les seules oprations possibles sur un curseur sont : DECLARE Dfinition du curseur (donc de la requte associe).
DECLARE CURSOR mes_vols IS SELECT no_vol, destination FROM vol WHERE destination = Tahiti;

OPEN Excution de la requte, allocation mmoire pour y stocker le rsultat, positionnement du curseur sur le premier enregistrement.
OPEN mes_vols;

FETCH Lecture de la zone pointe par le curseur, affectation des variables htes, passage lenregistrement suivant.
FETCH mes_vols into v_vol, v_destination;

Page 36/83

Oracle PL/SQL www.tellora.fr

CLOSE Fermeture du curseur, libration de la zone mmoire alloue pour le rsultat de la requte.
CLOSE mes_vols;

Voici un schma de synthse sur le principe des curseurs :

Programme PL/SQL, ou Pro*C, ou ..

TABLE T1

Zone mmoire initialise par OPEN nom_curseur ..... .....


FETCH nom_curseur INTO a, b

TABLE T2

CURSOR nom_curseur IS SELECT A, B FROM T1, T2 WHERE ...

variable variable hte a hte b

Page 37/83

Oracle PL/SQL www.tellora.fr

1.17 Attributs sur les curseurs


Chaque curseur possde quatre attributs : %FOUND %NOTFOUND %ISOPEN %ROWCOUNT Gnre un boolen VRAI lorsque le FETCH russi (donnes lues) Inverse de %FOUND (gnralement plus utilis que %FOUND) Gnre un boolen VRAI lorsque le curseur spcifi en argument est ouvert. Renvoie le nombre de lignes contenues.

Chaque attribut sutilise en tant prfix par le nom du curseur : nom_curseur%ATTRIBUT

1.18 Exemple de curseur


Nous allons maintenant rsumer, par un exemple, lutilisation des curseurs. Nous allons remplir une table Voyage destine aux clients prvus pour un vol destination des les Marquises.

SQL> desc voyage Name Null? ------------------------------- -------NOM ADRESSE

Type ---CHAR(20) CHAR(80)

Voyage_marquise.sql DECLARE CURSOR curs_employes IS SELECT Nom_emp, adresse FROM employe WHERE adresse = v_adresse; v_nom_employe v_adresse_employe V_adresse client.Nom_cli%TYPE; client.adresse%TYPE; varchar2(30) ;

BEGIN v_adresse := Marquises OPEN curs_employes ;

Page 38/83

Oracle PL/SQL www.tellora.fr

LOOP FETCH curs_employes into v_nom_employe, v_adresse_employe; EXIT WHEN curs_employes%NOTFOUND; INSERT INTO voyage values (v_nom_employe,v_adresse_employe); END LOOP; CLOSE curs_employes; END; /

Nous vous avons prsent lutilisation dun curseur paramtr dont la valeur de la variable v_adresse est gale Marquises louverture de celui-ci. Il est possible dutiliser plusieurs variables dans la clause WHERE du curseur.

1.19 Exemple de curseur avec BULK COLLECT


Nous allons maintenant rsumer, par un exemple, lutilisation des tables remplies par un curseur. Nous allons remplir un record de trois table avec un curseur en une seule opration grce linstruction BULK COLLECT.

SET SERVEROUTPUT ON PROMPT SAISIR UN NUMERO D'EMPLOYE ACCEPT NO_EMP DECLARE TYPE TAB_NOM IS TABLE OF EMPLOYE.NOM%TYPE INDEX BY BINARY_INTEGER; TYPE TAB_SALAIRE IS TABLE OF EMPLOYE.SALAIRE%TYPE INDEX BY BINARY_INTEGER; TYPE TAB_EMPLOI IS TABLE OF EMPLOYE.EMPLOI%TYPE INDEX BY BINARY_INTEGER; TYPE TYP_EMP IS RECORD (E_NOM TAB_NOM, E_SALAIRE TAB_SALAIRE, E_EMPLOI TAB_EMPLOI ); E_EMP NUM_EMP NB_EMP TYP_EMP; INTEGER :=1; INTEGER;

Page 39/83

Oracle PL/SQL www.tellora.fr

BEGIN SELECT NOM, SALAIRE, EMPLOI BULK COLLECT INTO E_EMP.E_NOM, E_EMP.E_SALAIRE, E_EMP.E_EMPLOI FROM EMPLOYE WHERE ID_EMP > &NO_EMP; NB_EMP := E_EMP.E_NOM.COUNT; LOOP EXIT WHEN NUM_EMP > NB_EMP; /* AFFICHAGE ET MISE EN FORME DU RESULTAT */ DBMS_OUTPUT.PUT_LINE (' NOM : ' || E_EMP.E_NOM(NUM_EMP) || ' *-* ' || ' SALAIRE : ' || E_EMP.E_SALAIRE(NUM_EMP) || ' *-* ' || ' EMPLOI : ' || E_EMP.E_EMPLOI(NUM_EMP)); NUM_EMP := NUM_EMP + 1; END LOOP; END; /

1.20 Variables curseur


Contrairement un curseur, une variable curseur est dynamique car elle nest pas rattache une requte spcifique. Pour dclarer une variable curseur faire :

Etape 1 : dfinir un type REF CURSOR


DECLARE type ref_type_nom is ref cursor return type_return ;

(type_return reprsente soit une ligne de table base soit un record.

Etape 2 : declarer une variable de type REF CURSOR


DECLARE type emptype Emp_cs is ref cursor return e_emp%rowtype ;

emptype

Page 40/83

Oracle PL/SQL www.tellora.fr

Etape 3 : grer une variable curseur On utilise les commandes open-for, fetch, close pour contrler les variables curseur.

BEGIN OPEN {nom_var_curseur| :host_nom_var_curseur} FOR ordre_select ; FETCH nom_var_curseur INTO var_hte ; CLOSE nom_curseur ;

Exemple Utilisation dun curseur rfrenc pour retourner des enregistrements choisis par lutilisateur.

DECLARE TYPE rec_type IS RECORD (client.nocli%TYPE ; Enreg rec_type; TYPE refcur IS REF CURSOR RETURN enreg%TYPE ; Curref refcur ; Enreg_emp curref%ROWTYPE V_choix NUMBER(1) := &choix BEGIN If v_choix = 1 THEN OPEN curref FOR SELECT no, nom FROM e_client ; ELSIF v_choix = 2 THEN OPEN curref FOR SELECT no, nom FROM e_emp; ELSIF v_choix = 3 THEN OPEN curref FOR SELECT no, nom FROM e_service ; ELSIF v_choix = 4 THEN OPEN curref FOR SELECT no, nom FROM e_continet ; ELSIF v_choix = 5 THEN OPEN curref FOR SELECT no, nom FROM e_produit ; END IF ; LOOP EXIT WHEN v_choix NOT BETWEEN 1 AND 5; FETCH curref INTO enreg ; EXIT WHEN curref%NOTFOUND ; Dbms_output.put_line (No : ||enreg.no|| Nom || enreg.nom) ; END LOOP ; END; /

Page 41/83

Oracle PL/SQL www.tellora.fr

11 Les exceptions
Le langage PL/SQL offre au dveloppeur un mcanisme de gestion des exceptions. Il permet de prciser la logique du traitement des erreurs survenues dans un bloc PL/SQL. Il sagit donc dun point cl dans lefficacit du langage qui permettra de protger lintgrit du systme. Il existe deux types dexception : interne, externe.

Les exceptions internes sont gnres par le moteur du systme (division par zro, connexion non tablie, table inexistante, privilges insuffisants, mmoire sature, espace disque insuffisant, ...). Les exceptions externes sont gnres par lutilisateur (stock zro, ...). Le gestionnaire des exceptions du PL/SQL ne sait grer que des erreurs nommes (noms dexceptions). Par consquent, toutes les exceptions doivent tre nommes et manipules par leur nom. Les erreurs ORACLE gnres par le noyau sont numrotes (ORA-xxxxx). Il a donc fallu tablir une table de correspondance entre les erreurs ORACLE et des noms dexceptions. Cette correspondance existe dj pour les erreurs les plus frquentes (cf. tableau plus bas). Pour les autres, il faudra crer une correspondance explicite. Enfin, chaque erreur ORACLE correspond un code SQL (SQLCODE) que lon peut tester dans le langage hte (PL/SQL, Pro*C, etc. ...). Ce code est nul lorsque linstruction se passe bien et ngatif sinon. Voici quelques exemples dexceptions prdfinis et des codes correspondants :

Nom dexception CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND PROGRAM_ERROR ROWTYPE_MISMATCH TIMEOUT_ON_RESOURCE TOO_MANY_ROWS ZERO_DIVIDE

Erreur ORACLE ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01017 ORA-01403 ORA-06501 ORA-06504 ORA-00051 ORA-01422 ORA-01476

SQLCODE -6511 -1 -1001 -1722 -1017 +100 -6501 -6504 -51 -1422 -1476

Page 42/83

Oracle PL/SQL www.tellora.fr

Signification des erreurs Oracles prsentes ci-dessus : CURSOR_ALREADY_OPEN : tentative douverture dun curseur dj ouvert.. DUP_VAL_ON_INDEX : violation de lunicit lors dune mise jour dtecte au niveau de lindex unique. INVALID_CURSOR : opration incorrecte sur un curseur, comme par exemple la fermeture dun curseur qui na pas t ouvert. INVALID_NUMBER : chec de la conversion dune chane de caractres en numrique. LOGIN_DENIED : connexion la base choue car le nom utilisateur ou le mot de passe est invalide. NO_DATA_FOUND : dclench si la commande SELECT INTO ne retourne aucune ligne ou si on fait rfrence un enregistrement non initialise dun tableau PL/SQL. PROGRAM_ERROR : problme gnral d au PL/SQL. ROWTYPE_MISMATCH : survient lorsque une variable curseur dun programme hte retourne une valeur dans une variable curseur dun bloc PL/SQL qui na pas le mme type. TIMEOUT_ON_RESOURCE : dpassement du temps dans lattente de libration des ressources (li aux paramtres de la base). TOO_MANY_ROWS : la commande SELECT INTO retourne plus dune ligne. ZERO_DIVIDE : tentative de division par zro.

1.21 Implmenter des exceptions utilisateurs


Principe gnral : Dclarer chaque exception dans la partie DECLARE, Prciser le dclenchement de lexception (dans un bloc BEGIN ... END), Dfinir le traitement effectuer lorsque lexception survient dans la partie EXCEPTION.

DECLARE ... nom_erreur EXCEPTION; ... BEGIN ... IF (anomalie) THEN RAISE nom_erreur; END IF; ... EXCEPTION WHEN nom_erreur THEN traitement; END;

Page 43/83

Oracle PL/SQL www.tellora.fr

Exemple Nous allons slectionner un employ et dclencher une exception si cet employ na pas dadresse. Le traitement de lexception consiste remplir la table des employs sans adresse (table cre par ailleurs).

SQL> desc employe_sans_adresse Name Null? Type ------------------------------- -------- ---ID_EMP NUMBER NOM_EMP CHAR(20)

SQL> select * from employe; ID_EMP NOM ADRESSE CODEPOST VILLE -------------- ---------------------- ------- --------1 MOREAU 28 rue Voltaire 75016 Paris 2 DUPOND 12 rue Gambetta 92700 Colombes 3 DURAND 3 rue de Paris 92600 Asnires 4 BERNARD 10 avenue d'Argenteuil 92600 Asnires 5 BRUN TEL ------47654534 42421256 47935489 47931122

Contenu du script :

excep.sql DECLARE ex_emp_sans_adresse v_emp_id_emp v_emp_nom v_emp_adresse BEGIN SELECT Id_emp, Nom, adresse INTO v_emp_Id_emp, v_emp_nom, v_emp_adresse FROM employe WHERE destination = Marquises; IF v_emp_adresse IS NULL THEN RAISE ex_emp_sans_adresse; END IF; EXCEPTION WHEN ex_emp_sans_adresse THEN insert into employe_sans_adresse values (v_emp_id_emp, v_emp_nom); END; /

EXCEPTION; employe.id_emp%TYPE; employe.nom %TYPE; employe.adresse%TYPE;

Page 44/83

Oracle PL/SQL www.tellora.fr

Compilation et Vrification :

SQL> @excep PL/SQL procedure successfully completed. SQL> select * from employe_sans_adresse; ID_EMP NOM_EMP --------- -------------------5 BRUN

1.22 Implmenter des erreurs Oracle


Il peut sagir dexception dont le nom est prdfini ou non. Exception ORACLE dont le nom est prdfini

Il suffit de prciser le traitement dans le module EXCEPTION. Aucune dclaration nest ncessaire. Exemple de gestion de lexception prdfinie NO_DATA_FOUND :

DECLARE ... BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN traitement; END;

Exception ORACLE dont le nom nest pas prdfini

Il va falloir crer une correspondance entre le code erreur ORACLE et le nom de lexception. Ce nom est choisi librement par le programmeur. Un nommage vocateur est largement prconis et il faut viter les noms comme erreur 1023, ...

Page 45/83

Oracle PL/SQL www.tellora.fr

Pour affecter un nom un code erreur, on doit utiliser une directive compile (pragma) nomme EXCEPTION_INIT. Le nom de lexception doit tre dclar comme pour les exceptions utilisateurs.

Prenons lexemple du code erreur -1400 qui correspond labsence dun champ obligatoire.
DECLARE champ_obligatoire EXCEPTION; PRAGMA EXCEPTION_INIT (champ_obligatoire, -1400); BEGIN ... EXCEPTION WHEN champ_obligatoire THEN traitement; END;

Contrairement aux exceptions utilisateurs on ne trouve pas de clause RAISE. Le code SQL -1400 est gnr automatiquement, et il en est donc de mme de lexception champ_obligatoire qui lui est associe. Le module EXCEPTION permet galement de traiter un code erreur qui nest trait par aucune des exceptions. Le nom gnrique de cette erreur (exception) est OTHERS. Dans la clause WHEN OTHERS THEN ... on pourra encapsuler le code erreur SQLCODE.

EXCEPTION WHEN exception1 THEN traitement1; WHEN exception2 THEN traitement2; WHEN OTHERS THEN traitement3;

Page 46/83

Oracle PL/SQL www.tellora.fr

1.23 Fonctions pour la gestion des erreurs


SQLCODE SQLERRM Renvoie le code de lerreur courante (0 si OK <0 sinon) (code_erreur) Renvoie le libell correspondant au code erreur pass en argument.

En pratique, SQLERRM est toujours utilis avec SQLCODE comme argument.

excep3.sql set serveroutput on DECLARE ex_emp_sans_adresse v_emp_Id_emp v_emp_nom v_emp_adresse message_erreur BEGIN SELECT Id_emp, Nom, adresse into v_emp_Id_emp, v_emp_Nom, v_emp_adresse FROM emp WHERE Id_emp = 6; IF v_emp_adresse IS NULL THEN RAISE ex_emp_sans_adresse; END IF; EXCEPTION WHEN ex_emp_sans_adresse THEN insert into emp_sans_adresse values ( v_emp_Id_emp, v_emp_nom); WHEN OTHERS THEN message_erreur := SUBSTR (SQLERRM(SQLCODE),1,30); dbms_output.put_line(message_erreur); END; /

EXCEPTION; employe.Id_emp%TYPE; employe.Nom%TYPE; employe.adresse%TYPE; VARCHAR2(30);

Rsultats :

SQL> @excep3 ORA-01403: no data found PL/SQL procedure successfully completed.

Page 47/83

Oracle PL/SQL www.tellora.fr

1.24 Exemples de programmes PL/SQL


Script insrant des lignes dans la table EMPLOYE afin de simuler de lactivit sur la base de donnes.

-- redirection de la sortie dans un fichier journal SPOOL SimulerActivite.log create sequence seq_emp increment by 1 start with 30 order ; prompt Tapez une touche pour continuer ! pause set serveroutput on -- simulation de l'activit DECLARE erreur_Oracle varchar2(30) ; v_nombre INTEGER := 0; BEGIN FOR i IN 1..10000 LOOP insert into opdef.employe values (seq_emp.nextval, 'TOURNESOL', 1500, 'Professeur',1); select Max(id_emp) INTO v_nombre from opdef.employe; update opdef.employe set nom='Martin' where id_emp=v_nombre; COMMIT; END LOOP; dbms_output.put_line ( '-- insertions effectues --') ; SELECT COUNT(id_emp) INTO v_nombre FROM opdef.employe; IF v_nombre > 20000 THEN DELETE FROM opdef.employe WHERE id_emp > 20 ; COMMIT; END IF; EXCEPTION When NO_DATA_FOUND dbms_output.put_line (Problme !) ; WHEN DUP_VAL_ON_INDEX THEN NULL; WHEN OTHERS THEN erreur_Oracle := substr (sqlerrm(sqlcode),1,30) ; dbms_output.put_line (erreur_Oracle) ; ROLLBACK; END; /

Page 48/83

Oracle PL/SQL www.tellora.fr

Afficher lidentifiant et la destination d'un numro de vol saisi.

-- appel du package Oracle qui gre l affichage set serveroutput on prompt accept saisir un numro de vol no_vol varchar2(30) ;

DECLARE erreur_Oracle

/* cration du type enregistrement typ_vol*/ type typ_vol is record ( v_novol vol.no_vol%type , v_dest vol.destination%type ) ; /* affectation du type typ_vol v_vol*/ v_vol typ_vol; BEGIN select into from where

no_vol, destination v_vol.v_novol, v_vol.v_dest vol no_vol = &no_vol ; ' ||

/* affichage et mise en forme du rsultat */ dbms_output.put_line (' vol : ' || v_vol.v_novol || ' *-* ' destination : ' || v_vol.v_dest ) ; EXCEPTION WHEN no_data_found then dbms_output.put_line ( '-- ce vol n''existe pas --') ; WHEN others then erreur_Oracle := substr (sqlerrm(sqlcode),1,30) ; dbms_output.put_line (erreur_Oracle) ; END ; /

1.25 Compilation native du code PL/SQL


Avec Oracle9i, les units de programmes crites en PL/SQL peuvent tre compiles en code natif stock dans des librairies partages : Les procdures sont traduites en C, compiles avec un compilateur C standard et linkes avec Oracle

Page 49/83

Oracle PL/SQL www.tellora.fr

Surtout intressant pour du code PL/SQL qui fait du calcul intensif : Pas pour du code qui excute beaucoup de requtes SQL

Mise en oeuvre
Modifier le fichier make file fourni en standard pour spcifier les chemins et autres variables du systme. Sassurer quun certain nombre de paramtres sont correctement positionns (au niveau de linstance ou de la session) : PLSQL_COMPILER_FLAGS : indicateurs de compilation ; mettre la valeur NATIVE (INTERPRETED par dfaut) PLSQL_NATIVE_LIBRARY_DIR : rpertoire de stockage des librairies gnres lors de la compilation native PLSQL_NATIVE_MAKE_UTILITY : chemin daccs complet vers lutilitaire de make PLSQL_NATIVE_MAKE_FILE_NAME : chemin daccs complet vers le fichier make file

Compiler le ou les programme(s) dsirs. Vrifier le rsultat dans la vue DBA_STORED_SETTING (ou consurs USER_ et ALL_)du dictionnaire. Le make file par dfaut est : $ORACLE_HOME/plsql/spnc_makefile.mk.

1.26 Transactions autonomes


Avant la version 8i du PL/SQL chaque session Oracle pouvait avoir au plus une transaction active un instant donne. En dautres termes toutes les modifications effectues dans la session taient soit totalement sauvegardes, soit totalement annules. A partir de la version 8i dOracle, il est possible dexcuter et de sauvegarder ou dannuler certains ordres DML (INSERT, UPDATE, DELETE) sans affecter la totalit de la transaction. Lorsque vous dfinissez un bloc PL/SQL (bloc anonyme, fonction, procdure, procdure package, fonction package, trigger) comme une transaction autonome, vous isolez la DML de ce bloc du contexte de la transaction appelante. Ce bloc devient une transaction indpendante dmarre par une autre transaction appele transaction principale.

Page 50/83

Oracle PL/SQL www.tellora.fr

A lintrieur du bloc de la transaction autonome, la transaction principale est suspendue. Vous pouvez effectuer vos oprations SQL, les sauvegarder ou les annuler, puis revenir la transaction principale.

Transaction Principale

Procedure ajouter_emp() Is BEGIN Update Update Savepoint commencer_ajout ; Insert Commit ; EXCEPTION When others Then Rollback to commencer_ajout; Journaliser ( commit SQLCODE, SQLERRM); END ; END ; / / BEGIN Insert into journal Values ( Code, texte, USER, SYDATE ) ; Procedure journaliser Is PRAGMA AUTONOMOUS_TRANSACTION Transaction Autonome

La transaction principale est suspendue pendant le droulement de la transaction autonome. La dclaration dune transaction autonome ce fait en utilisant le mot cl :

PRAMA AUTONOMOUS_TRANSACTION;

Page 51/83

Oracle PL/SQL www.tellora.fr

Cette directive demande au compilateur PL/SQL de dfinir un bloc PL/SQL comme autonome ou indpendant. Tous types de blocs cits ci-dessous peuvent tre des transaction autonomes : Blocs PL/SQL de haut niveau (mais non imbriqus. Fonctions et procdures, dfinies dans un package ou autonomes Mthodes (fonctions et procdures) de type objet Triggers de base de donnes

Lors de lexcution dune transaction autonome il vous faut inclure dans le bloc PL/SQL une instruction ROLLBACK ou COMMIT afin de grer la fin de transaction.

Vous dfinirez une transaction autonome ds que vous voudrez isoler les modifications faites du contexte de la transaction appelante. Voici quelques ides dutilisation : Mcanisme de journalisation Dune part vous voulez stocker une erreur dans une table de journalisation, dautre part suite cette erreur vous voulez annuler la transaction principale. Et vous ne voulez pas annuler les autres entres de journal. Commit et Rollback dans vos triggers de base de donnes Si vous dfinissez un trigger comme une transaction autonome, alors vous pouvez excuter un commit et un rollback dans ce code. Compteur de tentatives de connexion. Supposons que vous vouliez laisser un utilisateur essayer daccder une ressource N fois avant de lui refuser laccs ; vous voulez galement tracer les tentatives effectues entre les diffrentes connexions la base. Cette persistance ncessite un COMMIT, mais qui resterait indpendant de la transaction. Frquence dutilisation dun programme Vous voulez tracer le nombre dappels un mme programme durant une session dapplication. Cette information ne dpend pas de la transaction excute par lapplication et ne laffecte pas. Composants dapplications rutilisables Cette utilisation dmontre tout lintrt des transactions autonomes. A mesure que nous avanons de le monde dinternet , il devient plus important de pouvoir disposer dunits de travail autonomes qui excutent leur tches sans effet de bord sur lenvironnement appelant.

Page 52/83

Oracle PL/SQL www.tellora.fr

Rgles et limites des transactions autonomes


Un ensemble de rgles sont suivre lors de lutilisation des transactions autonomes : Seul un bloc anonyme de haut niveau peut tre transform en transaction autonome. Si une transaction autonome essaie daccder une ressource gre par la transaction principale, un DEADLOCK peut survenir (la transaction principale ayant te suspendue). Vous ne pouvez pas marquer tous les modules dun package comme autonomes avec une seule dclaration PRAGMA. Pour sortir sans erreur dune transaction autonome, vous devez excuter un commit ou un rollback explicite. En cas doubli vous dclencherez lexception : ORA-06519 : transaction autonome active dtecte et annule. Dans une transaction autonome vous ne pouvez pas effectuer un ROLLBACK vers un point de sauvegarde (SAVEPOINT) dfini dans la transaction principale. Si vous essayez de le faire vous dclecherez lexception suivante : ORA-01086 : le point de sauvegarde votre point de sauvegarde na jamais t tabli Le paramtre TRANSACTION du fichier dinitialisation, prcise le nombre maximum de transactions concurrentes autorises dans une session . En cas de dpassement de cette limite vous recevrez lexception suivante : ORA-01574 : nombre maximum de transactions concurrentes dpass.

Page 53/83

Oracle PL/SQL www.tellora.fr

12 Procdures, Fonctions et Packages


Une procdure est une unit de traitement qui contient des commandes SQL relatives au langage de manipulation des donnes, des instructions PL/SQL, des variables, des constantes, et un gestionnaire derreurs. Une fonction est une procdure qui retourne une valeur. Un package est un agrgat de procdures et de fonctions.

Les packages, procdures, ou fonctions peuvent tre appels depuis toutes les applications qui possdent une interface avec ORACLE (SQL*PLUS, Pro*C, SQL*Forms, ou un outil client particulier comme NSDK par exemple).

Les procdures (fonctions) permettent de : Rduire le trafic sur le rseau (les procdures sont locales sur le serveur) Mettre en oeuvre une architecture client/serveur de procdures et rendre indpendant le code client de celui des procdures ( lAPI prs) Masquer la complexit du code SQL (simple appel de procdure avec passage darguments) Mieux garantir lintgrit des donnes (encapsulation des donnes par les procdures) Scuriser laccs aux donnes (accs certaines tables seulement travers les procdures) Optimiser le code (les procdures sont compiles avant lexcution du programme et elles sont excutes immdiatement si elles se trouvent dans la SGA (zone mmoire gre par ORACLE). De plus une procdure peut tre excute par plusieurs utilisateurs.

Les packages permettent de regrouper des procdures ou des fonctions (ou les deux). On vite ainsi davoir autant de sources que de procdures. Le travail en quipes et larchitecture applicative peuvent donc plus facilement sorganiser du ct serveur, o les packages regrouperont des procdures forte cohsion intra (Slection de tous les articles, Slection dun article, Mise jour dun article, Suppression dun article, Ajout dun article). Les packages sont ensuite utiliss comme de simples librairies par les programmes clients. Mais attention, il sagit de librairies distantes qui seront processes sur le serveur et non en locale (client/serveur de procdures).

Dans ce contexte, les quipes de dveloppement doivent prendre garde ne pas travailler chacune dans leur coin . Les dveloppeurs ne doivent pas perdre de vue la logique globale de lapplication et les scnarios dactivit des oprateurs de saisie. A lextrme, on peut finir par coder une procdure extrmement sophistique qui nest sollicite quune fois par an pendant une seconde. Ou encore, une gestion complexe de verrous pour des accs concurrent qui nont quasiment jamais lieu.

Page 54/83

Oracle PL/SQL www.tellora.fr

13 Procdures
Les procdures ont un ensemble de paramtres modifiables en entre et en sortie.

1.26.1

Crer une procdure

Syntaxe gnrale :

procedure_general.sql

create or replace procedure nom_procedure (liste darguments en INPUT ou OUTPUT) is


dclaration de variables, de constantes, ou de curseurs

begin
... ...

exception
... ...

end; /
Au niveau de la liste darguments : les arguments sont prcds des mots rservs IN, OUT, ou IN OUT, ils sont spars par des virgules, le mot cl IN indique que le paramtre est pass en entre, le mot cl OUT indique que le paramtre est modifi par la procdure, on peut cumuler les modes IN et OUT (cas du nombre de lignes demandes une procdure dextraction).

Contrairement au PL/SQL la zone de dclaration na pas besoin dtre prcd du mot rserv DECLARE. Elle se trouve entre le IS et le BEGIN.

Page 55/83

Oracle PL/SQL www.tellora.fr

La dernire ligne de chaque procdure doit tre compose du seul caractre / pour spcifier au moteur le dclenchement de son excution.

Exemple de procdure qui modifie le salaire dun employ. Arguments : Identifiant de lemploye, Taux

modifie_salaire.sql create procedure modifie_salaire (id in number, taux in number) is begin update employe set salaire=salaire*(1+taux) where Id_emp= id;

exception when no_data_found then raise_application_error (-20010,'Employ inconnu :'||to_char(id)); end; /

Compilation de la procdure modifie_salaire


Il faut compiler le fichier sql qui sappelle ici modifie_salaire.sql (attention dans cet exemple le nom du script correspond celui de la procdure, cest bien le nom du script sql quil faut passer en argument la commande start).

SQL> start modifie_salaire Procedure created.

Appel de la procdure modifie_salaire


SQL> begin 2 3 4 modifie_salaire (15,-0.5); end; /

PL/SQL procedure successfully completed.

Page 56/83

Oracle PL/SQL www.tellora.fr

Lutilisation dun script qui contient les 4 lignes prcdentes est bien sr galement possible :

demarre.sql begin modifie_salaire (15,-0.5); end; /

Lancement du script demarre.sql :

SQL> start demarre PL/SQL procedure successfully completed.

1.27 Modifier une procdure


La clause REPLACE permet de remplacer la procdure (fonction) si elle existe dj dans la base :

create or replace procedure modifie_salaire ...

Par dfaut on peut donc toujours la spcifier.

1.28 Correction des erreurs


Si le script contient des erreurs, la commande show err permet de visualiser les erreurs. Pour visualiser le script global : commande l (lettre l)

pour visualiser la ligne 4 : commande l4 pour modifier le script sous VI sans sortir de sa session SQL*PLUS commande !vi modifie_salaire.sql

SQL> start modifie_salaire Warning: Procedure created with compilation errors. SQL> show err Errors for PROCEDURE MODIFIE_SALAIRE:

Page 57/83

Oracle PL/SQL www.tellora.fr

LINE/COL ERROR -------- ---------------------------------------------------------4/8 PLS-00103: Encountered the symbol "VOYAGE" when expecting one of the following: := . ( @ % ; Resuming parse at line 5, column 21. SQL> l4 4* update employe set salaire=salaire*(1+taux)

Autre exemple de procdure qui modifie le salaire de chaque employ en fonction de la valeur courante du salaire : Arguments : aucun Cette procdure utilise deux variables locales (ancien_salaire, nouveau_salaire) et un curseur (curs1).

maj_salaire.sql create or replace procedure salaire is CURSOR curs1 is select salaire from employe for update; ancien_salaire number; nouveau_salaire number; BEGIN OPEN curs1; LOOP FETCH curs1 into ancien_salaire; EXIT WHEN curs1%NOTFOUND; if ancien_salaire >=0 and ancien_salaire <= 50 then nouveau_salaire := 4*ancien_salaire; elsif ancien_salaire >50 and ancien_salaire <= 100 then nouveau_salaire := 3*ancien_salaire; else nouveau_salaire = :ancien_salaire; end if; update employe set salaire = nouveau_salaire where current of curs1; END LOOP; CLOSE curs1; END; /

Page 58/83

Oracle PL/SQL www.tellora.fr

Si lon ne dsire pas faire de procdure mais crer une commande SQL (procdure anonyme) qui ralise laction prcdente, il suffit de commencer le script par :

DECLARE CURSOR curs1 is ....

Ds la compilation le script est excut.

Page 59/83

Oracle PL/SQL www.tellora.fr

14 Fonctions
Une fonction est une procdure qui retourne une valeur. La seule diffrence syntaxique par rapport une procdure se traduit par la prsence du mot cl RETURN. Une fonction prcise le type de donne quelle retourne dans son prototype (signature de la fonction). Le retour dune valeur se traduit par linstruction RETURN (valeur).

1.29 Crer une fonction


Syntaxe gnrale :

fonction_general.sql

create or replace function nom_fonction (liste darguments en INPUT ou OUTPUT) return type_valeur_retour is
dclaration de variables, de constantes, ou de curseurs

begin
... return (valeur);

exception
...

end; /

Page 60/83

Oracle PL/SQL www.tellora.fr

Exemple de fonction qui retourne la moyenne des salaires des employs par bureau (regroup par responsable du bureau) .

- Argument : Identifiant de lemploy - Retour : moyenne du bureau

ca.sql create or replace function moyenne_salaire (v_Id_employe IN NUMBER) return NUMBER is valeur NUMBER; begin select avg(salaire) into valeur from employe groupe by emp_id_emp having emp_id_emp=v_id_emp; return (valeur); end; /

Page 61/83

Oracle PL/SQL www.tellora.fr

15 Packages
Comme nous lavons vu un package est un ensemble de procdures et de fonctions. Ces procdures pourront tre appeles depuis nimporte quel langage qui possde une interface avec ORACLE (Pro*C, L4G, ...).

Prrogramme PL/SQL, ou Pro*C, ou ..

Package PAQUET
Procdure P1 (arguments) BEGIN ..... END;

............. a := 1; b := 2; c := 4; .............. PAQUET.P1 (a , b , ...); ..............

Procdure P2 (arguments) BEGIN .... END;

PAQUET.P2 (c , b , ...); .............. .............. ..............

SERVEUR ORACLE
Principe gnral dutilisation dun package

Page 62/83

Oracle PL/SQL www.tellora.fr

La structure gnrale dun package est la suivante :

package_general.sql CREATE OR REPLACE PACKAGE nom_package IS dfinitions des types utiliss dans le package; prototypes de toutes les procdures et fonctions du package; END nom_package; / CREATE OR REPLACE PACKAGE BODY nom_package IS dclaration de variables globales; dfinition de la premire procdure; dfinition de la deuxime procdure; etc. ... END nom_package; /

Un package est compos dun en tte et dun corps : Len tte comporte les types de donnes dfinis et les prototypes de toutes les procdures (fonctions) du package. Le corps correspond limplmentation (dfinition) des procdures (fonctions).

Le premier END marque la fin de len tte du package. Cette partie doit se terminer par / pour que len tte soit compil. Ensuite le corps (body) du package consiste implmenter (dfinir) lensemble des procdures ou fonctions qui le constitue. Chaque procdure est dfinie normalement avec ses clauses BEGIN ... END. Le package se termine par / sur la dernire ligne.

Page 63/83

Oracle PL/SQL www.tellora.fr

Exemple Package comportant deux procdures (augmentation de salaire et suppression de vendeur) :

paquet1.sql create or replace package ges_emp is procedure augmente_salaire (v_Id_emp in number, v_taux_salaire in number); function moyenne_salaire (v_Id_employe IN NUMBER) return NUMBER; end ges_emp; / create or replace package body ges_emp is procedure augmente_salaire (v_Id_emp in number, v_taux_salaire in number) is begin update employe set salaire= salaire * v_taux_salaire where Id_emp= v_Id_emp; commit; end augmente_salaire;

function moyenne_salaire (v_Id_employe IN NUMBER) return NUMBER is valeur NUMBER; begin select avg(salaire) into valeur from employe groupe by emp_id_emp; return (valeur); end moyenne_salaire;

end ges_emp; /

Page 64/83

Oracle PL/SQL www.tellora.fr

Compilation
SQL> @paquet1

Package created.

Package body created.

Excution
Excution de la procdure augmente_salaire du package ges_emp
SQL> begin 2 3 4 ges_emp.augmente_salaire(4,50); end; /

PL/SQL procedure successfully completed.

Tests
SQL> select * from EMPLOYE;

ID_EMP NOM

SALAIRE EMPLOI

EMP_ID_EMP

---------- -------------------------- ------- ------------------ ---------1 Gaston 2 Spirou 3 Titeuf 4 Marilyne 1700 Directeur 2000 Pilote 1800 Stewart 4000 Hotesse de l'Air 1 2 1

Nous constatons que Marilyne a un salaire de 4000 euros alors quil tait de 2000 euros.

Page 65/83

Oracle PL/SQL www.tellora.fr

16 Triggers
Un trigger permet de spcifier les ractions du systme dinformation lorsque lon touche ses donnes. Concrtement il sagit de dfinir un traitement (un bloc PL/SQL) raliser lorsquun vnement survient. Les vnements sont de six types (dont trois de base) et ils peuvent porter sur des tables ou des colonnes : BEFORE AFTER BEFORE AFTER BEFORE AFTER INSERT INSERT UPDATE UPDATE DELETE DELETE

Pour bien situer le rle et lintrt des TRIGGERS, nous prsentons ici une vue gnrale des contraintes sur le Serveur :

Procdures Select Insert Update Delete Etc... Trigger Contraintes d'intgrites Not Null Primary Key Unique Key Foreign Key Contrainte Check

kmlkmlkm

Tables

Type Longueur

Vue gnrale des contraintes

Page 66/83

Oracle PL/SQL www.tellora.fr

Les TRIGGERS permettent de : renforcer la cohrence des donnes dune faon transparente pour le dveloppeur, mettre jour automatiquement et dune faon cohrente les tables (ventuellement en dclenchant dautres TRIGGERS).

Rappelons que les contraintes dintgrit sont garantes de la cohrence des donnes (pas de ligne de commande qui pointe sur une commande inexistante, pas de code postal avec une valeur suprieur 10000, pas de client sans nom, etc. ...).

Les TRIGGERS et les contraintes dintgrit ne sont pas de mme nature mme si les deux concepts sont lis des dclenchements implicites. Un trigger sattache dfinir un traitement sur un vnement de base comme Si INSERTION dans telle table alors faire TRAITEMENT . Lintrt du TRIGGER est double. Il sagit dune part de permettre lencapsulation de lordre effectif (ici INSERTION) de mise jour de la base, en vrifiant la cohrence de lordre. Dautre part, cest la possibilit dautomatiser certains traitements de mise jour en cascade.

Les traitements dun TRIGGER (insert, update, delete) peuvent dclencher dautres TRIGGERS ou solliciter les contraintes dintgrit de la base qui sont les derniers gardiens de laccs effectif aux donnes.

1.30 Crer un trigger


Principes gnraux Lorsque lon cr un TRIGGER on doit prciser les vnements que lon dsire grer. On peut prciser si lon dsire excuter les actions du TRIGGER pour chaque ligne mise jour par la commande de lvnement ou non (option FOR EACH ROW). Par exemple, dans le cas dune table que lon vide entirement (delete from table), loption FOR EACH ROW nest pas forcment ncessaire.

Lorsque lon dsire mmoriser les donnes avant (la valeur dune ligne avant lordre de mise jour par exemple) et les donnes aprs (les arguments de la commande) on utilisera les mots rservs : OLD et NEW.

Page 67/83

Oracle PL/SQL www.tellora.fr

Exemple Nous allons prendre lexemple dun trigger qui met automatiquement jour les voyages (colonne qte de la table voyage) lorsque lon modifie (cration, modification, suppression) les commandes de nos clients (table ligne_com).

trigger.sql CREATE OR REPLACE TRIGGER modif_voyage AFTER DELETE OR UPDATE OR INSERT ON ligne_com FOR EACH ROW DECLARE quantite_voyage

voyage.qte%TYPE;

BEGIN IF DELETING THEN /* on met jour la nouvelle quantite de voyages annuel par employe */ UPDATE voyage SET qte = qte + :OLD.qte WHERE Id_voyage = :OLD.Id_voyage; END IF; IF INSERTING THEN UPDATE voyage SET qte = qte - :NEW.qte WHERE Id_voyage = :NEW.Id_voyage; END IF; IF UPDATING THEN UPDATE voyage SET Qte = qte + (:OLD.qte - :NEW.qte) WHERE Id_voyage = :NEW.Id_voyage; END IF; END; /

Nous allons tester ce trigger dans lenvironnement suivant :

Etat des voyages avant mise jour :

SQL> select * from article where Id_voyage between 1 and 4;

ID_VOYAGE DESIGNATION

PRIXUNIT

QTE

--------- -------------------- --------- --------2 Tahiti 4 Marquises 1330 1350 10 10

Page 68/83

Oracle PL/SQL www.tellora.fr

Etat des commandes avant mise jour :

SQL> select * from ligne_com where Id_voyage between 2 and 4;

NO_COMM

NUMLIGNE ID_VOYAGE

QTECOM

--------- ----------- --------- --------1 1 2 1 2 1 2 4 2 10 10 4

Test 1

SQL> delete from ligne_com where No_comm=2 and No_ligne=1;

1 row deleted.

Vrifions que le traitement associ au trigger sest bien effectu :

SQL> select * from voyage where Id_voyage between 1 and 4;

ID_VOYAGE DESIGNATION

PRIXUNIT

QTE

--------- -------------------- --------- --------2 Tahiti 4 Marquises 1330 1350 14 10

Le voyage 2 a augment de la quantit libre par la ligne de commande supprime.

Test2

SQL> update ligne_com set qtecom=2 where No_comm=1 and No_ligne=2;

1 row updated.

Page 69/83

Oracle PL/SQL www.tellora.fr

SQL>

select * from voyage where Id_voyage between 1 and 4;

ID_VOYAGE DESIGNATION

PRIXUNIT

QTE

--------- -------------------- --------- --------2 Tahiti 4 Marquises 1330 1350 14 18

Le voyage N 4 a augment de la diffrence (10 - 2 = 8) entre la nouvelle quantit commande et lancienne. La commande rollback scrute toutes les transactions non encore commites. Par consquent, elle porte la fois sur les commandes explicites que nous avons tapes mais galement sur les traitements du trigger.

SQL> rollback; Rollback complete.

Etat des voyages aprs le rollback :

SQL> select * from voyage where Id_voyage between 2 and 4;

ID_VOYAGE DESIGNATION

PRIXUNIT

QTE

--------- -------------------- --------- --------2 Tahiti 4 Marquises 1330 1350 10 10

Etat des commandes aprs le rollback :

SQL> select * from ligne_com where Id_voyage between 2 and 4;

NO_COMM

NUMLIGNE

ID_VOYAGE

QTECOM

--------- ------------ --------- --------1 1 2 1 2 1 2 4 2 10 10 4

Page 70/83

Oracle PL/SQL www.tellora.fr

1.31 Activer un trigger


Un trigger peut tre activ ou dsactiv respectivement par les clauses ENABLE et DISABLE.

SQL> alter trigger modif_voyage disable;

Trigger altered.

1.32 Supprimer un Trigger


Comme pour tout objet ORACLE :

SQL> drop trigger modif_voyage;

Trigger dropped.

Une instruction commit ou rollback valide ou annule toutes les transactions implicites cres par un trigger. A partir de la version 10g il est possible de coder une instruction commit ou rollback dans un trigger.

Page 71/83

Oracle PL/SQL www.tellora.fr

1.33 Triggers rattach aux vues


Jusqu la version 7 dOracle, les triggers ne pouvaient tre rattachs quaux tables. A partir de la version 8 dOracle il est possible de crer des triggers sur les vues en utilisant le mot cl : INSTEAD.

create or replace trigger tr_voyage instead of delete on v_voyage for each row begin delete from voyage where id_voyage = :old.id_voyage; dbms_output.put_line('le trigger fonctionne !!!'); end; /

Comme nous le voyons ce trigger ne scrit pas tout fait de la mme manire que les prcdents, sont comportement par contre reste le mme. Lorsque le trigger est dclench par vnement, la table partir de laquelle est construite la vue est modifie tout comme la vue.

1.34 Triggers sur vnements systmes


A partir de la version 8 dOracle, il est possible dcrire des Triggers rattachs des vnements systmes dadministration de base de donnes. Ils se dclenchent sur un vnement tels que : After startup Before shutdown After servererror After logon Befor logiff {before|after} alter {before|after} analyse {before|after} {audit|noaudit} {before|after} {comment|DDL|drop|rename|truncate} {before|after} create {before|after} grant {before|after} revoke

Page 72/83

Oracle PL/SQL www.tellora.fr

create table log_actions (timestamp date,sysevent varchar2(20), login_user varchar2(30), instance_num number, database_name varchar2(50), dictionary_obj_type varchar2(20), dictionary_obj_name varchar2(30), dictionary_obj_owner varchar2(30), server_error number ); create or replace trigger on_shutdown befor shutdown on database begin insert into log_actions (timestamp,sysevent,login_user,server_error,database_name) values (sysdate,ora_sysevent,ora_login_user,ora_server_error(1),ora_database_name); end; /

Page 73/83

Oracle PL/SQL www.tellora.fr

17 Architecture du moteur PL/SQL


Dans ce chapitre sont expliqus quelques termes utiliss reprsentant la faon dont Oracle traite le code source PL/SQL. Compilateur PL/SQL Composant Oracle qui analyse le code source P/SQL en vrifiant la syntaxe, rsoud les noms, vrifie la smantique et gnre 2 formes binaires de code stock. DIANA DIANA (Distributed Intermediate Annoted Notation pour Ada), cest une forme intermdiaire du PL/SQL et de ses dpendances gnr par le compilateur. Il effectue des analyses smantiques et syntaxiques. inclus une spcification dappel de vos objets stocks (donnes dentte du programme, noms de paramtres, squences, position et type des donnes). Pseudo-code Binaire Forme excutable du PL/SQL compil dsign parfois sous le terme de mcode ou Pcode . Ce pseudo code est quivalent un fichier objet. Moteur dexcution PL/SQL Machine virtuelle PL/SQL, qui excute le pseudo code binaire dun programme PL/SQL. Il effectue les appels ncessaires au moteur SQL du serveur et renvoie les rsultats lenvironnement dappel. Session Oracle Cot serveur cest lensemble des processus et lespace mmoire partag associ un utilisateur. Celui-ci est authentifi via une connexion rseau ou inter-processus. Chaque session a sa propre zone mmoire dans laquelle elle peut grer les donnes du programme sexcutant.

Regardons lexcution dun bloc anonyme qui ne fait rien prsente ci-dessous :

SQL*Plus

BEGIN SQL> BEGIN 2 3 4 NULL; END; / dexcution NULL; Compilateur PL/SQL Moteur

PL/SQL procedure succefull completed.

Page 74/83

Oracle PL/SQL www.tellora.fr

Droulement de lexcution : Lutilisateur compose le bloc ligne et envoie SQL*Plus une commande de dpart. SQL*Plus transmet lintgralit du bloc lexception du / au compilateur PL/SQL. Le compilateur PL/SQL essaie de compiler le bloc anonyme et cr des structures de donnes internes pour analyser le code et grer du pseudo code binaire. La premire phase correspond au contrle de syntaxe. Si la compilation russit, Oracle met le pseudo-code du bloc dans une zone mmoire partage. Sinon le compilateur renvoie un message derreur la session SQL*Plus. Pour finir le moteur dexcution PL/SQL intgre le pseudo-code binaire et renvoie un code de succs ou dchec la session SQL*Plus.

Ajoutons une requte imbrique au bloc PL/SQL et regardons les modifications quelle entrane. SQL*Plus

SQL> DECLARE 2 3 4 5 6 7 str VARCHAR(1) BEGIN select dummy INTO str FROM DUAL ; DECLARE END ; Str VARCHAR(1) / BEGIN

Select dummy INTO str PL/SQL procedure successfully FROM dual ; completed.

Compilateur PL/SQL

Compilateur SQL

Plan dexcution Select dummy FROM dual ; SQL

Moteur Dexcution PL/SQL Rsultat SQL

Moteur Dexcution SQL

Page 75/83

Oracle PL/SQL www.tellora.fr

Dans Oracle 9i le PL/SQL et le SQL partagent le mme analyseur syntaxique SQL. Dans les versions prcdentes le PL/SQL possdait son propre analyseur syntaxique SQL ce qui gnrait parfois des distorsions entre les ordres SQL saisis en ligne de commande et ceux excuts dans du PL/SQL.

Appel dune procdure stocke :

SQL*Plus BEGIN Proc_stocke; END ;

SQL> BEGIN 2 3 4 proc_stocke; END ; /

PL/SQL procedure successfully completed. Compilateur SQL> PL/SQL proc_stocke


Dictionnaire de donnes

Pseudocode Binaire Moteur dexcution PL/SQL Proc_stocke

Oracle

Droulement de lexcution : Le compilateur doit rsoudre la rfrence externe de proc_stocke pour savoir si elle se rfre un programme pour lequel lutilisateur possde un droit dexcution. Le DIANE de proc_stocke sera ncessaire pour savoir si le bloc anonyme effectue un appel lgal au programme stock. Lavantage est que lon dispose dj du pseudo-code binaire et du DIANA de la procdure stocke dans le dictionnaire de donnes Oracle. Oracle ne perd pas de temps en recompilation. Une fois le code lu sur le disque Oracle le stocke en mmoire dans une zone appele cache SQL qui rduira et liminera les entres/sortie.

Page 76/83

Oracle PL/SQL www.tellora.fr

1.35 Procdures stockes JAVA


Linstallation par dfaut du serveur Oracle ne contient pas seulement une machine virtuelle PL/SQL mais aussi une machine virtuelle JAVA. Vous pouvez crire un prototype de programme PL/SQL dont la logique est implmente dans une classe statique JAVA.

1.36 Procdures externes


Vous pouvez implmenter la partie excutable dun programme PL/SQL dans du code C personnalis, et lexcution Oracle excutera votre code dans un processus et dans un espace mmoire spar.

1.36.1

Ordres partags

Oracle peut partager le code source et les versions compiles dordres SQL et de blocs anonymes, mme sils sont soumis partir de diffrentes sessions, par diffrents utilisateurs.

Certaines conditions doivent tre remplies : La casse et les blancs des codes sources doivent correspondre exactement. Les rfrences externes doivent se rfrer au mme objet sous-jacent afin que le programme puisse tre partag. Les valeurs de donnes doivent tre fournies via des variables de liaison plutt que via des chanes littrales (ou alors le paramtre systme CURSOR_SHARING doit avoir la valeur appropries). Tous les paramtres de base influant loptimisateur SQL doivent correspondre (Par exemple Les sessions vocatrices doivent utiliser le mme langage.

En PL/SQL toute variable utilise dans un ordre SQL analys de manire statique devient automatiquement une variable de liaison. Si vous avez la bonne habitude de mettre les valeurs littrales dans des paramtres et des constantes et que dans vos ordres SQL vous faites rfrence ces variables, plutt quaux variables littrales, vous naurez pas de problmes de performances. Il est galement possible dutiliser des variables de liaison dans des blocs anonymes sous SQL*Plus.

VARIABLE combien NUMBER ; EXEC :combien := maxcats

Page 77/83

Oracle PL/SQL www.tellora.fr

1.37 Vues du dictionnaire de donnes


La recherche dinformation sur le serveur se fait en utilisant le dictionnaire de donnes Oracle en utilisant les vues destines au stockage des procdures stockes PL/SQL. Liste des vues utiles : SYS.OBJ$ (USER_OBJECTS) Sapplique tous les objets PL/SQL sauf les blocs anonymes. Contient les noms, types dobjets, status de compilation (VALID ou INVALID)

SYS.SOURCE$ (USER_SOURCE) Sapplique tous les objets PL/SQL sauf les blocs anonymes. Code source des procdures stockes.

SYS.TRIGGER$ (USER_TRIGGERS) Sapplique aux triggers. Code source et vnement de llment dclencheur.

SYS.ERROR$ (USER_ERRORS) Sapplique tous les objets PL/SQL sauf les blocs anonymes. Dernires erreurs pour la compilation la plus rcente (y compris pour les triggers)

SYS.DEPENDENCY$ (USER_DEPENDENCIES) Sapplique tous les objets PL/SQL sauf les blocs anonymes. Hirarchie de dpence dobjets.

SYS.SETTING$ (USER_STORED_SETTINGS) Sapplique tous les objets PL/SQL sauf les blocs anonymes. Options du compilateur PL/SQL.

SYS.IDLUB1$, SYS.IDL_CHAR$, SYS.IDL_UB2$, SYS.IDL_SB4$ (USER_OBJECT_SIZE) Sapplique tous les objets PL/SQL sauf les blocs anonymes. Stockage interne du DIANA, du pseudo-code binaire. Rpertoire dfini dans le paramtre PLSQL_NATIVE_LIBRARY_DIR Tout ce qui a t compil de manire native. Fichiers objets partags, compils nativement en PL/SQL via du C.

Page 78/83

Oracle PL/SQL www.tellora.fr

18 Les dpendances
Il y a dpendance des objets (procdures, fonctions, packages et vues) lorsquils font rfrence des objets de la base tels quune vue (qui fait elle mme rfrence une ou plusieurs tables), une table, une autre procdure, etc Si lobjet en rfrence est modifi, il est ncessaire de recompiler les objets dpendants. Le comportement dun objet dpendant varie selon son type : Procdure ou fonction package

1.38 Dpendances des procdures et des fonctions


Il existe deux type de dpendance : Dpendance directe Dpendance indirecte

1.38.1

Dpendances directes

Le traitement de la procdure ou de la fonction fait explicitement rfrence lobjet modifi qui peut tre une table, une vue, une squence, un synonyme, ou une autre procdure ou fonction.

Exemple
Une table TAB1 sur laquelle travaille une procdure PROC1 Il y a dpendance directe de la procdure par rapport la table.

Pour connatre les dpendances directes on peut consulter les tables : USER|ALL|DBA_DEPENDANCIES

Page 79/83

Oracle PL/SQL www.tellora.fr

1.38.2

Dpendances indirectes

Il y a dpendance indirecte lorsque le traitement fait indirectement rfrence un autre objet Une vue lie une autre table Une vue lie une autre vue Un objet au travers dun synonyme

Exemple
Une table TAB1sur laquelle porte une vue VUE1 une procdure PROC1 travaille partir de la vue VUE1 Il y a dpendance indirecte de la procdure par rapport la table TAB1.

Pour connatre les dpendances indirectes on peut utiliser la procdure : Oracle_home/rdbms/admin/DEPTREE_FILL lie aux vues DEPTREE et IDEPTREE.

1.38.3

Dpendances locales et distantes

Dans le cas de dpendances locales, les procdures et les fonctions sont sur la mme base que les objets auxquels elles font rfrence. Dans le cas de dpendances distantes, les procdures et les fonctions sont sur une base diffrente de celle des objets auxquels elles font rfrence.

1.38.4

Impacte et gestion des dpendances

Chaque fois quun objet rfrenc par une procdure ou une fonction est modifi, le statut du traitement dpendant passe invalide. Il est alors ncessaire de le recompiler. Pour consulter le statut dun objet utiliser la vue USER|ALL|DBA_objects Si lobjet est sur la mme base locale, Oracle vrifie le statut des objets dpendants et les recompile automatiquement. Pour les objets sur bases distantes, Oracle nintervient pas, la re-compilation doit se faire manuellement.

Mme si Oracle re-compile automatiquement les procdures invalides, il est conseill de le faire manuellement afin dviter les contentions et doptimiser les traitements.

Pour re-compiler un objet utiliser la commande :

Page 80/83

Oracle PL/SQL www.tellora.fr

Alter {procedure|function|view} nom_objet COMPILE ;

1.39 Packages
La gestion des dpendances pour les packages est plus simple : Si on modifie une procdure externe au package, il faut recompiler le corps du package. Si on modifie un lment dans le corps du package, sans rien modifier dans la partie spcification, il ny a pas besoin de re-compiler le corps du package.

Alter package body nom_package COMPILE ;

Page 81/83

Oracle PL/SQL www.tellora.fr

19 Quelques packages intgrs


Oracle contient un certain nombre de packages utiles en dveloppement et en administration. Nous vous en prsentons ici quelques uns.

1.40 Le package DBMS_OUTPUT


Ce package permet de stocker de linformation dans un tampon avec les procdures PUT ou PUT_LINE. Il est possible de rcuprer linformation grce aux procdures GET et GET_LINE.

Liste des procdures : Get_line (ligne out varchar2, statut out integer) : extrait une ligne du tampon de sortie. Get_lines (lignes out varchar2, n in out integer) : extrait partir du tampon de sortie un tableau de n lignes. New_line : place un marqueur de fin de ligne dans le tampon de sortie. Put (variable|conatante in {varchar2|number|date} : combinaison de put et new_line. Enable (taille tampon in integer default 2000) : permet de mettre en route le mode trace dans une procdure ou une fonction. Disable : permet de dsactiver le mode trace dans une procdure ou une fonction.

1.41 Le package UTL_FILE


Ce package permet des programmes PL/SQL daccder la fois en lecture et en criture des fichiers systme. On peut appeler utl_file partir de procdures catalogues sur le serveur ou partir de modules rsidents sur la partie cliente de lapplication, comme Oracle forms.

Liste des procdures et fonctions : Fopen (location in varchar2, nom_fichier in varchar2, mode_ouverture in varchar2) return utl_file.file_type : cette fonction ouvre un fichier et renvoie un pointeur de type utl_file.file_type sur le fichier spcifi. Il faut avoir le droit douvrir un fichier dans le rpertoire spcifi. Pour cela il faut accder au paramtre utl_file_dir dans le fichier init.ora. Get_line (pointeur_fichier in utl_file.file_type, ligne out varchar2) : cette procdure lit une ligne du fichier spcifi, sil est ouvert dans la variable ligne. Lorsquelle atteint la fin du fichier lexception no_data_found est dclenche.

Page 82/83

Oracle PL/SQL www.tellora.fr

Put_line (pointeur_fichier in utl_file.file_type, ligne out varchar2) : cette procdure insre des donnes dans un fichier et ajoute automatiquement une marque de fin de ligne. Lorsquelle atteint la fin du fichier, lexception no_data_found est dclenche. Put (pointeur_fichier utl_file.file_type, item in {varchar2|number|date}) : cette procdure permet dajouter des donnes dans le fichier spcifi. New_line (pointeur_fichier utl_file.type) : cette procdure permet dajouter une marque de fin de ligne la fin de la ligne courante. Putf (pointeur_fichier utl_file.file_type, format in varchar2, item1 in varchar2, [item2 in varchar2, ]) : cette procedure insre des donnes dans un fichier suivant un format. Fclose (pointeur_fichier in utl_file.file_type) : cette procdure permet de fermer un fichier. Fclose_all : cette procdure permet de fermer tous les fichiers ouverts. Is_open (pointeur_fichier in utl_file.file_type) return boolean : cette fonction renvoie TRUE si pointeur_fichier pointe sur un fichier ouvert.

1.42 Le package DBMS_SQL


Ce package permet daccder dynamiquement au SQL partir du PL/SQL. Les requtes peuvent tre construites sous la forme de chanes de caractres au moment de lexcution puis passes au moteur SQL. Ce package offre notamment la possibilit dexcuter des commandes DDL dans le corps du programme.

Liste des procdures et fonctions : Open_cursor return integer : cette fonction ouvre un curseur et renvoie un integer . Parse (pointeur in integer, requte_sql in varchar2, dbms.native) : cette procdure analyse la chane requte_sql suivant la version sous laquelle lutilisateur est connect. Execute (pointeur in integer) return integer : cette fonction excute lordre associ au curseur et renvoie le nombre de lignes traites dans le cas dun insert, delete ou update. Close_cursor (pointeur in out integer) : cette procdure ferme le curseur spcifi, met lidentifiant du curseur NULL et libre la mmoire alloue au curseur.

Page 83/83