Introduction à pl/sql

70
Abdelouahed Sabri [email protected] 1 INTRODUCTION À LA PROGRAMMATION PL/SQL

description

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.

Transcript of Introduction à pl/sql

Page 1: Introduction à pl/sql

Abdelouahed Sabri

[email protected] 1

INTRODUCTION À LA

PROGRAMMATION PL/SQL

Page 2: Introduction à pl/sql

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

Page 3: Introduction à pl/sql

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

Page 4: Introduction à pl/sql

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

Page 5: Introduction à pl/sql

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

Page 6: Introduction à pl/sql

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

Page 7: Introduction à pl/sql

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

Page 8: Introduction à pl/sql

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 pourparcourir des résultats de requêtes (curseurs), pour traiter deserreurs (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 letemps d'apprentissage et le temps d’exécution. Lesfonctionnalités du langage PL/SQL nous permettent detravailler avec des colonnes et des lignes des tables sanspréciser les types de données, ce qui nous permetd’économiser du temps d'entretien lorsque la définition destables change. 8

Page 9: Introduction à pl/sql

AVANTAGES DE PL/SQLPL/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

Page 10: Introduction à pl/sql

AVANTAGES DE PL/SQLPL/SQL PROPOSE UNE BONNE PERFORMANCE

Dans un environnement client-

serveur, 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

Page 11: Introduction à pl/sql

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

Page 12: Introduction à pl/sql

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

Page 13: Introduction à pl/sql

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 :

1. 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.13

Page 14: Introduction à pl/sql

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 setermine par le mot réservé END; (ne pas oublier le point-virgule).

NB: Cette section est obligatoire.

La troisième section est la partie de gestion desexceptions. Cette partie débute par le mot réservé EXCEPTION.

Elle permet de traiter les erreurs retournées par le SGBD à lasuite d’exécutions d’instructions SQL.

NB: Cette partie est optionnelle. 14

Page 15: Introduction à pl/sql

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;

15

NB: Un sous-bloc peut aussi se trouver dans la partie des exceptions

La portée d’un objet (variable, type, curseur, exception,

etc.) est la zone du programme qui peut y accéder

Page 16: Introduction à pl/sql

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

Page 17: Introduction à pl/sql

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.

IF x>y THEN max:=x;ELSE max:=y;END IF;

Code (correct) peu lisible

IF x > y THEN

max := x;

ELSE

max := y;

END IF;

Code lisible

17

Page 18: Introduction à pl/sql

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 Identifiants non autorisés

A

AA2

TVA#

Hors_Taxe

Requéte$Sql

A&A (symbole &)

2A (debut chiffre)

Hors-Taxe (symbole -)

Vrai/Faux (symbole /)

Requéte Sql (symbole espace)

18

Page 19: Introduction à pl/sql

LES COMMENTAIRES

PL/SQL supporte deux types de commentaires :

1. Mono-lignes;

commençant au symbole -- et finissant à la fin de la ligne,

2. Multi-lignes;

commençant par /* et finissant par */

19

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

*/

INSERT INTO log VALUES (v_nom, v_heure, v_date);

END;

Page 20: Introduction à pl/sql

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

Page 21: Introduction à pl/sql

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

Page 22: Introduction à pl/sql

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

Page 23: Introduction à pl/sql

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 administrateurde la base de données d’exécuter: STARTUP,SHUTDOWN, ALTER DATABASE OPEN/MOUNT,ALTER DATABASE BACKUP, ARCHIVE LOG, andRECOVER

Le privilège SYSDBA: contient tout les privilèges ycompris ADMIN OTPION et SYSOPER

23

Page 24: Introduction à pl/sql

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

Page 25: Introduction à pl/sql

EXÉCUTION D’UN PROGRAMME PL/SQL

INTERFACES SQL*PLUS

-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 @

C:\> sqlplus -S utilisateur/mot_de_passe@base_cible @fichier_sql

25

On peut aussi saisir des options lors du lancement de

SQL*Plus :

Page 26: Introduction à pl/sql

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

Page 27: Introduction à pl/sql

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.sql27

Page 28: Introduction à pl/sql

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’ Permet d’afficher un texte à 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 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

Page 29: Introduction à pl/sql

EXÉCUTION D’UN PROGRAMME PL/SQLEXEMPLE

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_HOME\RDBMS\ADMIN\SCRIPT.SQL

-- Afficher le nom de l’utilisateur courant

show user 29

Page 30: Introduction à pl/sql

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 (et

éventuellement initialisées) dans la section DECLARE.

30

nom_de_la_variable [CONSTANT] TYPE_DE_DONNEE [NOT NULL] [:= | DEFAULT expression];

La syntaxe:

En plus des types de données propre à PL/SQL comme BOOLEANou PLS_INTEGER, Les variables peuvent avoir n'importe queltype SQL comme CHAR, DATE, ou NUMBER.

Page 31: Introduction à pl/sql

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:

DECLARE

v_telephone NUMBER(10);

v_disponible BOOLEAN;

v_TVA NUMBER :=0.02; 31

nom_de_la_variable [CONSTANT] TYPE_DE_DONNEE [NOT NULL] [:= | DEFAULT expression];

Page 32: Introduction à pl/sql

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

END32

Page 33: Introduction à pl/sql

LES VARIABLES ET CONSTANTES

DÉCLARATION:

La portée d'une variable:Est la région d'une unité de programme (bloc ou sous-programme) à 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 sont ni locaux ni globaux au bloc.

33

Page 34: Introduction à pl/sql

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

Page 35: Introduction à pl/sql

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

Page 36: Introduction à pl/sql

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

Page 37: Introduction à pl/sql

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.

37

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..

Page 38: Introduction à pl/sql

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

Page 39: Introduction à pl/sql

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’à

4 Go, tels que des blocs de texte ou des images graphiques.39

Page 40: Introduction à pl/sql

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

Page 41: Introduction à pl/sql

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

Page 42: Introduction à pl/sql

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;

43v_note NUMBER:=9.05;

v_note NUMBER (2):=10; – même que la déclaration NUMBER(2,0)

Page 43: Introduction à pl/sql

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

Page 44: Introduction à pl/sql

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

Page 45: Introduction à pl/sql

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

Page 46: Introduction à pl/sql

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ées47

Page 47: Introduction à pl/sql

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

Page 48: Introduction à pl/sql

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

Page 49: Introduction à pl/sql

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.

LAST_DAY ( date ) Retourne le dernier jour du mois

de la date spécifiée.

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 semaine50

Page 50: Introduction à pl/sql

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;

/

51

On peut tester ces fonctions directement en utilisant la table

system dual:

SELECT SYSDATE from dual;

SELECT NEXT_DAY( '31/12/2013', 'Lundi' ) from dual ;

Page 51: Introduction à pl/sql

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

52

Sous-type Type restreint Caractéristiques

CHARACTER CHAR Mêmes caractéristiques.

INTEGER NUMBER(38,0) Entiers.

BINARY_INTEGER NUMBER ….NATURAL, POSITIVE

BINARY_INTEGER

Non négatif.

NATURALN, POSITIVEN Non négatif et non nul.

SIGNTYPE Domaine de valeurs {–1, 0, 1}.

DEC, DECIMAL, NUMERIC NUMBER Décimaux, précision de 38

chiffres.

Page 52: Introduction à pl/sql

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.

53

DECLARE

SUBTYPE dateNaiss_sty IS DATE NOT NULL;

SUBTYPE insee_sty IS NUMBER(13);

SUBTYPE nombre_sty IS NUMBER(2,2);

Page 53: Introduction à pl/sql

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

Page 54: Introduction à pl/sql

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

Page 55: Introduction à pl/sql

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

Page 56: Introduction à pl/sql

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

Page 57: Introduction à pl/sql

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:

v_ID :=rty_utilisateurs.ID ; -- ID est le nom d’un champ dans la table T_utilisateur

58

Page 58: Introduction à pl/sql

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

Page 59: Introduction à pl/sql

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

Page 60: Introduction à pl/sql

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 ;

END;61

Page 61: Introduction à pl/sql

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 lui-

mê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) ;

