La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Le Langage PL/SQL IUPm3- Université de Nantes. Plan du Cours Introduction au langage PL/SQL Les variables Traitements Conditionnels Traitements répétitifs.

Présentations similaires


Présentation au sujet: "Le Langage PL/SQL IUPm3- Université de Nantes. Plan du Cours Introduction au langage PL/SQL Les variables Traitements Conditionnels Traitements répétitifs."— Transcription de la présentation:

1 Le Langage PL/SQL IUPm3- Université de Nantes

2 Plan du Cours Introduction au langage PL/SQL Les variables Traitements Conditionnels Traitements répétitifs Les curseurs Gestion d’exceptions

3 Comparaison avec SQL SQL –Langage assertionnel et non procédural PL/SQL –Langage procédural, qui intègre des ordres SQL SELECT, INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE Gestion de transactions: COMMIT, ROLLBACK, SAVEPOINT Langage à part entière comprenant –Définition de variables, constantes, expressions, affectations –Traitements conditionnels, répétitifs –Traitement de Curseurs –Traitement des erreurs et d’exceptions –Etc…

4 Exemple DECARE qty_on_hand NUMBER(5); BEGIN SELECT quantity INTO qty_on_hand FROM inventory WHERE product = ‘TENNIS RACKET’ FOR UPDATE of quantity; IF qty_on_hand > 0 THEN UPDATE inventory SET quantity quantity – 1 WHERE product = ‘TENNIS RACKET’; INSERT INTO purchase_record VALUES(‘Tennis racket puchased’,SYSDATE); ENF IF; COMMIT; END;

5 Structure [DECLARE --declarations de variables contantes -- exceptions et curseurs] BEGIN [nom-bloc] --instructions SQL et extentions [EXCEPTIONS -- Traitement des exceptions] END; ou END nombloc

6 Architecture PL/SQL Engine PL/SQL Block PL/SQL Block Procedural Statement Executor Procedural SQL SQL Statement Executor

7 Types de Variables Variables locales: –De type simple: type de base ou booléen –Faisant référence à la métabase –De type composé: Tableau, Record Variables Extérieures: –Variables d’un langage hote (ex: C) (préfixés par :) –Paramètres (ex: SQL interactif par &) –Champs d’écrans (Forms)

8 Variables de type Simple Declare nomchar(15); salairenumber(7,2); embauche DATE ; réponseboolean;

9 Variables sur la métabase Reprend –Soit le même type qu’une colonne dans une table –Soit la même structure qu’une ligne dans une table –Soit le même type qu’une variable précédemment définie Syntaxe nom_var1 table.colonne%TYPE nom_var2 table%ROWTYPE nom_vars3 nom_var1%TYPE Exemples: nom emp.ename%TYPE; enreg emp%ROWTYPE; commi number(7,2); Salairecommi%TYPE;

10 Initialisation et visibilité Dans la déclaration Nom char(10) := ‘Miller’; Reponse boolean := TRUE; Constantes Pi CONSTANT number (7,2) := 3.14; Interdire les valeurs non renseignées: NOT NULL Debut number NOT NULL := 10; L’ordre SELECT Select col1, col2 Into var1, var2 From table [Where condition ]; Règle –La clause INTO est obligatoire –Le select ne doit ramener qu’une ligne Visibilité: bloc de déclaration + blocs imbriqués

11 Exemple Declare nom_empchar(15); salaireemp.sal%TYPE commissionemp.comm%TYPE; nom_départchar(15); Begin Select ename, sal, comm, dname Intonom_emp, salaire, commission, nom_départ From emp, dept Whereename = ‘MILLER’ and emp.deptno = dept.deptno … End;

12 Traitements Conditionnels IF condition THEN instruction; … instruction; [ELSEIF condition THEN instruction; … instruction; ] … [ELSEIF condition THEN instruction; … instruction;] [ELSE instruction; … instruction;] END-IF; Une instruction IF peut contenir plusieurs clauses ELSEIF, mais une seule clause ELSE.

13 IF THEN ELSE IF THEN IF condition Then traitement ENDIF; Exemple: IF sales > quota THEN compute_bonnus(emp_id); UPDATE payroll SET pay = pay + bonus where empno = emp_id; END IF;

