Académique Documents
Professionnel Documents
Culture Documents
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)) ;
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.
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),]
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 :
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
W WW
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).
(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.
Format
Description
SYSDATE-TO_DATE('07-06-1978','MM-DD-YYYY') -----------------------------------------7882,41303
Remarque :
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
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
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
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 :
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 :
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 ;
ROUND(123.27,1) --------------123,3
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 :
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.
Nadhemb@yahoo.com
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);
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 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.
BEGIN
Section obligatoire contenant des instructions SQL et PL/SQL ou des blocs fils (Possibilits dimbrication de blocs)
EXCEPTION
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.
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
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.
Les variables se dfinissent dans la partie DECLARE, du bloc PL/SQL en utilisant la syntaxe suivante :
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.
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.
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.
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;
Nadhemb@yahoo.com
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 ;
Pour accder un lment du tableau, on doit spcifier une valeur de cl primaire en respectant la syntaxe suivante :
Nom_tab(valeur_cl_primaire) ;
Pour affecter la valeur d'une expression PL/SQL un lment du tableau, on doit utiliser la syntaxe suivante :
Exemple :
DECLARE
nom_type ;
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 ;
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;
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
Comme les tableaux PL/SQL, la dclaration d'un enregistrement se fait en deux tapes :
END ;
11
Nadhemb@yahoo.com
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.
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.
DECLARE
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).
--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 ;
5.1. Dfinition
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.
Syntaxe :
Le curseur explicite
Le curseur implicite
13
Nadhemb@yahoo.com
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
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
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;
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...)
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 :
La syntaxe :
Exemple :
15
Nadhemb@yahoo.com
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
Curseurs implicites
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;
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.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.
17
Nadhemb@yahoo.com
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);
L'objectif est de fournir au programmeur une structure simple et efficace pour utiliser les structures de boucle et les curseurs.
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 :
Cet attribut permet la dclaration implicite d'une structure dont les lments sont d'un type identique aux colonnes ramenes par le curseur.
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 */
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 ;
19
Nadhemb@yahoo.com
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 ;
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 ;
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 ;
21
Nadhemb@yahoo.com
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
La syntaxe de dclaration dune fonction est : FUNCTION nom_fonction[(paramtre1 [, pramtreN ] RETURN type_donnes_fonction IS [dclaration des variables locales] BEGIN
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)
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
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.
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
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
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:
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
25
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