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

PL/SQL:ProceduralLanguageforSQL

PosgreSQL:PL/pgSQL Oracle:PL/SQL SQLServer:Transact-SQL DB2:SQLPL PL/*:LangagessyntaxiquementprochedePascaletAda

0/17

Structure de PL/SQL
l

PL/SQLeststructurenblocs:

[ DECLARE dclarations] BEGIN [label] instructions [ EXCEPTION traitement des erreurs ] END [label];
l

Chaquedclarationetchaqueinstructionseterminentparunpoint-virgule ;. Lescommentairessontinitispar-- oudlimitspar/* et */. Ilestpossibled'insrerdessous-blocs dans les sections BEGIN et EXCEPTION

1/17

Dclarations
Syntaxe:nom [CONSTANT] type [NOT NULL][ {DEFAULT | := } expression];
l l

Exemples:

quantite integer DEFAULT 42; url varchar := 'http://www.univ-lehavre.fr'; age_capitaine CONSTANT integer := 42; uneLigne nomTable%ROWTYPE; uneAutreLigne RECORD; unChamp nomTable.nomColonne%TYPE; SELECT col1, ... coln INTO var1, ... varn FROM ...; -- laclauseINTOestobligatoireetlarequteSELECTdoitreto
l

Tous les types SQL sont utilisables.

Les records sont des structures composites comme en Pascal similaires au struct du C.
l

2/17

Structuresdecontrlesimples
l

RETURN expression; IF expression THEN ... END IF; IF expression THEN ... ELSE ... END IF; IF expression THEN ... ELSIF ... END IF;

Lesoprateursutilissdanslesconditionssontlesmmesquepourlesrequtes SQL:=, <, >, <=, >=, !=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, NOT, ...
l

3/17

Les boucles
l

La boucle LOOP

LOOP [nom_boucle] instructions; EXIT [nom_boucle] [WHEN condition] END LOOP [nom_boucle]
l

La boucle FOR-LOOP

FOR var_indice IN val1 .. val2 LOOP instructions; END LOOP


l

La boucle WHILE-LOOP

WHILE condition LOOP instructions;

4/17

instructions; END LOOP

Les curseurs
Lescurseurssontdesstructuresparticuliresquipermettentdemanipulerlignepar lignelesdonnesretournes(result set)parunerequte.
l l

Cycledevied'uncurseur: 1.Dclarationducurseur

CURSOR cursLivre IS SELECT liv_num, liv_titre FROM livre;


2.Ouverture du curseur

OPEN cursLivre;
3.Traitement des lignes du curseur

FETCH cursLivre INTO v_liv_num, v_liv_titre;


4.Fermeture du curseur
5/17

CLOSE cursLivre;

CLOSE cursLivre;

Les attributs d'un curseur


l

Desattributspermettentdeconnatrel'tatdescurseurs:

%FOUND et %NOTFOUND %ISOPEN %ROWCOUNT

nomCurseur%FOUND=truesiledernierFETCHaretournuneligne nomCurseur%NOTFOUND=truesiledernierFETCHn'apasretourndeligne nomCurseur%ISOPENpermetdevrifiersilecurseuratouvert nomCurseur%ROWCOUNTrenvoielenombredelignetraiteparnomCurseur

6/17

Traitement complet d'un curseur explicite

DECLARE v_liv_num livre.liv_num%TYPE; v_liv_titre livre.liv_titre%TYPE; CURSOR cursLivre IS SELECT liv_num, liv_titre FROM livre ORDER B BEGIN OPEN cursLivre; LOOP FETCH cursLivre INTO v_liv_num, v_liv_titre; EXIT WHEN (cursLivre%NOTFOUND); ... END LOOP; CLOSE cursLivre; END;

7/17

Traitementsimplifi

DECLARE CURSOR cursLivre IS SELECT liv_num, liv_titre FROM livre ORDER B recordCursLivre cursLivre%ROWTYPE; BEGIN OPEN cursLivre; LOOP FETCH cursLivre INTO recordCursLivre; EXIT WHEN (cursLivre%NOTFOUND);

... -- avec les variables recordCursLivre.liv_num et recordCursLivre END LOOP; CLOSE cursLivre; END;

8/17

TraitementsimplifiavecFOR-LOOP

DECLARE CURSOR cursLivre IS SELECT liv_num, liv_titre FROM livre ORDER B -- plus de structure; BEGIN FOR recordCursLivre IN cursLivre LOOP -- ouverture automatique du curseur -- fetch automatique du curseur -- condition de sortie automatique du curseur ... END LOOP; END;

9/17

Curseur implicite

