Vous êtes sur la page 1sur 13

Complment sur le langage SQL

Complment sur le langage SQL

1 Les contraintes dintgrit


Exemple :

COMPLEMENT SUR LE LANGAGE SQL


nom_colonne type_donnes [DEFAULT valeur_par_dfaut] [Constraint nom_contrainte] [NULL] | [NOT NULL] | [UNIQUE] | CHECK (condition) valeur_par_dfaul est une valeur affecte la colonne lors dune insertion. Nom_contrainte dsigne le nom de la contrainte. Condition est un condition boolenne que doit vrifier les valeurs affectes la colonne.

Spcification dune cl primaire

CREATE TABLE nom_table (

Nom_colonne1 type_donnes [NOT NULL], Nom_colonne_n type_donnes [NOT NULL], [Constraint nom_contrainte] [Primary key (nom_colonneA, nom_colonneB,,nom_colonneX)]) ;

nom_contrainte est un nom optionnel qui identifie la contrainte nom_colonneA nom_colonneX reprsentent les colonnes qui composent la cl primaire de la table.

Exemple :

CREATE TABLE Facture ( Numfact Number(5) , Datefact date default SYSDATE, Mode_paie varchar2(10) Constraint CK_mode CHECK (mode_paie IN (cheque,espce)), Codcli varchar2(5), Constraint CP_FACT Primary key (Numfact), Constraint CE_CODCLI Foreign Key (Codcli) references Client(codcli)) ;

CREATE TABLE Ligne_Facture (


Exemple :

2 Les fonctions intgres de SQL Manipulation des chanes


LENGTH (chane) : cette fonction retourne la longueur dune chane dans une colonne dune table.
Select nomcli, LENGTH(nomcli) from client ; Si le nom est ALI la fonction retourne 3

Numfact Number(5), Codprod varchar2(5), Qtefact Number(9,3) NOT NULL Constraint CP_LIG_FACT Primary key (Numfact, Codprod)) ;

Remarque :

La contrainte NOT NULL nest pas utilise pour les colonnes Numfact et Codprod car la contrainte Primary Key remplace, entre autre, NOT NULL.

Spcification dune cl trangre

SUBSTR (chane, position_dpart, nombre_caractres) : :cette fonction permet dextraire une portion dune Exemple : Select nomcli, SUBSTR(nomcli,1,4) from client ; Si le nom est mohamed la fonction retourne moha REPLACE (chane, chane_existante, [chane_remplacement]) : cette fonction sert remplacer une chane par une autre dans une colonne.
Exemple :
Update Cours Set titre=REPLACE(titre, sminaire,formation) ;

CREATE TABLE nom_table ( Spcification_colonne1, Spcification_colonneN, [Constraint nom_contrainte_CE Foreign Key (nom_colonneF1,,nom_colonneFN) references table_rfrence (nom_colonneP1,,nom_colonnePN),]

[Constraint nom_contrainte_CP] [Primary key (nom_colonneA, nom_colonneB,,nom_colonneX)]) ;

Note : si on ne spcifie pas la chane de remplacement, la chane existante sera supprime de la colonne.

Spcification_colonne1 spcificatin_colonneN sont les spcifications des colonnes valides (dcrites ci-aprs en dtail). nom_contrainte_CE est le nom optionnel de la contrainte de cl trangre. nom_colonneF1 nom_colonneFN reprsentent les colonnes qui composent la cl trangre. table_rfrence reprsente la table laquelle se rfre la dclaration de la cl trangre. Nom_colonneP1 nom_colonnePN reprsentent la cl primaire de la table rfrence.

chane en lui ajoutant des caractres au dbut. n : est la longuer totale de la chane retourne par la fonction chane_remplissage : est la chane place au dbut de chane

LTRIM (chane): cette fonction limine les espaces (blanc) de dbut de chane RTRIM (chane): cette fonction limine les espaces de fin de chane LPAD (chane, n, chane_remplissage) : cette fonction permet de complter une valeur de
Exemple :

La syntaxe pour spcification colonne est la suivante :


Nadhemb@yahoo.com

Si la colonne nom est ALI alors si on appelle la fonction :


Nadhem Bel Hadj OCA DBA 2 Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Complment sur le langage SQL

Complment sur le langage SQL

W WW

Semaine du mois Semaine de lanne

1-5 1-52

Remarque :
Le format de date par dfaut doracle est DD-MON-YY, par exemple 01-JAN-99.

LPAD(nom,5,*) Le rsultat sera ALI** Note : si on ne spcifie pas la chne de remplissage la chne sera complte par des espaces. RPAD (chane, n, chane_remplissage) : cette fonction fait la mme chose que LPAD mais la fin de la chane. chane de caractres. Pour les formats de date valides voir le tableau 1 : les formats de date ci_dessus.

