PL/SQL (Procedural Language / SQL), l’extension procédurale proposée par Oracle pour SQL (L4G),
Il permet de combiner des requêtes SQL (SELECT, INSERT, UPDATE et DELETE) et des instructions procédurales (boucles, conditions...),
Créer des traitements complexes destinés à être stockés sur le serveur de base de données (objets serveur),
Comme on le sait, les structures de contrôle habituelles d’un langage (IF, WHILE…) ne font pas partie intégrante de la norme SQL. Oracle les prend en compte dans PL/SQL.
2. PLAN
Introduction,
Avantages de PL/SQL,
Les principales caractéristiques du PL / SQL,
Les variables et constantes,
Les structures de contrôle
Interaction avec la base de données à partir de PL/SQL
Les sous programmes PL/SQL
Déclencheurs (Triggers)
2
3. BIBLIOGRAPHIE
Christian Soutou « SQL pour Oracle »
Gilles Briard « Oracle10g sous Windows »
John Russell « PL_SQL Reference User guide 10g
Release »
Denis Roegel « Le langage procédural PL/SQL »
SheikYerbouti « Oracle PL/SQL »
3
4. PRÉ-REQUIS POUR CE COURS
Des connaissances dans le Structured Query
Language SQL,
des connaissances de base dans la
programmation (IF-THEN comparaisons,
boucles, …)
Des connaissances dans le SGBD Oracle,
4
5. INTRODUCTION
PL/SQL (Procedural Language / SQL), l’extension
procédurale proposée par Oracle pour SQL (L4G),
Il permet de combiner des requêtes SQL
(SELECT, INSERT, UPDATE et DELETE) et des
instructions procédurales (boucles, conditions...),
Créer
des traitements complexes destinés à être
stockés sur le serveur de base de données (objets
serveur),
Comme on le sait, les structures de contrôle
habituelles d’un langage (IF, WHILE…) ne font pas
partie intégrante de la norme SQL. Oracle les prend
en compte dans PL/SQL.
5
6. AVANTAGES DE PL/SQL 1/2
Ce langage propose des-performances pour le
traitement des transactions et offre les avantages
suivants:
Intégration complète du SQL,
Prise en charge de la programmation orientée objet
(surcharge),
Parfaite Intégration avec Oracle et Java,
en fait PL/SQL est un langage propriétaire de Oracle,
On peut lancer des sous-programme Pl/SQL à partir de
Java et de même, on peut appeler des procédures Java à
partir d’un block Pl/SQL
6
7. AVANTAGES DE PL/SQL 2/2
Portabilité totale : Toutes les bases de données Oracle
comportent un moteur d’exécution PL/SQL.
les programmes PL/SQL sont indépendants du système
d’exploitation qui héberge le serveur Oracle. En changeant
de système, les applicatifs n’ont pas à être modifiés.
Facilité de programmation :
PL/SQL est un langage simple d’apprentissage et de mise
en œuvre. Sa syntaxe claire offre une grande lisibilité en
phase de maintenance de vos applications. De nombreux
outils de développement, autres que ceux d’Oracle 10g,
autorisent la programmation en PL/SQL dans la base de
données.
7
8. AVANTAGES DE PL/SQL
EXEMPLE D’INTÉGRATION ENTRE PL/SQL ET SQL
Vous n'avez pas à traduire les types de données entre SQL
et PL/SQL:
On retrouvera avec PL/SQL tous les types de données et
instructions disponibles sous SQL, et des mécanismes pour
parcourir des résultats de requêtes (curseurs), pour traiter des
erreurs (exceptions), pour manipuler des données complexes
(paquetages DBMS_xxx) et pour programmer des transactions
« COMMIT, ROLLBACK, SAVEPOINT »
Cette intégration nous permet d'économiser à la fois le
temps d'apprentissage et le temps d’exécution. Les
fonctionnalités du langage PL/SQL nous permettent de
travailler avec des colonnes et des lignes des tables sans
préciser les types de données, ce qui nous permet
d’économiser du temps d'entretien lorsque la définition des
tables change.
8
9. AVANTAGES DE PL/SQL
PL/SQL PROPOSE UNE BONNE PERFORMANCE
Dans PL/SQL, ce ne sont plus des requêtes SQL qui
sont transmis un à un au moteur de base de données,
mais des blocs et des sous-programmes, Alors:
Le traitement des données est donc interne à la base, ce qui
réduit considérablement le trafic entre celle-ci et
l’application,
Il est préférable de travailler avec un bloc PL/SQL plutôt
qu’avec une suite d’instructions SQL susceptibles
d’encombrer le trafic réseau
9
10. AVANTAGES DE PL/SQL
PL/SQL PROPOSE UNE BONNE PERFORMANCE
Dans un environnement clientserveur, chaque instruction
SQL donne lieu à l’envoi d’un
message du client vers le
serveur suivi de la réponse du
serveur vers le client.
Un bloc PL/SQL donne lieu à
un seul échange sur le réseau
entre le client et le serveur. Les
résultats intermédiaires sont
traités côté serveur et seul le
résultat final est retourné au
client
10
11. LES PRINCIPALES CARACTÉRISTIQUES DU
PL/SQL
PL/SQL combine la puissance de manipulation de
données d’SQL avec la puissance de traitement des
langages procédurales:
Vous pouvez contrôler le déroulement du programme avec
des déclarations comme IF et LOOP
Vous pouvez déclarer des variables, définir des procédures
et fonctions et faire la gestion des différentes exceptions,
PL/SQL vous permet de décomposer des problèmes
complexes en compréhensible code (ou procédures), et
permet l’utilisation de ce code dans plusieurs applications.
11
12. LES PRINCIPALES CARACTÉRISTIQUES DU
PL/SQL
La figure suivante présente la façon avec laquelle le
moteur PL/QL traite un bloc PL/SQL anonyme.
Le
moteur PL/SQL exécute des instructions procédurales,
mais envoi des instructions au moteur SQL dans la base de
données Oracle.
12
13. STRUCTURE D’UN PROGRAMME PL/SQL
PL/SQL est un langage structuré en blocs, constitués
d'un ensemble d'instructions,
Un bloc PL/SQL peut être "externe", on dit alors qu'il
est anonyme, ou alors stocké dans la base de données
sous forme de procédure, fonction ou trigger (on lui
affecte un nom),
Un bloc PL / SQL contient trois parties :
une partie déclarative,
2. une partie exécutable,
3. une partie pour la gestion des exceptions.
NB: Seule la partie exécutable est nécessaire.
1.
13
14. STRUCTURE D’UN PROGRAMME PL/SQL
La première partie d’un code est la partie déclarative:
Définition des types, variables curseurs, exceptions, etc.
Ces éléments sont manipulés dans la partie exécutable.
Le nom réservé est DECLARE.
NB: Cette section est optionnelle.
La deuxième partie est la partie exécutable:
Contient le code PL/SQL incluant ou non des directives SQL.
Cette partie de code débute par le mot réservé BEGIN et se
termine par le mot réservé END; (ne pas oublier le pointvirgule).
NB: Cette section est obligatoire.
La troisième section est la partie de gestion des
exceptions.
Cette partie débute par le mot réservé EXCEPTION.
Elle permet de traiter les erreurs retournées par le SGBD à la
suite d’exécutions d’instructions SQL.
NB: Cette partie est optionnelle.
14
15. STRUCTURE D’UN PROGRAMME PL/SQL
Un bloc peut être imbriqué dans le code d’un autre bloc
(on parle de sous-bloc).
NB: Un sous-bloc commence par BEGIN et se termine par
END;
La portée d’un objet (variable, type, curseur, exception,
etc.) est la zone du programme qui peut y accéder
15
NB: Un sous-bloc peut aussi se trouver dans la partie des exceptions
16. LE JEU DE CARACTÈRES EN PL/SQL
Les caractères qui sont interprétés par PL/SQL, comme
SQL, sont :
Les alphanumérique : lettres A à Z et a à z ; chiffres de 0 à 9
Les symboles ( ) + - * / < > = ! ~ ^ ; : . ' @ % , " # $ & _ | { } ? [ ]
Les caractères spéciaux comme : tabulations, espaces et
retours-chariot
NB: PL/SQL n’est pas sensible à la casse Tva=TVA
16
17. LE JEU DE CARACTÈRES EN PL/SQL
Pour une meilleure lisibilité, on peut séparer les
unités lexicales par des espaces, des tabulations
et des retours à la ligne.
Code lisible
Code (correct) peu lisible
…
IF x>y THEN max:=x;ELSE max:=y;END IF;
…
IF x > y THEN
max := x;
ELSE
max := y;
END IF;
…
17
18. LES IDENTIFIANTS
Avant de parler des différents types de variables
PL/SQL, décrivons comment il est possible de nommer
des objets PL/SQL (variables, curseurs, exceptions,
etc.).
Un identificateur commence par une lettre suivie (optionnel)
de symboles (lettres, chiffres, $, _, #).
Certains symboles sont interdits: &, -, /, +, :
Un identificateur peut contenir jusqu’à trente caractères.
Identifiants autorisés
A
AA2
TVA#
Hors_Taxe
Requéte$Sql
Identifiants non autorisés
A&A (symbole &)
2A (debut chiffre)
Hors-Taxe (symbole -)
Vrai/Faux (symbole /)
Requéte Sql (symbole espace)
18
19. LES COMMENTAIRES
PL/SQL supporte deux types de commentaires :
1.
2.
Mono-lignes;
commençant au symbole -- et finissant à la fin de la ligne,
Multi-lignes;
commençant par /* et finissant par */
BEGIN
…
-- Lecture du nom d’un utilisateur utilisant son ID
SELECT nom INTO v_nom FROM T_USER WHERE id=5;
/*
Ecriture dans la table Log pour spécifier quel utilisateur est connecté à l’application en spécifiant:
1- le nom
2-l’heure et la date
*/
19
INSERT INTO log VALUES (v_nom, v_heure, v_date);
…
END;
20. LES MOTS RÉSERVÉS
Certains identifiants, appelés mots réservés, ont une
signification syntaxiques particulière dans PL/SQL.
Par exemple, les mots BEGIN et END sont réservés.
Une redéfinition d’un mot réservé provoque une erreur de
compilation
Souvent, les mots réservés sont écrits en majuscules pour
une meilleure lisibilité
20
21. EXÉCUTION D’UN PROGRAMME PL/SQL
Pour exécuter un programme PL/SQL, l’outil le plus
simple livré par Oracle est SQL*Plus:
Cet outil permet:
D’accéder à l’ensemble des fonctionnalités d’Oracle
(10g) à partir d’une interface textuelle identique
(Console), quel que soit le système d’exploitation utilisé
D’exécuter
de façon interactive des ordres SQL
unitaires,
De lancer des fichiers contenant un ensemble d’ordres
SQL.
21
22. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
Il existe plusieurs interfaces SQL*Plus Sous Windows :
En mode ligne de commande (qui ressemble à une fenêtre DOS ou
telnet)
Avec une interface graphique SQL*Plus Worksheet de l’outil
Enterprise Manager
Avec le navigateur via l’interface Web iSQL*Plus (i comme «
Internet »:
Cette interface s’apparente assez à celle de EasyPHP en étant très
intuitive).
NB : Les interfaces graphiques SQL*Plus et iSQL*Plus ne
sont plus offertes depuis la version 11g.
L’interface en mode ligne de commande reste toutefois disponible
pour toutes les versions.
Pour cela on va s’intéresser à SQL*Plus en mode ligne de
commande.
22
23. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
Pour lancer SQL*Plus, tapez dans une fenêtre
Console DOS (bien sur on suppose que Oracle (10g)
est installé):
C:> sqlplus
Il y’a deux modes de connexions:
Mode utilisation simple de la base de données,
Mode avec privilèges pour administration.
Le privilège SYSOPER: permet à un administrateur
de la base de données d’exécuter: STARTUP,
SHUTDOWN, ALTER DATABASE OPEN/MOUNT,
ALTER DATABASE BACKUP, ARCHIVE LOG, and
RECOVER
Le privilège SYSDBA: contient tout les privilèges y
compris ADMIN OTPION et SYSOPER
23
24. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
Pour se connecter en mode administration, dans
la fenêtre Console DOS on tape :
# Connexion avec un utilisateur ayant reçu le privilège SYSDBA
connect utilisateur/passwd as SYSDBA.
# connexion avec un utilisateur ayant reçu le privilège SYSOPER
connect utilisateur/passwd as SYSOPER
24
25. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
On peut aussi saisir des options lors du lancement de
SQL*Plus :
C:> sqlplus -S utilisateur/mot_de_passe@base_cible @fichier_sql
-S pour spécifier que c’est un mode « silencieux »
l’utilisateur et le mot de passe peuvent être suivis de l’alias
Oracle Net de la base cible à laquelle vous souhaitez vous
connecter. Dans ce cas, le signe @ est accolé au mot de passe
un fichier de commande contenant des ordres SQL, des
commandes SQL*Plus et PL/ SQL peut être automatiquement
lancé, un espace doit alors précéder le signe @
25
26. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
Quelques commandes utiles:
HOST pour lancer des commandes OS à partir de la session
SQL*Plus,:
Pour lister le contenu d’un répertoire :
HOST DIR
NB: Celle-ci ne termine pas votre session SQL*Plus
DISC (DISCONNECT) pour se déconnecter de la base Oracle cible
EXIT ou QUIT pour se déconnecter et terminer une
session SQL*Plus
LIST ou L permet de visualiser la dernière commande
SQL saisie
RUN ou R exécute l’ordre SQL présent dans le buffer
NB: Un bloc d’instructions PL/SQL doit se terminer par une
26
« / ».
27. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
Quelques commandes utiles:
ED (EDIT)
permet d’appeler l’éditeur de texte et y place l’ordre SQL
présent dans le buffer courant.
Pour préciser l’éditeur de texte de votre choix (ici notepad), utilisez
la commande SQL*Plus ;
SQL> def _editor = notepad
ed mon_fichier.sql
# si le fichier n’existe pas, il sera crée
Pour exécuter un fichier de commande à partir de SQL*Plus
start mon_fichier.sql
-- ou bien
@mon_fichier.sql
27
28. EXÉCUTION D’UN PROGRAMME PL/SQL
INTERFACES SQL*PLUS
Quelques commandes utiles:
SET TIMING ON|OFF
permet de mesurer la durée d’exécution de vos ordres SQL (en
millisecondes).
SET SERVEROUTPUT ON|OFF
Permet d’activer ou de désactiver l’affichage à la console
PROMPT ‘Texte à afficher à la console’
ACCEPT nom_var
Permet de récupérer une valeur saisie par l’utilisateur et de la stocker
dans nom_var. pour l’utiliser dans un bloc Pl/SQL on utilise
‘&nom_var’
VARIABLE nom_var TYPE
Permet d’afficher un texte à la console
Déclarer une variable globale on précisant son type
Pour l’utiliser en PL/SQL on utilise :nom_var
PRINT var
Afficher le contenu de var
28
29. EXÉCUTION D’UN PROGRAMME PL/SQL
EXEMPLE
Exemple:
Créer un nouvel utilisateur.
Nb: On se connecte sous le compte SYSTEM (le mot de
passe SYSTEM est saisi lors de l’installation d’oracle).
connect SYSTEM/pass as SYSDBA
-- sous l’utilisateur SYSTEM
create user SIRM identified by SIRMpass;
-- Se connecter sous SIRM
Connect SIRM/SIRMpass as sysdba
-- executer un script
start ORACLE_HOMERDBMSADMINSCRIPT.SQL
-- Afficher le nom de l’utilisateur courant
show user
29
30. LES VARIABLES ET CONSTANTES
PL / SQL permet de déclarer des constantes (valeur
invariable) et des variables pour les utiliser dans des
programme SQL.
Il
faut déclarer une constante ou variable avant de la
référencer.
Déclaration:
Les variables et les constantes sont déclarées
éventuellement initialisées) dans la section DECLARE.
(et
La syntaxe:
nom_de_la_variable [CONSTANT] TYPE_DE_DONNEE [NOT NULL] [:= | DEFAULT expression];
En plus des types de données propre à PL/SQL comme BOOLEAN30
ou PLS_INTEGER, Les variables peuvent avoir n'importe quel
type SQL comme CHAR, DATE, ou NUMBER.
31. LES VARIABLES ET CONSTANTES
DÉCLARATION:
Exemple:
Déclarer une variable nommée v_telephone qui va contenir 10
chiffres (Type NUMBER (10))
Déclarer une variable nommée v_disponible pour contenir une
valeur booléenne (BOOLEAN) TRUE ou FALSE.
Déclarer une variable v_TVA de type NUMBER et l’initialiser par
0.02
La syntaxe pour déclarer une variable est la suivante:
nom_de_la_variable [CONSTANT] TYPE_DE_DONNEE [NOT NULL] [:= | DEFAULT expression];
DECLARE
v_telephone NUMBER(10);
v_disponible BOOLEAN;
v_TVA NUMBER :=0.02;
31
32. LES VARIABLES ET CONSTANTES
DÉCLARATION:
Les constantes:
Pour la déclaration des constantes on utilise le
mot réservé CONSTANT
nom_de_la_variable [CONSTANT] TYPE_DE_DONNEE [NOT NULL] [:= | DEFAULT expression];
NB: Il faut initialiser les constantes lors de leur déclaration.
Exemple:
DECLARE
c_TVA CONSTANT NUMBER :=0.02;
…
BEGIN
…
END
32
33. LES VARIABLES ET CONSTANTES
DÉCLARATION:
La portée d'une variable:
Est la région d'une unité de programme (bloc ou sousprogramme) à partir duquel on peut faire référence à
cet identifiant.
Les identifiants (variables) qui sont déclarés dans un bloc
PL/SQL sont considérés comme locaux à ce bloc et globaux à
ces sous-blocs.
Bien qu’on ne puisse pas déclarer un identifiant deux fois
dans le même bloc, on peut déclarer le même identifiant
dans deux blocs différents.
Les deux éléments (variables) représentés par l'identifiant sont
distincts, et tout changement dans l'un n'affecte pas l'autre.
Un bloc ne peut pas faire référence à identifiants qui est
déclaré dans l’autre bloc parce que ces identifiants ne sont33
ni locaux ni globaux au bloc.
34. LES VARIABLES ET CONSTANTES
AFFECTATION:
L’affectation d’une valeur à une variable est effectuée
en PL/SQL en utilisant l’operateur « := »
L’affectation peut être effectuée dans la partie
déclaration comme dans la partie exécutable;
DECLARE
nom_de_la_variable TYPE_DE_DONNEE [NOT NULL] [:= | DEFAULT expression];
-- ou bien
BEGIN
nom_de_la_variable := valeur;
…
END ;
34
35. LES VARIABLES ET CONSTANTES
AFFECTATION:
Exemple:
DECLARE
v_telephone NUMBER(10);
v_disponible BOOLEAN;
v_DateDeNaissance Date;
c_TVA CONSTANT NUMBER :=0.02;
v_TTC NUMBER ;
v_HT NUMBER ;
BEGIN
v_disponible :=TRUE ;
v_telephone :=0666666666;
v_TTC := v_HT + c_TVA ;
END;
/
35
36. LES VARIABLES ET CONSTANTES
AFFECTATION:
Une autre façon pour affecter à une variable une valeur est
d’utiliser la directive DEFAULT.
v_pays CHAR(5) := ’MAROC’ ;
/* Équivaut à
v_pays CHAR(5) DEFAULT 'MAROC';
*/
La troisième façon pour attribuer des valeurs à une variable
consiste à sélectionner (ou récupérer) des valeurs de la base de
données:
Dans l'exemple ci-dessous, nous allons récupérer le nom d’un employé
dont ID=10 et l’enregistrer dans la variable v_nom.
BEGIN
SELECT nom INTO v_nom FROM T_EMPLOYE WHERE ID=10;
Il existe d’autres façons pour affecter à une variable une valeur
36
37. LES VARIABLES ET CONSTANTES
AFFECTATION:
NB1 : La contrainte NOT NULL doit être suivie d’une clause
d’initialisation.
NB2 : À l’inverse de la plupart des langages de programmation, les
déclarations multiples ne sont pas permises.
NB3 : Par défaut, les variables sont initialisées à la valeur NULL
NB4: Seules les valeurs TRUE, FALSE et NULL peuvent être
affectée à une variable booléenne..
37
38. LES VARIABLES ET CONSTANTES
EXEMPE:
DECLARE
-- Déclarations de variables.
v_nom VARCHAR2(7);
v_alias VARCHAR2(7);
v_age NUMBER(2);
v_naissance DATE;
v_existant BOOLEAN NOT NULL DEFAULT FALSE;
BEGIN
v_nom := 'Mohamed'; -- Affectation d’une chaîne de caractères.
v_alias:= v_nom; -- Affectation d’une variable.
v_age:= 23; --Affectation d’un nombre.
v_naissance := '01-01-2000'; -- Affectation de dates.
v_existant := TRUE; -- Affectation d’un booléen.
/*Affectation d’une chaîne de caractères par une requête.*/
SELECT nom INTO v_nom FROM T_User WHERE age= 21;
END;
38
39. LES TYPES DE DONNÉES
En plus des types de données propre à PL/SQL, on peut
utiliser tous les types de données SQL (NUMBER, CHAR,
BOOLEAN,
VARCHAR2,
DATE,
TIMESTAMP,
INTERVAL, BLOB, ROWID…)
On peut distinguer:
Type scalaire: n'a pas de composants internes. Il contient une
valeur singulière, comme un nombre ou une chaîne de caractères.
Type composé: a des composants internes qui peuvent être
manipulés individuellement, telles que les éléments d'un tableau.
Type référence: contient les valeurs, appelées pointeurs, qui
désignent d’autres éléments du programme.
Type LOB (Large Object Binary): est un type de données ORACLE
permettant de stocker des données de grande taille allant jusqu’à
39
4 Go, tels que des blocs de texte ou des images graphiques.
40. LES TYPES DE DONNÉES
Les types scalaires sont répartis en quatre familles, ou
on trouve les numéros, caractères, booléens, et les
données date/heure.
40
41. LES TYPES DE DONNÉES
TYPES SCALAIRES
Le type scalaire permet de stocker des données
numériques (entiers, nombres réels, et nombres à
virgule flottante), représenter des quantités et de
faire des calculs.
BINARY_INTEGER,
PLS_INTEGER,
BINARY_FLOAT,
BINARY_DOUBLE,
NUMBER.
41
42. LES TYPES DE DONNÉES
TYPES SCALAIRES
NUMBER
On utilise le type de données NUMBER pour stocker des
numéros à virgule fixe ou à virgule flottante.
Le domaine des valeurs sont de1E-130 à 10E125.
La précision est le nombre de chiffres à droite de la virgule.
La syntaxe est la suivante :
NUMBER[(precision[,scale])] -- scale max = 38, la valeur par défaut est 38
Exemple:
v_note NUMBER(2,1) :=10.5;
v_note NUMBER:=9.05;
v_note NUMBER (2):=10; – même que la déclaration NUMBER(2,0)
43
43. LES TYPES DE DONNÉES
LES TYPES CARACTÈRE ET CHAINE DE CARACTÈRES
Les types de données caractères permettent de stocker
des données alphanumériques, représenter des mots et
du texte, et de manipuler des chaînes de caractères.
CHAR
VARCHAR2
…
44
44. LES TYPES DE DONNÉES
LES TYPES CARACTÈRE ET CHAINE DE CARACTÈRES
CHAR
Le type de données CHAR est utilisé pour stocker des
caractères (de longueur fixe),
CHAR[(max_size )] – max_size comprise entre 1 et 32767 (par défaut égale à 1).
Exemple
v_char CHAR :='A';
v_string CHAR(5) :='SALAM';
45
45. LES TYPES DE DONNÉES
LES TYPES CARACTÈRE ET CHAINE DE CARACTÈRES
VARCAHR2:
Le type de données VARCHAR2 est utilisé pour stocker les
données de type chaine de caractères
Le type de données VARCHAR2 prend un paramètre
obligatoire qui spécifie une taille maximale qui peut aller de
1 à 32767 octets
VARCHAR2(maximum_size);
NB: on ne peut pas insérer des valeurs VARCHAR2 plus grandes
que 4000 octets dans une colonne de type VARCHAR2 d’une base
de données.
46
46. LES TYPES DE DONNÉES
TYPES POUR LES GRANDS OBJETS (LOB LARGE OBJECT)
Les types de données LOB (large object) permettent de
stocker jusqu'à quatre giga-octets, en taille, de blocs de
données non structurées (comme des textes, images
graphiques, clips vidéo et des signaux sonores).
Et, ils permettent un accès par morceaux efficace, et
non séquentiel, aux données.
BFILE: utilisé pour stocker de grands objets binaires dans
des fichiers systèmes
BLOB: utilisé pour stocker de grands objets binaires dans la
base de données
CLOB: utilisé pour stocker de grands blocs de données de
types caractères dans la base de données
47
47. LES TYPES DE DONNÉES
LES TYPES BOOLÉENS
PL/SQL propose un type pour représenter des valeurs
booléennes (vrai et faux).
Le type de données BOOLEAN peut être utilisé pour
stocker les valeurs logiques VRAI, FAUX, et NULL.
Du fait que SQL ne dispose pas d'un type équivalent, on ne
peut utiliser des variables booléennes que dans des
contextes PL/SQL, mais pas à l'intérieur des requêtes SQL.
48
48. LES TYPES DE DONNÉES
LES TYPES DATE ET TIMESTAMP
DATE:
Utilisé pour stocker des variables datetimes de
longueur fixe, qui inclut le moment de la journée en
secondes depuis minuit.
Par défaut, la valeur du jour est le premier jour du mois en
cours, la valeur de l’heure égale à minuit,
Sous oracle, la fonction date SYSDATE renvoie la date et
l'heure courante.
49
49. LES TYPES DE DONNÉES
LES TYPES DATE ET TIMESTAMP
DATE:
PL/SQL propose des fonctions pour la manipulation des
dates
Nom de la fonction
Description
ADD_MONTHS (date, nbre_de_moi)
Ajoute un nombre spécifié de
mois à une date.
Retourne le dernier jour du mois
de la date spécifiée.
LAST_DAY ( date )
MONTHS_BETWEEN ( date2, date1 ) Calcule le nombre de mois entre
deux dates.
NEXT_DAY( date, 'jour' )
Date du prochain jour après date
où jour est un jour de la semaine
50
50. LES TYPES DE DONNÉES
LES TYPES DATE ET TIMESTAMP
DATE:
Exemples
DECLARE
v_date DATE :='01-10-2010';
BEGIN
DBMS_OUTPUT.PUT_LINE(ADD_MONTHS(v_date,3)); -- 01/01/11
DBMS_OUTPUT.PUT_LINE(LAST_DAY(v_date)); -- 31/10/10
DBMS_OUTPUT.PUT_LINE(MONTHS_BETWEEN(v_date,
ADD_MONTHS(v_date,-2))); -- 2
DBMS_OUTPUT.PUT_LINE(NEXT_DAY(v_date, 'Lundi')); -- 04/10/10
End;
/
On peut tester ces fonctions directement en utilisant la table
system dual:
51
SELECT SYSDATE from dual;
SELECT NEXT_DAY( '31/12/2013', 'Lundi' ) from dual ;
51. LES TYPES DE DONNÉES
LES SOUS-TYPES
Un sous-type n’introduit pas un nouveau type mais en
restreint (limite) un existant.
PL/SQL
propose plusieurs sous-types prédéfinis et il est
possible de définir des sous-types personnalisés
Sous-type
Type restreint
Caractéristiques
CHARACTER
CHAR
Mêmes caractéristiques.
INTEGER
NUMBER(38,0)
Entiers.
BINARY_INTEGER
NUMBER
….
NATURAL, POSITIVE
NATURALN, POSITIVEN
Non négatif.
BINARY_INTEGER
SIGNTYPE
DEC, DECIMAL, NUMERIC
Non négatif et non nul.
Domaine de valeurs {–1, 0, 1}.
NUMBER
Décimaux, précision de 38
chiffres.
52
52. LES TYPES DE DONNÉES
PERSONNALISER UN TYPE
Il est possible de définir un sous-type (dit «personnalisé»
car n’existe que durant le programme) par la syntaxe
suivante :
SUBTYPE nomSousType IS typeBase[(contrainte)] [NOT NULL];
typeBase est un type prédéfini ou personnalisé.
contrainte s’applique au type de base et concerne seulement la
précision ou la taille maximale.
DECLARE
SUBTYPE dateNaiss_sty IS DATE NOT NULL;
SUBTYPE insee_sty IS NUMBER(13);
SUBTYPE nombre_sty IS NUMBER(2,2);
53
53. LES TYPES DE DONNÉES
TYPES DÉRIVÉS
Pour faciliter la maintenance du code qui interagit
avec la base de données, on peut également utiliser des
types qui sont dérivés de la base sans à les connaitre.
Ainsi, on peut utiliser les deux attribues:
%TYPE,
%ROWTYPE
54
54. LES TYPES DE DONNÉES
TYPES DÉRIVÉS
%TYPE
L’attribut %TYPE fait référence à un type existant qui est
soit une colonne d'une table soit un type défini
précédemment.
Il fournit le type de données d'une variable ou une colonne
de base de données.
Cela
est particulièrement utile lorsqu’on déclare des
variables qui vont contenir des valeurs de la base de
données.
55
55. LES TYPES DE DONNÉES
TYPES DÉRIVÉS
%TYPE
Exemple:
DECLARE
v_adresse T_utilisateurs.adresses%TYPE;
Déclarant v_adresse avec %TYPE a deux avantages.
1. On n’est pas obligé de savoir exactement le type de
données du champ adresses de la table T_utilisateurs
2. Si on modifie la définition du champ adresses dans la
table T_utilisateurs (changer la taille ou le type) de la
base de données, le type de la variable v_adresse va
changer au moment de l'exécution.
56
56. LES TYPES DE DONNÉES
TYPES DÉRIVÉS
%ROWTYPE
L'attribut
%ROWTYPE
fournit
un
type
d'enregistrement qui représente une ligne dans une
table.
L’enregistrement peut stocker une ligne entière
sélectionnée à partir d’une table ou récupérée à
partir d'un curseur ou variable de curseur.
Les
éléments
de
cet
enregistrement
correspondants portent le même nom et type de
données.
57
57. LES TYPES DE DONNÉES
TYPES DÉRIVÉS
%ROWTYPE
DECLARE
rty_utilisateurs T_utilisateur%ROWTYPE; -- on déclare une variable type enregistrement
Ici, nous avons déclaré un enregistrement nommé rty_utilisateurs.
Les champs de cet enregistrement ont les mêmes noms et types de
données que les colonnes dans la table T_utilisateur.
L’enregistrement peut contenir toutes les colonnes d’une table ou
seulement certaines.
Nous détaillerons, dans la suite, le mécanisme des curseurs
(CURSOR) qui emploient beaucoup cette directive.
Pour accéder à un champ on utilise la notation du « point » comme
sur l’exemple suivant:
58
v_ID :=rty_utilisateurs.ID ; -- ID est le nom d’un champ dans la table T_utilisateur
58. LES TYPES DE DONNÉES
TYPES DÉRIVÉS
%ROWTYPE
Exemple:
DECALRE
rty_utilisateurs T_utilisateur%ROWTYPE; -- on déclare une variable type enregistrement
v_ID T_utilisateur.ID%TYPE ;
BEGIN
SELECT * INTO rty_utilisateurs FROM T_utilisateur where ID=5 ;
v_ID :=rty_utilisateurs.ID;
rty_utilisateurs.Nom := Tarik ;
rty_utilisateurs.Prénom := Ilias ;
-- Insertion dans la table T_utilisateur à partir d’un enregistrement.
INSERT INTO T_utilisateur VALUES rty_utilisateurs ;
END ;
NB: Les colonnes récupérées par la directive %ROWTYPE
n’héritent pas des contraintes NOT NULL qui seraient
éventuellement déclarées au niveau de la table.
59
59. LES TYPES DE DONNÉES
TYPES COMPOSÉS
RECORD
Le type de données RECORD (disponible depuis la
version 7) définit nos propres structures de données
(l’équivalent du struct en C).
La syntaxe pour déclarer une variable de type
RECORD est la suivante :
TYPE nomRecord IS RECORD ( nomChamp typeDonnées [[NOT NULL] {:= | DEFAULT}
expression] [,nomChamp typeDonnées… ]… );
60
60. LES TYPES DE DONNÉES
TYPES COMPOSÉS
RECORD
Exemple:
DECLARE
/*
Déclaration d’un RECORD contenant 3 champs, dont un est non nul avec initialisation du
champ qtyInStock
*/
TYPE R_product IS RECORD (id NUMBER, identifiant CHAR(15) NOT NULL,
qtyInStock NUMBER := 50);
r_produit R_product;
BEGIN
-- Affectation d’un record
r_produit.id:=5;
r_produit.identifiant :=’Lait’ ;
r_produit.qtyInStock :=150 ;
61
END;
61. LES TYPES DE DONNÉES
TYPES COMPOSÉS
RECORD:
NB1: Les types RECORD ne peuvent pas être stockés dans
une table de la base de données.
NB2: Il est possible qu’un champ d’un RECORD soit luimême un RECORD (nested record), ou soit déclaré avec les
directives %TYPE ou %ROWTYPE.
TYPE R_product IS RECORD (id NUMBER, identifiant CHAR(15) NOT NULL, qtyInStock
NUMBER := 50);
TYPE R_stock IS RECORD (produit R_product, fournisseur T_ fournisseur%ROWTYPE,
employe T_employe.id%TYPE) ;
62
NB : Les RECORD ne peuvent pas être comparés (nullité, égalité et inégalité).
62. CONVERSION DE TYPES DE DONNÉES EN
PL/SQL
Parfois, il est nécessaire de convertir une valeur d'un
type de données à un autre.
Par exemple, pour utiliser une date dans un rapport, il
faut la convertir en une chaîne de caractères.
PL/SQL supporte à la fois la conversion explicite et
implicite (automatique) de types de données.
Il est préférable d’utiliser la conversion explicite
pour s’assurer du bon fonctionnement de notre
programme.
63
63. CONVERSION DE TYPES DE DONNÉES EN PL/SQL
CONVERSION EXPLICITE
On utilise des fonctions fournies pas PL/SQL.
Exemple:
Pour convertir une valeur CHAR en une valeur DATE ou
NUMBER, on utilise respectivement les fonctions TO_DATE
ou TO_NUMBER,
Exemple
DECLARE
v_chr1 CHAR :=‘1’;
v_nbr1 NUMBER;
BEGIN
v_nbr1 := TO_NUMBER(v_chr1);
dbms_output.put_line( ‘TO_NUMBER ( ‘||v_chr1|| ‘) =‘ || v_nbr1 ) ;
END;
64
64. CONVERSION DE TYPES DE DONNÉES EN PL/SQL
CONVERSION EXPLICITE
Quelques fonctions de conversion
BIN_TO_NUM( bit [,bit[...]] )
Conversion d'une BIN_TO_NUM(1,0,1,0)
10
suite de bits en
nombre
TO_CHAR( date [, 'format' ] )
TO_CHAR( nombre [, 'format' ] )
Transformation
d'un type DATE
ou NUMBER en
chaîne
TO_CHAR( SYSDATE,
'DD/MM/YYYY
HH24:MI:SS' )
18/10/2010 00:27:28
TO_DATE( nombre [, 'format' ] )
TO_DATE( chaîne [, 'format' ] )
Transformation
d'un type
NUMBER ou
CHAR ou
VARCHAR2 en
date
TO_DATE( '18/11/2010',
'DD/MM/RR' )
18/11/10
65
65. CONVERSION DE TYPES DE DONNÉES EN PL/SQL
CONVERSION IMPLICITE
Quand il est logique, PL/SQL peut implicitement
convertir le type de données d'une valeur.
Exemple 1:
DECLARE
v_chr1 CHAR :=‘1’;
v_nbr1 NUMBER;
BEGIN
v_nbr1 := v_chr1;
dbms_output.put_line( v_nbr1 ) ;
END;
Exemple 2:
DECLARE
v_bl BOOLEAN;
begin
v_bl:=1; -- renvoie une erreur “expression du mauvais type »
end;
66
66. QUELQUES OPÉRATEURS:
LES OPERATEURS LOGIQUES
Les operateurs logiques AND, OR et NOT suivent la
logique des trois états indiqués dans le tableau cidessous.
AND et OR sont des opérateurs binaires; NOT est un
opérateur unaire.
L’opérateur AND
L’opérateur OR
L’opérateur NOT
TRUE
FALSE
NULL
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
FALSE
NULL
NULL
FALSE
NULL
TRUE
FALSE
NULL
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
FALSE
NULL
TRUE
FALSE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
NULL
NULL
NULL
67
68. QUELQUES OPÉRATEURS:
OPÉRATEUR DE CONCATÉNATION
Les double-barres verticales (||) servent comme
opérateur de concaténation entre chaines de caractères
69
69. EXERCICE:
Ecrire un bloc PL/SQL pour:
Demander de saisir le nom à la console
Afficher le nombre de caractères du nom saisi
NB:
Utiliser un fichier
Pour ouvrir un fichier: ed nom_fichier
Pour executer un fichier: @nom_fichier ou bien start nom_fichier
Pour afficher un message à la console, utiliser commande SQL*PLUS:
PROMPT « Texte à Afficher »
Pour récupérer ce qui est saisi par l’utilisateur, utiliser la commande
SQL*PLUS:
Accept nom_var
Pour utiliser la variable nom_var dans un bloc pl/sql: ‘&nom_var’
Utiliser une variable de type NUMBER(38,0) qui va contenir la longueur de
la chaine de caractères
Utiliser la fonction length(chaine) pour calculer la longueur de la chaine
Pour afficher un message à la console utiliser la fonction:
DBMS_OUTPUT.PUT_LINE (texte à afficher)
Pour convertir un chiffre en un caractère, utiliser la fonction TO_CHAR()
L’opérateur de concaténation est: ||
Pour activer l’affichage à la console, utiliser la commande:
70
SET SERVEROUTPUT ON
Pour désactiver l’affichage des vérifications
SET VERIFY OFF
70.
Correction
-- configuration de la console SQL*PLUS
SET SERVEROUTPUT ON
SET VERIFY OFF
PROMPT entrer un nom
ACCEPT var
-- Code PL/SQL
DECLARE
lg number;
BEGIN
lg :=length ('&var');
dbms_output.put_line( 'le nombre de caractères dans '|| '&var' || ' est ' ||
TO_CHAR(lg)) ;
71
END;
/