Cours PL SQL
Cours PL SQL
Cours PL SQL
REMARQUES : Les sections Declare et Exception sont optionnelles Chaque instruction de nimporte quelle section doit se terminer par un ;
MH
Page 1 sur 20
UIMA
Le langage PL/SQL
Exemple dun bloc PL/SQL : DECLARE qte_stock number(5); BEGIN Select quantite into qte_stock from PRODUITS where codprod= p1; -- 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;
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. 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 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 MH Page 2 sur 20 UIMA
Le langage PL/SQL
MH
Page 3 sur 20
UIMA
Le langage PL/SQL
MH
Page 4 sur 20
UIMA
Le langage PL/SQL
Lorsque le type est dclar, on peut dclarer des tableaux de ce type de la faon suivante : Nom_tab nom_type ;
MH
Page 5 sur 20
UIMA
Le langage PL/SQL
1. Dclaration du type de l'enregistrement 2. Dclaration de la variable du type dfini. On peut dclarer un Type RECORD dans la partie dclarative d'un bloc ou d'un sousprogramme en utilisant la syntaxe suivante: 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 : Nom_erg nom_type ;
MH
Page 6 sur 20
UIMA
Le langage PL/SQL
4 STRUCTRES DE CONTROLE
4.1. Les traitements Conditionnels
IF condition_plsql THEN commandes [ELSE commandes] [ELSIF condition_plsql THEN commandes [ELSE commandes]] END IF; La condition peut utiliser les variables dfinies ainsi que tous les oprateurs prsents dans SQL =,<,>,<=,>=,<>, IS NULL, IS NOT NULL. Exemple : DECLARE vjob CHAR(10); vnom employs.ename%type := BEN SALAH ; msg CHAR(30) ; BEGIN Select job into vjob from employs where ename = vnom; --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 ;
MH
Page 7 sur 20
UIMA
Le langage PL/SQL
Les commandes EXIT,EXIT WHEN condition permettent de quitter la boucle. Exemple : DECLARE somme number(10) := 0 ; nombre number(5); BEGIN nombre:=0;
LOOP
Nombre:=nombre+1 ; somme := somme + nombre ; if nombre>=10 then EXIT; end if ; END LOOP; DBMS_OUTPUT.PUT_LINE(la somme des 10 premiers entiers est || to_char(somme)); 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.
v Le curseur explicite 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. v Le curseur implicite Il est gnr et gr par le noyau pour les autres commandes SQL.
MH
Page 8 sur 20
UIMA
Le langage PL/SQL
MH
Page 9 sur 20
UIMA
Le langage PL/SQL
Lordre fetch ne ramne quune seule ligne la fois. De ce fait il faut recommencer lordre pour traiter la ligne suivante. Exemple : Declare Cursor DEPT_10 is select ename, sal from emp where depno = 10; Vnom emp.name%TYPE ; Vsalaire emp.sal%TYPE ; Begin OPEN DEPT_10; LOOP FETCH DEPT10 into vnom,vsalaire ; --Traitement ligne END LOOP ; CLOSE DEPT_10; End;
MH
Page 10 sur 20
UIMA
Le langage PL/SQL
Curseurs explicites Nomcurseur%Found Nomcurseur %Notfound Nomcurseur %Isopen Nomcurseur %Rowcount Nomcurseur %Rowtype
MH
Page 11 sur 20
UIMA
Le langage PL/SQL
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.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.
MH
Page 12 sur 20
UIMA
Le langage PL/SQL
Exemple 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); End Loop; Close C1 ; commit ; End;
Exemple
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 */ 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 ;
MH
Page 13 sur 20
UIMA
Le langage PL/SQL
if c1_record.saltot > 2000 then insert into temp values (c1_record.saltot, c1_record.ename); end if, End Loop; close c1; End;
MH
Page 14 sur 20
UIMA
Le langage PL/SQL
Exemple : 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; 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;
MH
Page 15 sur 20
UIMA
Le langage PL/SQL
6 Utilisation de sous-programmes
PL/SQL accepte aussi lutilisation de sous-programmes, 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.
MH
Page 16 sur 20
UIMA
Le langage PL/SQL
MH
Page 17 sur 20
UIMA
Le langage PL/SQL
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 ;
Le langage PL/SQL
Les exceptions fournies par Oracle sont regroupes dans ce tableau : Nom d'exception 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 Valeur SqlCode -6511 -1 -1001 -1722 -1017 -1403 -1012 -6501 -6500 -51 -1422 -61 -6502 -1476 Erreur Oracle 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
OTHERS : toutes les autres erreurs non explicitement nommes. 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; 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 MH Page 19 sur 20 UIMA
Le langage PL/SQL
Exemple : 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.
MH
Page 20 sur 20
UIMA