LOWER (chane) : convertit tous les caractres de la chane en minuscules UPPER (chane) : convertit tous les caractres de la chane en majuscules DECODE (expression, valeur1,valeur1_retourn,,
Exemple :

TO_CHAR (valeur_date, format_date) cette fonction permet de convertir une date en une

Select codetud, TO_CHAR(date_naiss,MONTH DD, YYYY) DATE_NAISS from Etudiant ; Une ligne rsultat de cette requte serait : Codetud DATE_NAISS ------------------------------------------------------------------------ET001 AVRIL 12, 1978

valeurN, valeurN_retourne [,valeur_dfaut_retourne]) valeurN est une valeur possible laquelle valeurN peut tre gale. valeurN_retourne est la valeur retourne par DECODE si expression est gale valeurN. valeur_dfaut_retourne est la valeur retourne si expression nest gale aucune des valeurs de valeur1 valeurN. Exemple : Select jour, DECODE(jour, 1,DIM,2,LUN,3,MAR,4,MER,5,JEU,6,VEN,7,SAM) From vente ; ASCII (chane) retourne le code ASCII du premier caractre de chane.

Oracle possde un certain nombre de valeur appeles pseudo-colonnes auquelles il est possible de se rfrer dans des instructions SQL. Une de ces valeurs est SYSDATE qui retourne la date actuelle (heure comprise la seconde prs).

Manipulation des dates


TO_DATE
Exemple :

(chane, format_date) cette fonction permet de convertir une chane de caractres en une date, le paramtre format_date est le mme que la fonction TO_CHAR.

Voici prsent un tableau contenant les formats de date possibles :

Select SYSDATE TO_DATE(07-06-1978,MM-DD-YYYY) from dual ; Le resultat de cette requte est :

Tableau 1 : les formats de date Plage de valeurs

Format

Description

SYSDATE-TO_DATE('07-06-1978','MM-DD-YYYY') -----------------------------------------7882,41303

Remarque :

Manipulation des nombres

dual est une table systme laquelle lutilisateur ne peut ajouter aucune ligne car cette table ne doit contenir quune seule ligne veillant au fonctionnement correcte de certain outils Oracle. SYSDATE est une colonne de la table dual.

TO_CHAR

(nombre, [,format]) cette fonction permet de convertir un nombre en une chane de caractres , format est le modle de format optionnel que la fonction peut utiliser. Pour spcifier le nombre de chiffres affichs, il faut remplacer chaque chiffre par un 9 comme lindique les exemples suivants :

Exemples :
Select cred_cli , TO_CHAR(cred_cli) from client ; Select TO_CHAR(cred_cli,9,999.99) from client ; Select TO_CHAR(cred_cli,09.99) from client ;
Nadhem Bel Hadj OCA DBA 4 Nadhemb@yahoo.com

SS SSSS MI HH HH24 DD DAY D DDD MM MON MONTH YY YYYY YEAR

Seconde Seconde aprs minuit Minute Heure Heure militaire Jour du mois Jour de la semaine en entier Jour de la semaine Jour de lanne Numro du mois Mois abrg Mois en entier Deux derniers chiffres de lannes Anne en entier Anne en entier

CC Q

Sicle Trimestre

0-59 0-86399 0-59 0-12 0-23 1-31 DIMANCHE-SAMDI 1-7 1-366 1-12 JAN-DEC JANVIER-DECEMBRE 99 par exemple 1999 par exemple MIILLENEUFCENTQUATREVI NGTDIXNEUF par exemple 19 par exemple 1-4
Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Complment sur le langage SQL

Complment sur le langage SQL

Select TO_CHAR(cred_cli,$999.99) from client ;

Exemple :
Select FLOOR (128.3), FLOOR (129.8) from dual ; FLOOR(128.3) FLOOR(129.8) ------------ -----------128 129

format]) cette fonction permet de convertir une chane en un nombre, format est le modle de format optionnel que la fonction peut utiliser