14 IF THEN ELSE IF condition THEN traitement1 ELSE traitement2; END IF; Exemple: IF trans_type = ‘CR’ THEN UPDATE accounts SET balance = balance + credit WHERE … ELSE UPDATE accounts SET balance = balance – debit WHERE … END IF;

15 IF condition1THEN Traitement 1; ELSEIF condition2 THEN Traitement2; ELSE traitement3; END IF; Exemple: IF sales > THEN bonus := 1500; ELSEIF sales > THEN bonus := 500; ELSE bonus := 100; IF THEN ELSEIF

16 IF condition1 THEN traitement1; ELSE IF condition2 THEN traitement2; ELSE IF condition3 THEN traitement3; END IF; IF condition1 THEN traitement1; ELSEIF condition2 THEN traitement2; ELSEIF condition3 THEN END IF; Sont équivalents

17 Exemple DECLARE emploi char (10); nom char(15) := ‘MILLER’; ctlchar(30); BEGIN Select job INTO emploi FROM emp WHERE ename = nom; IF emploi is null THEN ctl := nom || ‘n’apas d’emploi ’; ELSEIF emploi = ‘SALESMAN’ THEN update emp set comm = 1000 where ename = nom; ctl := nom || ‘commission modifiee’; ELSE update emp set comm = 0 where ename = nom; ctl := nom || ‘pas de commission’; END IF; insert into resultat values(ctl); commit; END; / OBS: || fait la concaténation et / provoque la soumission du bloc au moteur PL/SQL

18 Répétition Instruction LOOP simple LOOP instruction; … instruction; END LOOP; Instruction While … LOOP WHILE condition LOOP instruction; … instruction; END LOOP ; Instruction FOR.. LOOP FOR variable_boucle IN [REVERSE] borne_inférieure … borne_supérieure LOOP instruction; … instruction; END LOOP; FOR i in 1.. Max_loop LOOP dbms_output.put_line(‘i: ‘|| to_char(i)); END LOOP;

19 EXIT, GOTO, NULL, Commentaires Instruction GOTO GOTO nom_étiquette; Instruction NULL IF (mod(i,10) = 0) THEN i := i + 1; else NULL; END IF; Commentaires instruction; -- Bla bla bla instruction Ou avec /* Bla bla bla */

20 EXAMPLE 1 DECLARE max_records CONSTANT int := 100; iint := 1; BEGIN FOR i in 1.. Max_records LOOP if (mod(i,10) = 0) then INSERT INTO teste_table (val, current_date) values (i, SYSDATE); else NULL; END IF; END LOOP; COMMIT; END; /

21 Exemple 2 SQL> set serveroutput on SQL > SQL> declare 2 2 Average_Body_TempPatient.Body_Temp_Deg_F%type; 3 3 begin 4 4 dbms_output.enable; 5 5 select avg(Body_Temp_Deg_F) into Average_Body_Temp from Patient; 6 6 dbms_output.put_line(‘Température moyenne du corps en degrés F: ‘ || to_char(Average_Body_Temp,’999.99’)); 7 7 end; 8 / Temperature moyenne du corps en degrés F: 99,80 Procedure PL/SQL terminée avec succès.

22 Imbrication de blocs PL/SQL permet d’inclure des sous-blocs dans un bloc (pratique n’est pas recommandé). Declare x real; Begin … declare x real; begin … end; … End; x extérieur x intérieur Visibilité

23 Procédures PROCEDURE nom_procédure [(argument1 … [, argumentN) ] IS [déclarations_de_variables_locales ] BEGIN section_exécutable [section_exception] END [nom_procedure] Si on fait: CREATE PROCEDURE ou FUNCTION…, la procédure ou fonction qui est crée est permanente. Elle peut être appelée par un script SQL*Plus, un sous-programme PL/SQL etc. Les variables déclarées dans une procédure ne sont pas accessibles en dehors d’elle-même.

24 Exemple Declare New_patient_IDPatient.Patient_ID %type; High_Feverconstant real := 42.0; Procedure Record _Patient_Temp_Deg_C(Patient_ID varchar2, Body_Temp_Deg_C real) is Temp_Deg_Freal; Begin Temp_Deg_F := (9.0/5.0)*Body_Temp_Deg_C ; insert into Patient (Patient_ID, Body_Temp_Deg_F) values (Patient_ID, Temp_Deg_F); Temp_Deg_F) commit; end; Begin New_Patient_ID := ‘GG9999’; Record_Patient_Temp_Deg_C (Nex_Patient_ID, High_Fever); End; /