DECLARE -- plusdedclarationdecurseur BEGIN FOR recordCursLivre IN (SELECT liv_num, liv_titre FROM livre ORD -- ouverture automatique du curseur -- fetch automatique du curseur -- condition de sortie automatique du curseur ... END LOOP; END;

10/17

LesCurseursparamtrs
Ilestgalementpossibled'utiliserdescurseursrutilisablesavecdiffrentes valeurs:
l

DECLARE CURSOR cursLivre (num_min NUMBER, num_max NUMBER) IS SELECT liv_num, liv_titre FROM livre WHERE liv_num BETWEEN num_min AND num_max ORDER BY liv_num; recordCursLivre cursLivre%ROWTYPE; BEGIN OPEN cursLivre(1,10); LOOP FETCH cursLivre INTO recordCursLivre; EXIT WHEN (cursLivre%NOTFOUND); ... -- leslivres110sonttraits END LOOP; CLOSE cursLivre; END;
11/17

END;

Misejourdesdonnesavecuncurseur
La clause CURRENT-OFpermetd'accderdirectementencriturelaligneen cours de lecture
l

Ladclarationducurseurdoittreassocilaposed'unverroud'intention(FOR UPDATE OF)


l l

Exemple:

DECLARE CURSOR cursLivre IS SELECT liv_num, liv_titre FROM livre ORDER BY liv_num FOR UPDATE OF liv_num; BEGIN FOR monLivre IN cursLivre LOOP UPDATE livre SET liv_num = liv_num+200 WHERE CURRENT OF cursLivre; END LOOP; COMMIT; -- validelesmodificationsetlveleverrou END;
12/17

Gestion des erreurs


LasectionEXCEPTIONpermetdetraiterleserreurssurvenueslorddel'excution du bloc PL/SQL
l

Ilexistedeuxtypesd'erreurs:leserreursretournesparOracleetleserreursdues au programme.
l l

Syntaxe:

DECLARE nom_erreur EXCEPTION; BEGIN ... IF(problme)THENRAISEnom_erreur ... EXCEPTION WHEN nom_erreur THEN (traitement de l'erreur); END;
l

ErreursprdfiniesZERO_DIVIDE,NO_DATA_FOUND,...
13/17

La clause WHEN OTHERSpermetdetraceruneerreurrencontreavecles variables SQLCODE et SQLERRM


l

variables SQLCODE et SQLERRM

Lesprocdures
l

Uneprocdureestunsous-programmerespectantlasyntaxesuivante:

CREATE [OR REPLACE] PROCEDURE nomProc (param1, paramn) IS -- zonededclarationdesvariableslocales BEGIN ... EXCEPTION ... END;
l

Unevariableparamtresuitlasyntaxesuivante:

nom_param [IN|OUT|IN OUT] type_param

14/17

Les fonctions
Une fonction est un sous-programme retournant une valeur et respectant la syntaxe suivante:
l

CREATE [OR REPLACE] FUNCTION nomProc (param1, paramn)RETURNtype_ -- zonededclarationdesvariableslocales BEGIN ... -- clause RETURN EXCEPTION ... -- clause RETURN END;
l

Unevariableparamtresuitlasyntaxesuivante:

nom_param [IN|OUT|IN OUT] type_param

15/17

Procduresdclenches(Triggers)
Untriggerestunefonctionquidoittrexcutelorsquecertainesoprationssont ralises.
l

CesdclenchementspeuventavoirlieuavantouaprsunINSERT,unUPDATEou un DELETE.
l

PourunerequteSQLmodifiantplusieursenregistrementssimultanment,laclause FOREACHROWdtermineledclenchementdutriggerpourchaqueenregistrement oupourl'ensembledeslignesmodifies.


l

:oldet:newsontdesvariablesquidonnentaccsauxdeuxtatsdesdonnesen cours de modification.


l

Ilestpossibledecontrlerlesconditionsd'executionavecdesclausestellesque IF INSERTING THEN ... ELSIF UPDATING THEN ... ELSIF DELETING THEN ...
l

16/17

Exemple de trigger
CREATE OR REPLACE TRIGGER trig_trace_salaire AFTER INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW DECLARE quand DATE := SYSDATE; BEGIN IF INSERTING THEN INSERT INTO trace_salaire VALUES (:new.empno,null,:new.sal,quand,user,'NOUVEAU'); ELSIF UPDATING('SAL') THEN INSERT INTO trace_salaire VALUES (:old.empno,:old.sal,:new.sal,quand,user,'MODIFIE'); ELSIF DELETING THEN INSERT INTO trace_salaire VALUES (:old.empno,:old.sal,null,quand,user,'SUPPRIME'); END IF; END;
17/17

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