Академический Документы
Профессиональный Документы
Культура Документы
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
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
La boucle WHILE-LOOP
4/17
Les curseurs
Lescurseurssontdesstructuresparticuliresquipermettentdemanipulerlignepar lignelesdonnesretournes(result set)parunerequte.
l l
Cycledevied'uncurseur: 1.Dclarationducurseur
OPEN cursLivre;
3.Traitement des lignes du curseur
CLOSE cursLivre;
CLOSE cursLivre;
Desattributspermettentdeconnatrel'tatdescurseurs:
6/17
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
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
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
Lesprocdures
l
Uneprocdureestunsous-programmerespectantlasyntaxesuivante:
CREATE [OR REPLACE] PROCEDURE nomProc (param1, paramn) IS -- zonededclarationdesvariableslocales BEGIN ... EXCEPTION ... END;
l
Unevariableparamtresuitlasyntaxesuivante:
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:
15/17
Procduresdclenches(Triggers)
Untriggerestunefonctionquidoittrexcutelorsquecertainesoprationssont ralises.
l
CesdclenchementspeuventavoirlieuavantouaprsunINSERT,unUPDATEou un DELETE.
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