25 Fonctions FUNCTION nom_fonction [argument1… [, argumentN) ] RETURN type_données-fonction IS [déclaration-variabels_locales] BEGIN Section_exécutable [section_exeption] END [nom_fonction];

26 Exemple Declare Course_IDCourse.Course_ID%type; Function Max_Additional_Fees (Dept_ID IN varchar2) return varchar2 is Additional_FeesCourse.Additional_Fees%type; UnitsCours.Units%type; Cours_IDCourse.Course_ID%type; Begin select Course_ID into Cours-ID from Course where Departement_ID = Dept_ID and additional_Fees in (select max(Additional_Fees) from Course where Departement_ID = Dept_ID); return Course_ID; End; Begin dbms_output.enable; Course_ID := Max_Additional_Fees(‘ECON’); dbms_output.put_line(‘Course_ID: ‘|| Course_ID); End; /

27 Recherche de données avec un curseur Definition –Un curseur est un mécanisme permettant de rechercher un nombre arbitraire de lignes avec une instruction SELECT. Deux types de curseurs: –Le curseurs implicite: généré et géré par le noyau pour chaque ordre SQL d’un bloc –Le curseur explicite: généré para l’utilisateur pour traiter un ordre SELECT qui ramène plusieurs lignes. Utilisation: –Déclaration –Ouverture du curseur –Traitement des lignes –Fermeture du curseur

28 Déclaration d’un curseur explicite Se fait dans la section Declare Syntaxe cursornom_curseur is ordre_select Exemple Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; Begin … End;

29 Ouverture L’ouverture déclanche: –Allocation de mémoire pour le lignes du curseur –L’analyse syntaxique et sémantique du select –Le positionnement de verrous éventuels L’ouverture se fait dans la section Begin Syntaxe: OPEN nom_curseur; Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; Begin …; open dept_10; …; End;

30 Traitement de Lignes Les lignes ramenées sont traitées une par une, la valeur de chaque colonne doit être stockée dans une variable réceptrice Syntaxe: Fetch nom_curseur into liste_variables; Le Fetch ramène une ligne à la fois.

31 Exemple Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; nom emp.ename%TYPE; salaire emp.sal%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; If salaire > 2500 then insert into résultat values (nom,salaire); end if; exit when salaire = 5000; end loop; … End;

32 Fermeture Syntaxe: Close nom_curseur; Action: libère la place de mémoire Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; nom emp.ename%TYPE; salaire emp.sal%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; If salaire > 2500 then insert into résultat values (nom,salaire); end if; exit when salaire = 5000; end loop; close dept_10; End;

33 Exemple Prompt Nombre de salaires ? Accept nombre; Declare Cursor c1 is select ename, sal from emp order bay sal desc; venameemp.ename%TYPE; vsalemp.sal%TYPE; Begin open c1; for i in 1..&nombre loop fetch c1 into vename, vsal; insert into résultat values (vsal, vename); end loop; close c1 End;

34 Les attributs d’un curseur Définition indicateurs sur l’état d’un curseur. –%FOUND : nom_curseur%FOUND TRUE: le dernier FETCH a ramené une ligne FALSE: plus de ligne –%NOTFOUND: nom_curseur%NOTFOUND TRUE: le dénier FETCH n’a pas ramené de ligne –%ISOPEN: nom_curseur%ISOPEN TRUE: le curseur est ouvert –%ROWCOUNT: nom_curseur%rowcount Nbre de lignes ramenées par le FetCH

35 Exemple - %FOUND Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; nom emp.ename%TYPE; salaire emp.sal%TYPE; Begin Open dept_10; Fetch dept_10 into nom, salaire; While dept_10%FOUND Loop If salaire > 2500 then insert into résultat values (nom,salaire); end if; Fetch dept_10 into nom, salaire; end loop; close dept_10; End;

36 Exemple - %NOTFOUND Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; nom emp.ename%TYPE; salaire emp.sal%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; Exit when dept_10%NOTFOUND; If salaire > 2500 then insert into résultat values (nom,salaire); end if; end loop; close dept_10; End;

