Вы находитесь на странице: 1из 29

PL/ SQL PL/SQL

Introduction: t oduct o :
PL/SQL(Procedural Language SQL)estunlangage
procedural structurenBLOCS.
ExtensionduSQL:desrequtesSQLintgresavecles
structuresdecontrlehabituelles(alternatives,
rptitives) p )
UnprogrammePL/SQLestcomposdefonctions,de
procdures,detriggers..
CestunlangagepropritairedORACLE.
Peutsexcutercommeblocanonyme,procdureou
une fonction unefonction
PL/ SQL PL/SQL
LesblocsPL/SQL:UnprogrammePL/SQLestconstitudetroisblocsoude
trois sections troissections.
Lasectiondclarative(optionnelle)
Lasectiondecontrleoudexcution(obligatoire)
Lasectiondegestiondesexception(optionnelle) g p ( p )
Lasectiondclarative:danscettesection,ondclaretouteslesvariables
ncessaireslexcutionduprogrammePL/SQL.Cettesectioncommence
engnralparlemotrserv:DECLARE
La section dexcution: cette section contient des noncs SQL ou PL/SQL Lasectiond excution:cettesectioncontientdesnoncsSQLouPL/SQL.
ElledbuteparlemotrservBEGINetsetermineparlemotrserv
END.
Lasectiondegestiondesexceptions:cettesectioncommenceparlemot
EXCEPTION Si t l d l ti d rservEXCEPTION.Siunerreurestgnrelorsdelexcutiondun
programme,celleciestenvoyeauBLOCEXECPTION,cequidonnela
possibilitdelatraiteretdenepasmettrefinbrutalementlexcution
duProgramme.
PL/ SQL PL/SQL
Exemplededclarations:
DECLARE
Numero NUMBER(4);
nomVARCHAR2(30);
S l i NUMBER(8 2) SalaireNUMBER(8,2);
Date_naissance DATE;
//assignationdevaleur
Augmentatation NUMBER (4) := 5; Augmentatation NUMBER(4):=5;
GroupeVARCHAR2(10):=groupe1;
// utilisation du %TYPE. Permet de dclarer des variable de mme type //utilisationdu%TYPE.Permetdedclarerdesvariabledemmetype
quedesvariablesdjdclare.
Numero_Client yacoubsa.clients.numclient%type
permetdedclarerlenumroduclientdummetypequelenumclient
d l t bl li t d l b delatableclientsdelusageryacoubsa.
PL/ SQL PL/SQL
Suite Exemple de dclarations: SuiteExemplededclarations:
Salaire_MIN NUMBER(7,2);
Salaire MAX SalaireMin%TYPE; Salaire_MAX SalaireMin%TYPE;
ActeurVARCHAR2(30);
R li t A t %TYPE S i lb Realisateur Acteur%TYPE :=Spielberg;
//onpeutdonnerletypeROWTYPElorsquilsagit
de dclarer un enregistrement (une ligne) dedclarerunenregistrement(uneligne).
Enregistrementetudiant%ROWTYPE
Type de donnes: Typededonnes:
Les types SQL (number varchar2(n) date LestypesSQL(number,varchar2(n),date,
char(n),..)http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126.pdf (page110)
Le type Boolean LetypeBoolean
Letypevariable%TYPE
Letyperange%ROWTYPE
LestypesCURSOR.(dynamiqueounon) yp ( y q )
LestypesRECORD.
EXEMPLE: TYPE RECORD EXEMPLE:TYPERECORD
SETSERVEROUTPUTON;
DECLARE DECLARE
TYPEENREISRECORD
(
Nom1USER1.ETUDIANTS.NOM%TYPE,,
prenom1VARCHAR2(20)
);
numad1NUMBER:=20;
ENR ENRE; ENRENRE;
BEGIN
SELECTnom,prenom INTOENR.nom1,ENR.prenom1
FROMetudiants
WHEREnumad =numad1;
DBMS_OUTPUT.PUT_LINE('lenomest'||ENR.nom1 ||'leprenom est'
||ENR.prenom1);
END;;
Le type CURSOR LetypeCURSOR
UncurseurestunezonedemmoireutiliseparOracle
pourrcuprerlesrsultatsderequtesSQL.
Ilpeuttreexplicite,ilestdoncassociuneseulerequte
Exemple:CURSORResultat ISselectnom,preneom from p , p
etudiant where nomlike %POIT%;
Ilpeuttredynamique,nestpasassociuneseule
requteSQL.Danscecas,lorsdesadclaration,ilfaudra
utiliserlemotrservREF.
Exemple:TYPEenregistrementEtudiant is REFCURSOR(la
variableenregistrementEtudiant estdetypeCURSOR
d i ) dynamique).
LetypeCURSORseradtaillplusloin
EXEMPLE: TYPE CURSOR EXEMPLE:TYPECURSOR
SETSERVEROUTPUTON;
DECLARE
CURSORCURSEUR1ISSELECT*FROMetudiants;
ligneCURSEUR1%rowtype;
BEGIN BEGIN
OPENCURSEUR1;
LOOP
FETCH CURSEUR1 INTO ligne; FETCHCURSEUR1INTOligne;
DBMS_OUTPUT.PUT_LINE('lenomest'||ligne.nom||'leprenom est'||
LIGNE.prenom);
EXITWHENcurseur1%NOTFOUND;
ENDLOOP;
CLOSECURSEUR1;
END;
Lesinstructionsdecontrl
InstructionIFENDIF
IF THEN
IFconditionTHEN
Squence_instructions;
ENDIF;
IF THEN ELSE
IFconditionTHEN
Squence_instructions1;
ELSE
Squence instructions2; q _ ;
ENDIF;
Instruction IF END IF InstructionIF ENDIF
IF THEN ELSIF
IFconditionTHEN
Squence_instructions1;
ELSIFconditionTHEN
Squence_instructions2;
ELSIFconditionTHEN
Squence_instructions3;
ELSIFconditionTHEN
Squence_instructions4;
ELSE
Squence_instructions5;
ENDIF;
Exemple Exemple
Declare choixnumber;
begin
IFchoix=1THEN
d l t f d h ti l 100 delete from commanderwhere numarticle =100;
ELSIFchoix=2THEN
delete from commander where numarticle = 110; delete from commanderwhere numarticle 110;
ELSE
delete from commanderwhere numarticle =130;
ENDIF;
END;
IF END IF IF ENDIF
Dans une alternative les mot rservs IF THEN Dansunealternative,lesmotrservsIF,THEN
etENDIFsontobligatoires.Lesautres(ELSIFet
ELSE)sontoptionnels ) p
Exercice:crireunblocPL/SQLquipermetde
dclarer deux variable de type number (vente et dclarerdeuxvariabledetypenumber (venteet
bonus)etquimetjourlesalairedelemploy
commesuit:(salaire=salaire+bonus) ( )
Siventeest>1000alorsbonus=vente*50%
Sinonbonus=vente*20%
Rponse Rponse
CREATEORREPLACEPROCEDUREAugmentation(vente in
number)AS
Bonusnumber;
BEGIN
IFVENTE>1000THENBONUS:=VENTE*0.5;
ELSE ELSE
BONUS:=VENTE*0.2;
ENDIF;
UPDATEEMPLOYESSETSALAIRE=SALAIRE+BONUS;
Commit;
END; END;
CASE WHEN CASE WHEN
LinstructionCASE:permetdexcuterunblocPL/SQLselonlavaleur
d i bl dunevariable
Exemple:
CREATEORREPLACEPROCEDURECASE1(CHOIXINNUMBER)AS
BEGIN
CASECHOIX
WHEN1THENINSERTINTOemployes (numemp,salaire)VALUES(44,28000);
l l i l i h WHEN2THENUPDATEemployes SETsalaire=salaire+10where
numemp =10;
ELSEdbms_output.put_line('pasbonchoix');
END CASE ENDCASE;
END;
LOOP LOOP
Permetdexcuteruneboucle
LLoop
Sequence_instructions
Endloop
EXITWHENpermetdesortirdelaboucle. p
Exemple:
CREATEORREPLACEFUNCTIONCOMPTERRETURNNUMBERAS
compteur number:=0;
BEGIN BEGIN
LOOP
compteur:=compteur+1;
EXITWHENcompteur=10;
ENDLOOP;
RETURNcompteur;
END;
Loop avec EXIT Loop avecEXIT
Lorsdelexecution dunloop,onpeutdciderdesortirimmediatement dela
boucle avec la clause EXIT boucleaveclaclauseEXIT
Exemple
DECLARE
Credit NUMBER:=0;
BEGIN
LOOP
Credit :=Credit +1;
IF Credit> 3 THEN IFCredit>3THEN
EXIT; onsortduloop
ENDIF;
ENDLOOP;
ff h l l d l d pourafficherlersultatduloop toutdesuite
DBMS_OUTPUT.PUT_LINE('Credit :'||TO_CHAR(Credit));
END;
FOR LOOP FORLOOP
set serveroutput on; setserveroutput on;
BEGIN
O i 3 OO FORi IN1..3LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(i));
ENDLOOP;
END; END;
WHILE LOOP WHILELOOP
setserveroutput on; p ;
DECLARE
INUMBER:=1;
BEGIN
WHILEI<10LOOP
I:=I+1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(I));
END LOOP ENDLOOP;
END;
Dcrmentation Dcrmentation
Exemple Exemple
setserveroutput on;
BEGIN BEGIN
FORi INREVERSE1..3LOOP
DBMS OUTPUT PUT LINE (TO CHAR(i)) DBMS_OUTPUT.PUT_LINE(TO_CHAR(i));
ENDLOOP;
END;
Voir lesitepourlesdtails
http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/04_struc.htm
Cursor : statique (explicite) Cursor :statique(explicite)
Un Curseur statique ou explicite est obtenu UnCurseurstatiqueouexpliciteestobtenu
parlexcutiondunecommandeSQL.
Pour son utilisation il faut quatre tapes: Poursonutilisation,ilfautquatretapes:
Dclarationducurseur
O d OPEN Ouvertureducurseur OPEN
Lectureducurseur FETCH
Fermetureducurseur CLOSE
Exemple:
Cursor : statique (explicite) Cursor :statique(explicite)
SETSERVEROUTPUTON;
DECLARE
Nom1USER1.ETUDIANTS.NOM%TYPE;Prenom1 varchar2(20);
CURSORcurseur1ISSELECTnom,Prenom from etudiants;
BEGIN BEGIN
OPENcurseur1;
LOOP
FETCH curseur1 INTO Nom1 Prenom1; FETCHcurseur1INTONom1,Prenom1;
EXITWHENcurseur1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('lenomest'||nom1||'leprenom est'||
prenom1);
ENDLOOP;
CLOSECurseur1;
END;
Cursor : statique (explicite) Cursor :statique(explicite)
Explications: p
Lesvariablesnom1etprenom1sontdesvariableslocales
destinesrecevoirlecontenuducurseur.
LacommandeFETCHpermetdelireligneparlignele
contenuducurseur.chaquefoisquecette
commande est appele, le curseur avance au prochain commandeestappele,lecurseuravanceauprochain
enregistrementdanslensembleactif.
Curseur1%notfound :retournevraisiledernierFETCH
choueetneretourneaucunenregistrement.
%notfound estunattributducurseurexplicite.
Cursor : statique (explicite) Cursor :statique(explicite)
Autresattributsducurseurexplicite:
% found: contraire de %notfound: %found:contrairede%notfound:
Exemple:
CREATEORREPLACEPROCEDUREtest1insertion(NEMPINVARCHAR2,PEMPINVARCHAR2)AS
CURSORCURSEUR1ISSELECT*FROMTEST1;
NOMEMP VARCHAR2(30); NOMEMPVARCHAR2(30);
PRNVARCHAR2(30);
BEGIN
OPENCURSEUR1;
LOOP LOOP
FETCHCURSEUR1INTONOMEMP,PRN;
IFCURSEUR1%FOUNDTHEN
INSERTINTOTEST1VALUES(NEMP,PEMP);
COMMIT; COMMIT;
ELSEEXIT;
ENDIF;
ENDLOOP;
CLOSE CURSEUR1; CLOSECURSEUR1;
endtest1insertion;
Cursor : statique (explicite) Cursor :statique(explicite)
Autresattributsducurseurexplicite:
%rowcount:retournelenombredenregistrements
trouvs
Exemple: Exemple:
LOOP
FETCHemp_curseur INTO p_
emp_nom,dept_num
IFemp_cursor%rowcount>10
THEN EXIT THENEXIT;
ENDIF;
END LOOP; ENDLOOP;
Cursor : statique (explicite) Cursor:statique(explicite)
Autres attributs du curseur explicite: Autresattributsducurseurexplicite:
%isopen:retournevraisilecurseurestouvert:
Exemple: Exemple:
IFemp_curseur%isopen THEN
FETCH FETCH...
ELSE
OPENemp_curseur
ENDIF;
OUVRIRUNCURSEURPOURMODIFIER
UNECOLONNE
DECLARECURSORCUR1FORUPDATE
BEGIN
OPENCUR1
LOOP FETCH LOOPFETCH
IF
THEN UPDATE WHERE CURRENT OF CUR1; THENUPDATEWHERECURRENTOFCUR1;
ENDIF;
ENDLOOP;
CLOSECUR1;
END;
EXERCICE EXERCICE
CRIRE UNE PROCDURE QUI: CRIREUNEPROCDUREQUI:
LITLESCOLONNESVENTESDELATABLES
EMPLOYS ET MET JOUR LA COLONNE EMPLOYSETMETJOURLACOLONNE
COMMISSIONCOMMESUIT:
SI VENTE 2000 ALORS LA COMMISSION EST SIVENTE>=2000ALORSLACOMMISSIONEST
VENTES*0.5.SINONCOMMISSIONEST
VENTES*0.1
RPONSE: RPONSE:
CREATEORREPLACE PROCEDUREUPDATEEEMPLOYEAS
vente number;
CURSORcur1ISSELECTventes fromemployes forupdateof
commision;
BEGIN
open cur1; opencur1;
LOOP
fetch cur1 into vente; fetchcur1intovente;
ifcur1%notfoundthenexit;endif;
IFVENTE>=2000THENupdateemployes setcommision =
vente*0.5wherecurrentofcur1;
Commit;
RPONSE: RPONSE:
ELSE
updateemployes setcommision =vente*0.1where
current of cur1; currentofcur1;
commit;
ENDIF;
ENDLOOP;
l 1 closecur1;
END UPDATEEEMPLOYE; ENDUPDATEEEMPLOYE;

Вам также может понравиться