NB : Les RECORD ne peuvent pas être comparés (nullité, égalité et inégalité).

62

Page 62: Introduction à pl/sql

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

Page 63: Introduction à pl/sql

CONVERSION DE TYPES DE DONNÉES EN PL/SQLCONVERSION 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

64

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;

Page 64: Introduction à pl/sql

CONVERSION DE TYPES DE DONNÉES EN PL/SQLCONVERSION EXPLICITE

Quelques fonctions de conversion

65

BIN_TO_NUM( bit [,bit[...]] ) Conversion d'une

suite de bits en

nombre

BIN_TO_NUM(1,0,1,0)

10

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

Page 65: Introduction à pl/sql

CONVERSION DE TYPES DE DONNÉES EN PL/SQLCONVERSION IMPLICITE

Quand il est logique, PL/SQL peut implicitement

convertir le type de données d'une valeur.

Exemple 1:

66

DECLARE

v_bl BOOLEAN;

begin

v_bl:=1; -- renvoie une erreur “expression du mauvais type »

end;

DECLARE

v_chr1 CHAR :=‘1’;

v_nbr1 NUMBER;

BEGIN

v_nbr1 := v_chr1;

dbms_output.put_line( v_nbr1 ) ;

END;

Exemple 2:

Page 66: Introduction à pl/sql

QUELQUES OPÉRATEURS:LES OPERATEURS LOGIQUES

Les operateurs logiques AND, OR et NOT suivent la

logique des trois états indiqués dans le tableau ci-

dessous.

AND et OR sont des opérateurs binaires; NOT est un

opérateur unaire.

67

TRUE FALSE NULL

L’opérateur AND

TRUE TRUE FALSE NULL

FALSE FALSE FALSE FALSE

NULL NULL FALSE NULL

TRUE FALSE NULL

L’opérateur OR

TRUE TRUE TRUE TRUE

FALSE TRUE FALSE NULL

NULL TRUE NULL NULL

TRUE FALSE NULL

L’opérateur NOT

FALSE TRUE NULL

FALSE TRUE FALSE NULL

NULL TRUE NULL NULL

Page 67: Introduction à pl/sql

QUELQUES OPÉRATEURS: OPÉRATEURS ARITHMÉTIQUES

Operateur Signification

= Egal à

<>, !=, ~=, ^= Non égal à

< Inférieur à

> Supérieur à

<= Inférieur ou égal à

>= Supérieur ou égal à 68

Page 68: Introduction à pl/sql

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

Page 69: Introduction à pl/sql

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:

SET SERVEROUTPUT ON

Pour désactiver l’affichage des vérifications

SET VERIFY OFF

70

Page 70: Introduction à pl/sql

Correction

71

-- 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)) ;

END;

/