37 Exemple - %ISOPEN Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; nom emp.ename%TYPE; salaire emp.sal%TYPE; Begin If not(dept_10%ISOPEN) the Open dept_10; end if; Loop Fetch dept_10 into nom, salaire; Exit when dept_10%NOTFOUND; If salaire > 2500 then insert into résultat values (nom,salaire); end if; end loop; close dept_10; End;

38 Exemple - %ROWCOUNT Declare cursor dept_10 is select ename, sal From emp where deptno = 10 order by sal; nom emp.ename%TYPE; salaire emp.sal%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; Exit when dept_10%NOTFOUND or dept_10%ROWCOUNT > 15; If salaire > 2500 then insert into résultat values (nom,salaire); end if; end loop; close dept_10; End;

39 Gestion des Erreurs Section Exception Anomalie programmeur Erreur Oracle

40 Section Exception Notion d’exception: traitements d’erreurs Types d’erreurs: –Erreurs internes Oracle (Sqlcode <> 0) –Erreurs programme utilisateur Règles à respecter –Définir et donner un nom à chaque erreur –Associer ce nom à la section Exception (partie declare) –Définir la traitement dans la partie Exception

41 Gestion des Exceptions Syntaxe EXCEPTION WHEN nom_exception1 THEN instructions_PL_SQL; … WHEN nom_exceptionN Then instructions PL/SQL; … [WHEN OTHERS THEN instrctions_PL/SQL;] END; Sortie du bloc après exécution du traitement

42 Exceptions Prédéfinies DUP_VAL_ON_INDEX –Lorsqu’une instruction SQL tente de créer une valeur dupliquée dans une colonne sur laquelle un index unique a été défini INVALID_NUMBER –Lorsqu’une instruction SQL spécifie un nombre invalide NO_DATA_FOUND –Lorsqu’une instruction Select ne retourne aucune ligne TOO_MANY_ROWS –Une instruction Select ne peut pas renvoyer plus d’une ligne sans provoquer l’exception TOO_MANY_ROWS VALUE_ERROR –Provoquée dans des situations d’erreur résultant de valeurs tronquées ou converties

43 Exemple Declare Course_RecCours%ROWTYPE; Begin dbms_output.enable; select * into Course_Rec from Course where Course_ID = ‘777’; Exception when No_Data_Found then dbms_output.put_line(‘Aucune donnée retournée’); when other then null; End; / Aucune donnée retournée Procedure PL/SQL terminé avec succès.

44 Déclaration d’une Exception Declare pas_commEXCEPTION; salaireemp.sal%TYPE; commiemp.comm%TYPE; numeroemp.empno%TYPE; Begin Select sal, comm, empno into salaire, commi, numero from emp where empno := :num_emp; If commi = 0 or commi is null then raise pas_comm else traitement … end if; ExceptionWhen pas_comm then insert into resultat values (numéro, salaire, ‘pas de comm’); End; Obs: num_emp fait référence à une variable extérieure au bloc PL/SQL)

45 Test d’exécution avec SQLCODE et SQLERRM SQLCODE –Fonction prédéfinie qui renvoie le statut d’erreur système de l’instruction qui vient d’être exécutée (si sans erreur, SQLCODE = 0). SQLERRM –Fonction prédéfinie qui renvoie le message d’erreur associé à la valeur retournée par SQLCODE (si sans erreur, SQLERRM = ‘ORA-0000’). Declare Begin dbms_output.enable; dbms_output.put_line(‘SQLCODE: ‘ || to_char(SQLCODE)); dbms_output.put_line(‘SQLERRM: ‘ || SQLERRM); End; / SQLCODE: 0 SQLERRM: ORA-0000: exécution normale, terminé avec succès

46 Exemple Declare Class_RecClass%ROWTYPE; Begin dbms_output.enable; select * into Class_Rec from class Exception when OTHERS then dbms_output.put_line(‘SQLCODE: ‘ || to_char(SQLCODE)); dbms_output.put_line(SQLERRM); End; / SQLCODE: ORA-01422: l’extraction exacte ramène plus que le nombre de lignes demandé Procédure PL/SQL terminée avec succès.


Télécharger ppt "Le Langage PL/SQL IUPm3- Université de Nantes. Plan du Cours Introduction au langage PL/SQL Les variables Traitements Conditionnels Traitements répétitifs."

Présentations similaires


Annonces Google