TO_NUMBER (chane [,

Exemple :

Update produit set Puprod = TO_NUMBER($2.81,$999.99) Where codprod = po888 ;

ROUND (valeur ,[chelle]) cette fonction permet darrondir un nombre, elle reoit deux
Exemple :
Select CEIL(128.3), CEIL(129.8) from dual ;

CEIL (valeur) cette fonction retourne lentier immdiatement suprieur ou gale son paramtre numrique.

paramtres : une expression numrique et un nombre optionnel correspondant au nombre de chiffres utiliss lors du calcul de larrondi. Si le deuxime paramtre nest pas fourni la fonction arrondi lexpression numrique lentier le plus proche. Si en revanche il est indiqu la valeur numrique sera arrondie au nombre dcimal le plus proche avec, droite de la virgule, le nombre de chiffres spcifi (chelle).

Exemple :

Select ROUND(123.2) from dual ;

CEIL(128.3) CEIL(129.8) ----------- ----------129 130 NVL (valeur_colonne, valeur_substitution) cette fonction retourne valeur_substitution si valeur colonne est NULL sinon valeur_colonne.

Exemple :
Select cocli, NVL (cred_cli, 0) from client ;

Le rsultat sera : ROUND(123.2) -----------123

Select ROUND(123.27,1) from dual ;

ROUND(123.27,1) --------------123,3

Select ROUND(101.8) from dual ;

ROUND(101.8) -----------102

TRUNC (valeur ,[chelle]) cette fonction est similaire la fonction ROUND. Toutefois, au lieu darrondir, elle supprime la partie dcimale de son paramtre numrique.

Exemple :

Select TRUNC(123.33), TRUNC(123.567,2) from dual ;

TRUNC(123.33) TRUNC(123.567,2) ------------- ---------------123 123,56

FLOOR

(valeur) cette fonction est presque identique la fonction TRUNC, cette diffrence prs quelle ne peut tronquer un nombre dcimal. Elle retourne lentier qui est infrieur ou gale son paramtre.

Nadhem Bel Hadj OCA DBA

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

LE LANGAGE PL/SQL
DECLARE BEGIN
Select quantite into qte_stock from PRODUITS where codprod= p1; qte_stock number(5);

Exemple dun bloc PL/SQL :

1 / INTRODUCTION :
-- contrle du stock suffisant If qte_stock > 0 then update produits set quantite=quantite-1 where codprod= p1; Insert into achat values (p1', SYSDATE) else Insert into acheter values ('Plus de p1',SYSDATE); end If, commit, END;

SQL est un langage complet pour travailler sur une base de donne relationnelle, mais il ne comporte pas des instructions procdurales. PL/SQL comprend quant lui :

La partie LID (Langage dInterrogation des donnes) de SQL (Select), la partie LMD (Langage de Manipulation des Donnes) de SQL (Update, Insert,) la gestion des transaction (Commit, Rollback) les fonctions standard de SQL plus une partie procdurale (IF, WHILE,)

PL/SQL est donc un langage algorithmique complet

3/. LES DECLARATIONS PL/SQL


La partie dclarative dans un bloc PL/SQL, peut comporter trois types de dclarations. Elle est dlimite par les mots-cl : DECLARE, qui spcifie le dbut et BEGIN, qui signifie la fin de la dclaration et le dbut de la partie des commandes. Les types de dclarations possibles dans cette partie sont les suivants : dclaration des variables et des constantes, dclaration de curseurs, dclaration des exceptions.

REMARQUE : PL/SQL ne comporte pas dinstructions de LDD (Create, Alter)

2/ STRUCTURE DUN BLOC PL/SQL


3.1 Types de donnes

PL/SQL n'interprte pas une commande, mais un ensemble de commandes contenues dans un programme ou bloc PL/SQL. La structure dun bloc est la suivante:

DECLARE

Chaque variable ou constante utilise dans un bloc PL/SQL, possde un type de donnes. PL/SQL offre deux varits de types de donnes prdfinies : scalaire et compos.

Dclarations de variables, constantes, exception;

BEGIN

Section obligatoire contenant des instructions SQL et PL/SQL ou des blocs fils (Possibilits dimbrication de blocs)

EXCEPTION

Traitement des exceptions (gestion des erreurs)

END;

Les types scalaires : Binary_integer : entiers entre 231 et 231 -1 Number : un numrique Positive : entiers positifs Natural : entiers naturels Decimal , float, integer, real sont des sous-types de number Char : chane de caractre taille fixe allant jusqu 32 767 caractre (au lieu de 255 dans la

REMARQUES :

Les sections Declare et Exception sont optionnelles Chaque instruction de nimporte quelle section doit se terminer par un ;

dfinition des colonnes des tables) Varchar2 : est une chane de caractre de longueur variable allant jusqu 32 767 (au lieu de 2000 dans la dfinition des colonnes des tables) Boolean : type boolen ses valeurs possibles sont TRUE, FALSE, NULL Date : type date dOracle Rowid : type interne Oracle compos de 6 octets qui permet didentifier une ligne unique dune table et doffrir un accs rapide aux donnes.

Les types Composs : Record : cest le type enregistrement


Nadhemb@yahoo.com Nadhem Bel Hadj OCA DBA 8 Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

Table : cest le type tableau


Deux possibilits daffectation ou dassignement sont disponibles: par l'oprateur d'affectation:':=', par la clause Select ... Into La difficult dans l'utilisation de la clause Select rsulte du nombre de lignes ou d'occurrences retourn. Si le Select retourne une et une seule valeur l'affectation s'effectue correctement. Par contre Si le SELECT ne retourne aucune ligne, lerreur PL/SQL NO_DATA_FOUND sera gnre. Si le SELECT retourne plusieurs lignes : lerreur TOO_MANY_ROWS sera gnre.

3.2.2 Laffectation des variables PL/SOL

3.2 Variables et constantes

La dclaration d'une variable consiste allouer un espace pour stocker et modifier une valeur. elle est type et peut recevoir une valeur par dfaut et/ou un statut NOT NULL. Une constante est dfinie comme une variable, mais l'utilisateur ne peut pas modifier son contenu.

3.2.1. La dfinition des variables en PL/SQL

Les variables se dfinissent dans la partie DECLARE, du bloc PL/SQL en utilisant la syntaxe suivante :

3.3. Les tableaux en PL/SQL


Nous avons vu prcdemment que le langage PL/SQL fournit deux types d'objets composs: les tableaux (TABLE), les enregistrements (RECORD). Les tableaux sont conus comme les tables de la base de donnes. Ils possdent une cl primaire(index) pour accder aux lignes du tableau. Un tableau, comme une table, ne possde pas de limite de taille. De cette faon, le nombre d'lments d'un tableau va crotre dynamiquement.

nomvariable [CONSTANT] {type | variable%TYPE | colonne_de_table.%ROWTYPE} [NOT NULL] [{ :=|DEFAULT} expression PL/SQL]

Remarques : L'attribut CONSTANT permet de figer l'affectation d'une variable. L'attribut Not NULL rend obligatoire d'initialiser la variable lors de sa dfinition.

3.3.1 La dclaration d'un tableau


Les tableaux PL/SQL doivent tre dclars en deux tapes. 1.Dclaration du type de la TABLE 2.Dclaration dune table de ce type. On peut dclarer un type TABLE dans la partie dclarative d'un bloc ou d'un sous-programme en utilisant la syntaxe suivante :

On peut faire rfrence une colonne d'une table par la dclaration : nom_variable TABLE.COLONNE%TYPE, On peut faire rfrence une ligne d'une table par la dclaration Nom_variable TABLE%ROWTYPE, On peut faire rfrence une variable prcdemment dfinie par l'instruction Nom_variable Pnom variable%TYPE L'initialisation d'une variable se fait par l'oprateur := suivi d'une constante, d'une expression PL/SQL, d'une fonction PL/SQL.

TYPE nom_type IS TABLE OF

{typecolonne | variable%TYPE | table.colonne%TYPE} [NOT NULL]

INDEX BY BINARY_INTEGER ;

Les variables peuvent galement tre dfinies dans l'environnement extrieur au Bloc PL/SQL par exemple comme des champs de l'cran en Form Builder. Ces variables seront utilises prfixes de':'.

Norn_type : utilis ultrieurement dans la dclaration des tables PL/SQL. typecolonne : type de donnes comme CHAR, DATE, ou NUMBER.

Exemples de dclaration de variables :

Total NUMBER(9,3); Nom CHAR(4) := ISET; Longeur NUMBER NOT NULL := LENGTH (Nom)*2; Date_Cration DATE; Numro EMPLOYE.EMPNO%TYPE; Dpt DEPARTEMENT%ROWTYPE; Prnom Nom%TYPE; Pi CONSTANT NUMBER:= 3.14;

Nadhem Bel Hadj OCA DBA

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

10

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

Lorsque le type est dclar, on peut dclarer des tableaux de ce type de la faon suivante :

Nom_tab
On peut dclarer un Type RECORD dans la partie dclarative d'un bloc ou d'un sousprogramme en utilisant la syntaxe suivante:

nom_type ;

1. Dclaration du type de l'enregistrement 2. Dclaration de la variable du type dfini.

3.3.2 L'accs aux lments d'un tableau


TYPE nom_type IS RECORD
(champ {type_champ | table.colonne%TYPE [NOT NULL], champ (type_champ | table.colonne%TYPE [NOT NULL],...) nomtype : utilis ensuite dans la dclaration des enregistrements PL/SQL. Type-champ : type de donnes comme CHAR, DATE ou NUMBER. Lorsque le type est dclar,On peut dclarer des enregistrements de ce type de la faon suivante :

Pour accder un lment du tableau, on doit spcifier une valeur de cl primaire en respectant la syntaxe suivante :

Nom_tab(valeur_cl_primaire) ;

Valeurcl_primaire : doit tre du type BINARY_INTEGER

Pour affecter la valeur d'une expression PL/SQL un lment du tableau, on doit utiliser la syntaxe suivante :

nom_tab(valeur_cl_primaire) := expression_Pl/sql ; Nom_erg

Exemple :

DECLARE

nom_type ;

TYPE nom_tab_type IS TABLE OF CHAR(25) INDEX BY BINARY-INTEGER;

3.4.2 L'accs aux champs d'un enregistrement

Pour accder un lment d'une variable de type record, il suffit d'utiliser la syntaxe suivante

Nom_erg.nom_champ

tab_nom

nom_tab_type ;

BEGIN Exemple : DECLARE

Pour affecter la valeur d'une expression PL/SQL un lment de l'enregistrement, on doit utiliser la syntaxe suivante :

tab_nom(l):='TUNISIE'; END;

Nom_erg.nom_champ := expression_pl/sql;

3.4. Les enregistrements prdfinis (record PL/SOL)

La restriction pose par l'utilisation du type %ROWTYPE pour dclarer un enregistrement rside dans le manque de spcification des types de donnes au niveau de l'enregistrement.

L'implmentation du nouveau type compos nomm RECORD a permis de lever cette restriction.

TYPE ADRESSE IS RECORD (Numero positive, Rue varchar2(35), CodePost char(5), Ville varchar2(25), Pays varchar2(30) ); TYPE CLIENT IS RECORD (NumCIi positive, NomCli varchar2(40), Adrcli ADRESSE, CA number(12,3)); monclient CLIENT ;

BEGIN

3.4.1 La dclaration d'un enregistrement

monclient.NumCIi := 1234; monclient.NomCIi := Ben HUSSEIN; monclient.AdrCli.Numero := 10;

Comme les tableaux PL/SQL, la dclaration d'un enregistrement se fait en deux tapes :

END ;

Nadhem Bel Hadj OCA DBA

11

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

12

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

4 STRUCTRES DE CONTROLE
Les commandes EXIT,EXIT WHEN condition permettent de quitter la boucle.

4.1. Les traitements Conditionnels


DECLARE
somme number(10) := 0 ; nombre number(5);

Exemple :

BEGIN
nombre:=0;

IF condition_plsql THEN commandes [ELSE commandes] [ELSIF condition_plsql THEN commandes [ELSE commandes]] END IF;

LOOP
Nombre:=nombre+1 ; somme := somme + nombre ; if nombre>=10 then EXIT; end if ;

La condition peut utiliser les variables dfinies ainsi que tous les oprateurs prsents dans SQL =,<,>,<=,>=,<>, IS NULL, IS NOT NULL.

Exemple : END LOOP;

DECLARE

DBMS_OUTPUT.PUT_LINE(la somme des 10 premiers entiers est || to_char(somme)); END;

vjob vnom msg

CHAR(10); employs.ename%type := BEN SALAH ; CHAR(30) ;

4.2.2. L'instruction FOR LOOP


FOR compteur IN [REVERSE] var_debut.. var_fin LOOP
instructions

BEGIN END LOOP ;

Select job into vjob from employs where ename = vnom;

compteur. est une variable de type entier, locale la boucle. Sa valeur de dpart est gale par dfaut la valeur de l'expression entire de gauche (var_debut). Elle s'incrmente de 1, aprs chaque traitement du contenu de la boucle, jusqu' ce qu'elle atteigne la valeur de droite (var_fin).

5. LES CURSEURS EN PL/SQL


Pour traiter une commande SQL, PL/SQL ouvre une zone de contexte pour excuter les commandes et stocker les informations.

--contrle de la valeur de vjob if vjob is NULL then msg := vnom || pas de travail'; elsif vjob = Vendeur then UPDATE employs set comm = 100 where ename=vnom ; Msg := vnom || a 100 dinars de commission ; Else UPDATE employs set comm = 0 where ename=vnom ; Msg := vnom || na pas de commission ; End if ; DBMS_OUTPUT.PUT_LINE(msg) ; commit; END ;

4.2 Les Traitements.Rptitifs

5.1. Dfinition

4.2.1. linstruction LOOP

Le curseur permet de nommer cette zone de contexte, d'accder aux informations et ventuellement de contrler le traitement. Cette zone de contexte est une mmoire de taille fixe, utilise par le noyau pour analyser et interprter tout ordre SQL.

LOOP permet de rpter une squence de commandes. Cette squence est comprise entre le mot-cl LOOP, indiquant le dbut dune boucle et END LOOP, spcifiant sa fin.

5.2. Les types de curseurs


Il est cr et gr par l'utilisateur pour traiter un ordre Select qui ramne plusieurs lignes. Le traitement du select se fera ligne par ligne.

Syntaxe :

Le curseur explicite

LOOP instructions END LOOP ;

Il est gnr et gr par le noyau pour les autres commandes SQL.

Le curseur implicite

Nadhem Bel Hadj OCA DBA

13

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

14

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

5.3. Les tapes d'utilisation d'un curseur explicite


5.3.3. Le traitement des lignes
Il faut traiter les lignes une par une et renseigner les variables rceptrices dfinies dans la partie Declare du bloc.

Pour traiter une requte qui retourne plusieurs lignes, l'utilisateur doit dfinir un curseur qui lui permet dextraire la totalit des lignes slectionnes.

Lutilisation d'un curseur pour traiter un ordre Select ramenant plusieurs lignes, ncessite 4 tapes:

La syntaxe :
Dans la partie traitement du bloc.PL/Sql, il faut commencer par ouvrir le curseur puis

1. Dclaration du curseur 2. Ouverture du curseur 3. Traitement des lignes 4. Fermeture du curseur.

FETCH nomcurseur INTO

{nomvariable [,nomvariable] | nomrecord}

5.3.1. La dclaration d'un curseur


Exemple :
Declare

Lordre fetch ne ramne quune seule ligne la fois. De ce fait il faut recommencer lordre pour traiter la ligne suivante.

La dclaration du curseur permet de stocker l'ordre Select dans le curseur. La Symtaxe de dfinition..

Le curseur se dfinit dans la partie DECALRE d'un bloc PL/SQL. Cursor nomcurseur [(nompararn type [,nomparam type, ...)] Begin

IS Commande_SELECT

Cursor DEPT_10 is select ename, sal from emp where depno = 10; Vnom emp.name%TYPE ; Vsalaire emp.sal%TYPE ;

Exemple :

Declare Cursor DEPT_10 is select ename, sal from emp where depno = 10; End;

5.3.2. L'ouverture et la fermeture dun curseur

OPEN DEPT_10; LOOP FETCH DEPT10 into vnom,vsalaire ; --Traitement ligne END LOOP ; CLOSE DEPT_10;

L'tape d'ouverture permet d'effectuer: 1. l'allocation mmoire du curseur, 2. l'analyse smantique et syntaxique de l'ordre 3. le positionnement de verrous ventuels (si select for update...)

5.4 Les attributs dun curseur

Les attributs dun curseur nous fournissent des informations sur lexcution dun ordre. Ils sont conservs par PL/SQL aprs lexcution du curseur (implicite ou explicite) Ces attributs permettent de tester directement le rsultat de lexcution. Ils sont rsums dans le tableau suivant :

L'tape de fermeture permet de librer la place mmoire rserv.

La syntaxe :

OPEN nomcurseur [(nomparam1[,nomparam2 , ...)] /* traitement des lignes */ CLOSE nomcurseur

Exemple :

Begin OPEN DEPT_10 /* traitement des lignes*/ CLOSE DEPT_10

Nadhem Bel Hadj OCA DBA

15

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

16

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

Exemple : Curseurs explicites

Sql%Found Sql%Notfound Sql%Isopen Sql%Rowcount Sql%Rowtype

Curseurs implicites

Nomcurseur%Found Nomcurseur %Notfound Nomcurseur %Isopen Nomcurseur %Rowcount Nomcurseur %Rowtype

5.4.1 lattribut %Found

cet attribut est de type boolen (vrai ou faux) Pour les curseurs implicites, cet attribut est vrai si les instructions insert, update, delete traitent au moins une ligne. Pour les curseurs explicites, il est vrai si le fetch ramne au moins une ligne.

Exemple :

Declare CURSOR num_cur1 IS SELECT num from tab1 ; CURSOR num_cur2 IS SELECT num from tab2 ; Num1 number ; Num2 number ; somme number := 0; Begin OPEN num_cur1 ; OPEN num_cur2 ; LOOP FFTCH num_cur1 INTO num1 ; FFTCH num_cur2 INTO num2; EXIT WHEN (num_cur1%NotFound) OR (num_cur2%NotFound) ; somme:= num1 + num2 ; INSERT INTO sum_tab VALUES (somme); END LOOP; CLOSE numl_cur1 ; CLOSE mun_cur2 ; END;

5.4.3. L'attribut %IsOpen


Exemple :

Cet attribut est de type boolen soit vrai, soit faux. Le curseur implicite est toujours faux car Oracle referme toujours les curseurs qu'il ouvre aprs chaque utilisation. Le curseur explicite est vrai si le curseur est ouvert.

Declare CURSOR num_cur1 IS SELECT num from tab1 ; CURSOR num_cur2 IS SELECT num from tab2 ; Num1 number ; Num2 number ; somme number := 0; Begin OPEN num_cur1 ; OPEN num_cur2 ; LOOP FFTCH num_cur1 INTO num1 ; FFTCH num_cur2 INTO num2; IF (num_cur1%Found) AND (num_cur2%Found) THEN somme:= num1 + num2 ; INSERT INTO sum_tab VALUES (somme); ELSE Exit ; END IF; END LOOP; CLOSE numl_cur1 ; CLOSE mun_cur2 ; COMMIT; END;

Declare Cursor Dept10 is Select ename, sal from emp where deptno=10; Begin If not (Dept10%lsopen) then open Dept10 ; End if, Fetch Dept10 into --traitement End ;

5.4.2. L'attribut %NotFound

5.4.4.'L'attribut %RowCount
Cet attribut est de type numrique. Le curseur implicite indique le nombre de lignes traits par les ordres insert, update, delete. Le curseur explicite est incrment chaque ordre fetch, donc cet attribut traduit la nime ligne traite.

cet attribut est de type boolen (vrai ou faux) Pour les curseurs implicites, cet attribut est vrai si les instructions insert, update, delete ne traitent aucune ligne. Pour les curseurs explicites, il est vrai si le fetch ne ramne plus de ligne.

Nadhem Bel Hadj OCA DBA

17

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

18

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

Exemple
if c1_record.saltot > 2000 then insert into temp values (c1_record.saltot, c1_record.ename); end if, End Loop; close c1; End;

Declare cursor C1 is select ename, empno, sal from emp order by sal desc ; nom char(10); numero number(4); salaire number(7,2); Begin Open Cl; Loop . Fetch cl into nom, numro, salaire ; exit when (c1%rowcount > 25) or (cl%notfound); insert into temp values (salaire, numro, nom);

5.5. Les boucles et les curseurs

L'objectif est de fournir au programmeur une structure simple et efficace pour utiliser les structures de boucle et les curseurs.

End Loop; Close C1 ; commit ; End;

Declare Cursor nomcurseur is ordre_select ; Begin For nomrecord in nomcurseur Loop /* traitement End Loop; End; Le bloc PL/SQL ci-dessu permet d'obtenir une gnration implicite de la structure suivante :

5.4.5. L'attribut %Rowtype

Cet attribut permet la dclaration implicite d'une structure dont les lments sont d'un type identique aux colonnes ramenes par le curseur.

Syntaxe : Dans la partie dclarative du bloc.

CURSOR nomcurseur IS ordre select; nomrecord nomcurseur%Rowtype;

Les lments de la structure sont identifis par:nomrecord.nomcolonne La structure est renseigne par le Fetch : Fetch nomcurseur into nomrecord;

Exemple

Declare Cursor nomcurseur is ordre select; nomrecord nomcurseur%rowtype; Begin Open nomcurseur ; Loop Fetch nomcurseur into nomrecord ; Exit when nomcurseur%notfound ; /* traitement End Loop; Close nomcurseur; End;

Declare /* la fonction nvl permet de tester la valeur Null d'une colonne si comm=NULL alors nvl retourne 0 sinon nvl retourne la valeur de comm */

5.6. Le curseur paramtre

Il permet d'utiliser des variables dans le curseur. Principalement dans la clause where. Il faut pour cela spcifier les noms et les types des paramtres dans la dclaration du curseur. Cursor nomcurseur (paraml type, param2 type,...) is select ordre_select , L'ordre_select utilise les paramtres. Les types possibles sont : char, number, date, boolean sans spcifier la longueur. Begin Open nomcurseur (valeurl , vaieur2, ....) ;

cursor c1 is select sal + nvl(comm) saltot, ename from emp; /* l'enregistrement comporte deux colonnes: saltot, ename c1_record c1%Rowtype;

Begin open c1; Loop Fetch c1 into c1_record; Exit when c1 %notfound ;

Nadhem Bel Hadj OCA DBA

19

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

20

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

Exemple :
PL/SQL accepte aussi lutilisation de sous-programmese, nomms procdures et fonctions. Une procdure PL/SQL excute certaines actions et peut accepter des paramtres optionnels. Une fonction PL/SQL retourne une valeur dun certain type et peut aussi accepter des paramtres optionnels.

6 Utilisation de sous-programmes
6.1 Dclaration dune procdure
La syntaxe de dclaration dune procdure est : PROCEDURE nom_procdure [(paramtre1 [, pramtreN ] IS [dclaration des variables locales] BEGIN

Declare cursor c1 (depart number) is select sal, nvl(comm,0) commi from emp where deptno=depart ;

total number(11,2) := 0 ; sal_sup number(4):=0 ; comm_sup number(4):=0;

Instructions PL/SQL [section_exception ] END [nom_procdure]


Paramtre1 paramtreN reprsentent la dclaration des paramtres de la procdure sous la forme : nom_paramtre [IN|OUT|IN OUT] type_donnes [ { :=|default } valeur]. dclaration des variables locales reprsentent les dclarations optionnelles de variables, de constantes, de fonctions et de procdures locales la procdure. section_exception est la section optionnelle de gestion des exceptions de la procdure.

Begin for c1_rec in c1(20) Loop total:= total+ c1_rec.sal + c1_rec.commi ; if c1_rec.sal > 4000 then sal_sup := sal_sup + 1 ; end if ; if c1_rec.commi > 3000 then commi_sup:=commi_sup+1 ; end if; End Loop; insert into temp values (sal_Sup, comm_sup, 'total salaire||to_Char(total)); commit ; End;

Exemple :
Declare Vpatient_ID Patient.Patient_ID%type ; Fivre_eleve constant real := 42 ; Procedure enregistrer_Temp_Deg_C_Patient (patient_ID varchar2, Temp_Corps_Deg_C real) is Temp_Deg_F real ; Begin Temp_Deg_F := (9/5)* Temp_Corps_Deg_C + 32 ; Insert into Patient (Patient_ID, Temp_Corps_Deg_F) Values (patient_ID, Tem_Deg_F) ; Commit ; End ; Begin Vpatient_ID := ES8888 ; enregistrer_Temp_Deg_C_Patient (Vpatient_ID, Fivre_eleve) ; End ;

5.7. La clause "current of"

Cette clause permet d'accder directement la ligne ramene par l'ordre Fetch afin de la traiter (update, delete).

Exemple :

Il faut se rserver la ligne lors de la dclaration du curseur par le positionnement d'un verrou d'intention : (For update of nom_colonne) Il faut spcifier que l'on veut traiter la ligne courante au Fetch par la clause :(Where current of nom_curseur)

Declare Cursor cl is select ename, sal from emp for update of sal ; Begin For c1_record in c1 Loop If c1_ record.sal > 1500 then insert into resultat values (c1_record.sal, c1_record.sal*1.3, c1_record.ename); update emp set sal = sal * 1.3 where current of c1 ; end if, End loop ; Commit; End ;

Nadhem Bel Hadj OCA DBA

21

Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

22

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

6.2 Dclaration dune fonction


Un ou plusieurs paramtres peuvent tre passs une procdure ou une fonction, de trois faons : IN, OUT ou IN OUT

6.3 Paramtres de procdure et fonction


Exemple :

La syntaxe de dclaration dune fonction est : FUNCTION nom_fonction[(paramtre1 [, pramtreN ] RETURN type_donnes_fonction IS [dclaration des variables locales] BEGIN

Instructions PL/SQL RETURN val__retourne [section_exception ] END [nom_fonction]

Exemple :

Soit lextrait suivant dune base de donnes relationnelle dune application de gestion de scolarit dune universit : Etudiant(codetu, nometu,adretu) Matire(codmat, description_mat, coefmat) Moyenne(codetu,codmat, moyenne_mat)

La fonction meilleur_tu_mat retourne le code du meilleur tudiant dune matire donne.

Declare Param1 number ; Param2 number ; Param3 number ; Procedure Diffrents_Param(P1 IN number, P2 OUT number, P3 IN OUT number) Is Begin P2 := P1 ; P3 := P3 + 1 ; END ; Begin Param1 := 3.14 ; Param3 := 15 ; Diffrents_Param(Param1, Param2, Param3) ; DBMS_OUTPUT.PUT_LINE('param1 = ' || to_char(param1) || 'param2 = ' || to_char(param2) || 'param3 = ' || to_char(param3) ); End ;

Declare Codmatire Matire.codmat%type; Vcode_etu etudiant.codetu%type; FUNCTION meilleur_tu_mat (pcodmat varchar2) RETURN varchar2 IS Vcodetu etudiant.codeetu%type ; BEGIN

7. GESTION DES ERREURS


Le mcanisme de gestion d'erreurs dans PL/SQL est appel gestionnaire des exceptions. Il permet au programmeur de planifier sa gestion et d'abandonner ou de continuer le traitement en prsence d'une erreur. Il faut affecter un traitement appropri aux erreurs apparues dans un bloc PL/SQL. C'est pourquoi on distingue 2 types d'erreurs ou d'exceptions : 1. systme environnant. 2. Anomalie dtermine par 1'utilisateur.

Select codetu into Vcodetu From Moyenne M Where M.moyenne_mat in (Select max(moyenne_mat from Moyenne M Where M.codmat=pcodmat); Return Vcodetu; End ; Begin Codmatire := M001; Vcode_etu := meilleur_tu_mat(Codmatire); DBMS_OUTPUT.PUT_LINE(Le meilleur tudiant de la matire || Codmatire || est : || Vcode_etu); End ;

Erreur interne Oracle (Sqlcode <= 0) : dans ce cas la main est rendue directement au
La solution : 1. Donner un nom l'erreur (si elle n'est pas dj prdfinie), 2. Dfinir les anomalies utilisateurs, leur associer un nom, 3. Dfinir le traitement effectuer.

7.1. Les exceptions internes

Une erreur interne est produite quand un bloc PL/SQL viole une rgle d'Oracle ou dpasse une limite dpendant du systme d'exploitation. Les erreurs Oracle gnres par le noyau sont numrotes, or le gestionnaire des exceptions de PL/SQL, ne sait que grer des erreurs nommes. Pour cela PL/SQL a redfini quelques erreurs Oracle comme des exceptions. Ainsi, pour grer d'autres erreurs Oracle, 1'utilisateur doit utiliser le gestionnaire OTHERS ou EXCEPTION_INIT pour nommer ces erreurs.
Nadhemb@yahoo.com Nadhem Bel Hadj OCA DBA 24 Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

23

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Le langage PL/SQL

Le langage PL/SQL

Les exceptions fournies par Oracle sont regroupes dans ce tableau :

7.2. Les exceptions utilisateur (externes)


Erreur Oracle
1. Nommer l'anomalie (type exception) dans la partie Dclare du bloc. DECLARE Nom_ano Exception; 2. Dterminer lerreur et passer la main au traitement appropri par la commande Raise. BEGIN If (condition_anomalie) then raise Nom_ano 3. Effectuer Ie traitement dfini dans la partie EXCEPTION du Bloc. EXCEPTION WHEN (Nom_ano) then (traitement); ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01717 ORA-01413 ORA-01012 ORA-06501 ORA-06500 ORA-00051 ORA-01422 ORA-00061 ORA-06502 ORA-01476

CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR STORAGE_ERROR TIMEOUT_ON_RESOURCE TOO_MANY_ROWS TR.ANSACTION_BACKED_OUT VALUE_ERROR ZERO_DIVIDE

Nom d'exception

Valeur SqlCode

-6511 -1 -1001 -1722 -1017 -1403 -1012 -6501 -6500 -51 -1422 -61 -6502 -1476

PL/SQL permet l'utilisateur de dfinir ses propres exceptions. La gestion des anomalies utilisateur peut se faire dans un bloc PL/SQL en effectuant les oprations suivantes:

OTHERS : toutes les autres erreurs non explicitement nommes. Exemple :

Pour grer les exceptions le programmeurdoit crire un gestionnaire des exceptions qui prend le contrle du droulement du bloc PL/SQL en prsence d'une exception. Le gestionnaire d'exception fait partie du bloc PL/SQL et se trouve aprs les commandes Il commence par le mot cl EXCEPTION et se termine avec le mme END du bloc. Chaque gestion d'exception consiste spcifier son nom d'erreur aprs la clause WHEN et la squence de la commande excuter aprs le mot cl THEN, comme le montre l'exemple suivant:

DECLARE Wsal emp.sal%type; BEGIN select sal into wsal from emp;

DECLARE wsal emp.sal%type ; sal_zero Exception ; BEGIN Select sal into wsal from emp where empno=5; If wsal=0 then Raise sal_zero; EXCEPTION WHEN sal_zero then -- grer erreur salaire WHEN TOO_MANY_ROWS then... --grer erreur trop de lignes WHEN_NO_DATA_FOUND then ... -- grer erreur pas de ligne WHEN OTRERS then ... --grer toutes les autres erreurs END; Le programmeur Peut utiliser les fonctions Sqlcode et Sqlerrm pour coder les erreurs Oracle en Exception. sqlcode est une fonction propre PL/SQL qui retourne le numro (gnralement ngatif) de l'erreur courante. Sqlerrm reoit en entre le numro de l'erreur et renvoie en sortie le message de l'erreur cod sur196 octets.

EXCEPTION WHEN TOO_MANY_ROWS then --grer erreur trop de lignes WHEN NO_DATA_FOUND then --grer erreur pas de ligne WHEN OTHERS then --grer toutes les autres erreurs END ;

Remarques :

L'exception optionnelle OTHERS est toujours situe la fin des exceptions. Pour rattacher une squence de commandes plus d'une exception, l'utilisateur peut utiliser l'oprateur boolen OR comme suit : WHEN erreurl OR erreur2 THEN-- grer erreurl2
Nadhemb@yahoo.com

Nadhem Bel Hadj OCA DBA

25

Nadhem Bel Hadj OCA DBA

26

Nadhemb@yahoo.com

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Vous aimerez peut-être aussi