Overblog Suivre ce blog
Administration Créer mon blog
6 août 2011 6 06 /08 /août /2011 02:35

 

PLSQL Variable de Substitution.

Comment utiliser des Variables de Substitution en PLSQL. ?

 

Utilisation de Variable de Substitution dans SQLPLUS.

Les variables de substitution sont généralement précédées par l'esperluette (&) ou double esperluette (& &).

 

Exemple Variable de Substitution simple esperluette ( & ).

 
 SQL> SET VERIFY OFF; SQL> SET SERVEROUTPUT ON SQL> DECLARE x pls_integer := &sv_var; y pls_integer := &sv_var; BEGIN DBMS_OUTPUT.PUT_LINE (x || ' X ' ||y || ' = ' || x*y ); END; / Entrez une valeur pour sv_var : 2 Entrez une valeur pour sv_var : 3 2 X 3 = 6 Procédure PL/SQL terminée avec succès. SQL> 

Si vous voulez activer la sortie old : et new : faites un SET VERIFY ON.
Avec une simple esperluette, vous devez renseigner une valeur autant de fois qu'il y a de variables de substitution portant le même nom.

 

Exemple Variable de Substitution double esperluette ( && ).

 
 SQL> SET VERIFY OFF; SQL> SET SERVEROUTPUT ON SQL> DECLARE x pls_integer := &&sv_var; y pls_integer := &sv_var; BEGIN DBMS_OUTPUT.PUT_LINE (x || ' X ' ||y || ' = ' || x*y ); END; / Entrez une valeur pour sv_var : 2 2 X 2 = 4 Procédure PL/SQL terminée avec succès. SQL> 

Si vous voulez activer la sortie old : et new : faites un SET VERIFY ON.
Avec une double esperluette, vous renseignez une fois une valeur pour toutes les variables de substitution portant le même nom.

 

Exemple Variable de Substitution String.

 
 SQL> SET VERIFY OFF; SQL> SET SERVEROUTPUT ON SQL> DECLARE x varchar(20) := '&sv_var'; BEGIN DBMS_OUTPUT.PUT_LINE ('Nbr caracteres =' || length(x)); END; / Entrez une valeur pour sv_var : test longueur chaine Nbr caracteres =20 Procédure PL/SQL terminée avec succès. SQL> 

Si vous voulez activer la sortie old : et new : faites un SET VERIFY ON.
N'oubliez pas les cotes '&.....' pour la variable de substitution lorsque l'on attends une chaîne de caractères.

Haut de Page www.dba-ora.fr

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• PL-SQL IF
• PL-SQL CASE
• PL-SQL FOR
• PL-SQL LOOP
• PL-SQL WHILE
• Oracle PL-SQL Variable %TYPE %ROWTYPE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
24 juillet 2011 7 24 /07 /juillet /2011 03:42

 

PLSQL WHILE - LOOP - END LOOP.

Comment utiliser la boucle WHILE en PLSQL. ?

 

Structures répétitives PLSQL.

Dans un traitement itératif la structure boucle WHILE permet la répétition d'une séquence d'instructions, celle ci dépendant directement de la condition de la boucle WHILE.
Les instructions de la boucle sont exécutées tant que la condition est vraie. Avant chaque itération, la condition est évaluée.
C'est l'une des boucles avancée parmit les traitements itératifs.

Voici la principale forme itérative de l'instruction WHILE.

  • Traitement Itératif "tant que" WHILE - LOOP - END LOOP.

Traitement Itératif WHILE.

 

Syntaxe Boucle WHILE - LOOP - END LOOP.

 
 WHILE conditions LOOP instruction1; instruction2; END LOOP; 

 

Exemple PLSQL Boucle WHILE - LOOP - END LOOP.

 
 Boucle WHILE tant que FLAG=FALSE. SQL> SET SERVEROUTPUT ON; SQL> DECLARE var_txt VARCHAR2(40) :='La boucle WHILE s''arretera ICI je pense'; flag BOOLEAN := FALSE; var_cpt PLS_INTEGER := 0; BEGIN WHILE NOT flag LOOP IF SUBSTR(var_txt,var_cpt,3) = 'ICI' THEN flag := TRUE; DBMS_OUTPUT.PUT_LINE ('Exit Boucle sur -> ' || SUBSTR(var_txt,var_cpt,3)); ELSE var_cpt := var_cpt + 1; END IF; END LOOP; END; / Exit Boucle sur -> ICI Procédure PL/SQL terminée avec succès. SQL> 

 

Haut de Page www.dba-ora.fr

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• PL-SQL IF
• PL-SQL CASE
• PL-SQL FOR
• PL-SQL LOOP
• PL-SQL WHILE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
23 juillet 2011 6 23 /07 /juillet /2011 01:13

 

PLSQL FOR - IN - LOOP.

Comment utiliser FOR IN en PLSQL. ?

 

Structures répétitives PLSQL.

Dans un traitement itératif la structure FOR IN permet de boucler grâce à un nombre d'itérations connu à l'avance.
Le corps de la boucle est exécuté une fois pour chaque entier dans la plage définie par LOWER BOUND .. UPPER BOUND.
Par défaut, après chaque itération, l'indice de la boucle LOWER BOUND est incrémenté à la hausse sauf si vous utilisez le mot-clé REVERSE, alors l'indice de la boucle UPPER BOUND est décrémenté.

Voici la principale forme itérative avec l'instruction FOR.

  • Traitement Itératif FOR - IN - LOOP - END LOOP.

Traitement Itératif FOR IN.

 

Syntaxe FOR - IN - LOOP - END LOOP.

 
 FOR compteur IN [REVERSE] lower_bound..upper_bound LOOP instruction1; instruction2; instruction3; [EXIT WHEN condition]; END LOOP; 
 
 SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 FOR i IN 1..5 LOOP 3 CASE i 4 WHEN 1 THEN DBMS_OUTPUT.PUT_LINE ('-- '); 5 WHEN 2 THEN DBMS_OUTPUT.PUT_LINE ('----- '); 6 WHEN 3 THEN DBMS_OUTPUT.PUT_LINE ('--------- '); 7 WHEN 4 THEN DBMS_OUTPUT.PUT_LINE ('-------------- '); 8 WHEN 5 THEN DBMS_OUTPUT.PUT_LINE ('-----------------'); 9 END CASE; 10 END LOOP; 11 END; 12 / -- ----- --------- -------------- ----------------- Procédure PL/SQL terminée avec succès. SQL> 
 
 SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 FOR i IN REVERSE 1..5 LOOP 3 CASE i 4 WHEN 1 THEN DBMS_OUTPUT.PUT_LINE ('-- '); 5 WHEN 2 THEN DBMS_OUTPUT.PUT_LINE ('----- '); 6 WHEN 3 THEN DBMS_OUTPUT.PUT_LINE ('--------- '); 7 WHEN 4 THEN DBMS_OUTPUT.PUT_LINE ('-------------- '); 8 WHEN 5 THEN DBMS_OUTPUT.PUT_LINE ('-----------------'); 9 END CASE; 10 END LOOP; 11 END; 12 / ----------------- -------------- --------- ----- -- Procédure PL/SQL terminée avec succès. SQL> 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 employe scott.emp%rowtype; 3 CURSOR Mon_Curseur IS 4 SELECT ename, deptno 5 FROM emp 6 WHERE deptno = 10; 7 BEGIN 8 FOR employe IN Mon_Curseur LOOP 9 dbms_output.put_line(' Nom : '||employe.ename); 10 END LOOP; 11 END; 12 / Nom : CLARK Nom : KING Nom : MILLER Procédure PL/SQL terminée avec succès. SQL> 

 

Haut de Page www.dba-ora.fr

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• PL-SQL IF
• PL-SQL CASE
• PL-SQL FOR
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
23 juillet 2011 6 23 /07 /juillet /2011 01:05

 

PLSQL LOOP - END LOOP.

Comment utiliser LOOP en PLSQL. ?

 

Structures répétitives PLSQL.

Dans un traitement itératif la structure LOOP permet la répétition d'une séquence d'instructions.
C'est la boucle de base parmit les traitements itératifs.

Voici la principale forme itérative de l'instruction LOOP.

  • Traitement Itératif LOOP - EXIT WHEN - END LOOP.

Traitement Itératif LOOP.

  • EXIT force la sortie de la boucle sans conditions.
  • EXIT WHEN permet une sortie de boucle si la condition est vraie.
  • EXIT <<label>> WHEN permet une sortie d'une boucle nommée label si la condition est vraie.
  • EXIT <<label>> force une sortie de boucle nommée label.

Syntaxe LOOP - END LOOP.

 
 <<label>> LOOP instruction1; instruction2; EXIT [label][WHEN condition1] END LOOP label; 

Exemple PLSQL LOOP - END LOOP.

 
 Table de 1 et de 2 (multiplication). SQL> SET SERVEROUTPUT ON; SQL> DECLARE x pls_integer := 0; y pls_integer := 0; BEGIN LOOP x := x + 1; y := 0; <<label1>> LOOP y := y + 1; EXIT label1 WHEN y > 10; DBMS_OUTPUT.PUT_LINE (x || ' X ' ||y || ' = ' || x*y ); END LOOP label1; EXIT WHEN x = 2; END LOOP; END; / 1 X 1 = 1 1 X 2 = 2 1 X 3 = 3 1 X 4 = 4 1 X 5 = 5 1 X 6 = 6 1 X 7 = 7 1 X 8 = 8 1 X 9 = 9 1 X 10 = 10 2 X 1 = 2 2 X 2 = 4 2 X 3 = 6 2 X 4 = 8 2 X 5 = 10 2 X 6 = 12 2 X 7 = 14 2 X 8 = 16 2 X 9 = 18 2 X 10 = 20 Procédure PL/SQL terminée avec succès. SQL> 
 
 Table de 1 et de 2 (multiplication). 
 SQL> SET SERVEROUTPUT ON; SQL> DECLARE x pls_integer := 0; y pls_integer := 0; BEGIN <<label>> LOOP x := x + 1; y := 0; <<label1>> LOOP y := y + 1; EXIT label1 WHEN y > 10; EXIT label WHEN x > 2; DBMS_OUTPUT.PUT_LINE (x || ' X ' ||y || ' = ' || x*y ); END LOOP label1; END LOOP label; END; / 1 X 1 = 1 1 X 2 = 2 1 X 3 = 3 1 X 4 = 4 1 X 5 = 5 1 X 6 = 6 1 X 7 = 7 1 X 8 = 8 1 X 9 = 9 1 X 10 = 10 2 X 1 = 2 2 X 2 = 4 2 X 3 = 6 2 X 4 = 8 2 X 5 = 10 2 X 6 = 12 2 X 7 = 14 2 X 8 = 16 2 X 9 = 18 2 X 10 = 20 Procédure PL/SQL terminée avec succès. SQL> 

 

Haut de Page www.dba-ora.fr

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• PL-SQL IF
• PL-SQL CASE
• PL-SQL FOR
• PL-SQL LOOP
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
23 juillet 2011 6 23 /07 /juillet /2011 00:55

 

PLSQL CASE - WHEN - THEN - END CASE.

Comment utiliser CASE en PLSQL. ?

 

Structures de contrôle PLSQL.

Dans un traitement conditionnel la structure CASE permet de contrôler l’exécution d'instructions en fonction de différentes conditions.
La structure PLSQL CASE et IF sont équivalentes dans le traitement conditionnel mais l'instruction CASE est plus lisible et plus efficace que l'instruction IF-THEN-ELSIF.

Les opérateurs dans les conditions sont du type = , <, <=, !=, LIKE, BETWEEN, AND, OR,...

Voici les 2 principales formes conditionnelles avec l'instruction CASE.

  • Traitement Conditionnel CASE - WHEN - THEN - ELSE - END CASE.
  • Traitement Conditionnel searched CASE - WHEN - THEN - ELSE - END CASE.

La clause ELSE est facultative, si vous l'omettez, PLSQL place implicitement ELSE RAISE CASE_NOT_FOUND;

Traitement Conditionnel CASE simple.

 

Syntaxe CASE - WHEN - THEN - ELSE - END CASE.

 
 CASE selecteur WHEN expression1 THEN instruction1; WHEN expression2 THEN instruction2; … WHEN expression3 THEN instruction3; ELSE instruction4; END CASE; 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE var_cp VARCHAR2(5) := '83000'; BEGIN var_cp := SUBSTR(var_cp,1,2); CASE var_cp WHEN '78' THEN DBMS_OUTPUT.PUT_LINE ('Département Yvelines'); WHEN '94' THEN DBMS_OUTPUT.PUT_LINE ('Département Val de Marne'); WHEN '83' THEN DBMS_OUTPUT.PUT_LINE ('Département Var'); ELSE DBMS_OUTPUT.PUT_LINE ('Département Autre'); END CASE; END; / Département Var Procédure PL/SQL terminée avec succès. SQL> 

 

Traitement Conditionnel searched CASE - WHEN - THEN - END CASE.

 

Syntaxe searched CASE - WHEN - THEN - END CASE.

 
 CASE WHEN condition1 THEN instruction1; WHEN condition2 THEN instruction2; … WHEN condition3 THEN instruction3; ELSE instruction4; END CASE; 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE var_cp VARCHAR2(5) := '75000'; BEGIN CASE WHEN SUBSTR(var_cp,1,2) = '78' THEN DBMS_OUTPUT.PUT_LINE ('Département Yvelines'); WHEN SUBSTR(var_cp,1,2) = '94' THEN DBMS_OUTPUT.PUT_LINE ('Département Val de Marne'); WHEN SUBSTR(var_cp,1,2) = '83' THEN DBMS_OUTPUT.PUT_LINE ('Département Var'); ELSE DBMS_OUTPUT.PUT_LINE ('Département Autre'); END CASE; END; / Département Autre Procédure PL/SQL terminée avec succès. SQL> 

 

Haut de Page www.dba-ora.fr

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• PL-SQL IF
• PL-SQL CASE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
23 juillet 2011 6 23 /07 /juillet /2011 00:46

 

PLSQL IF - THEN - ELSE - END IF.

Comment utiliser IF en PLSQL. ?

 

Structures de contrôle PLSQL.

Dans un traitement conditionnel la structure IF permet de contrôler l’exécution d'instructions en fonction de différentes conditions.
Les opérateurs dans les conditions sont du type = , <, <=, !=, LIKE, BETWEEN, AND, OR,...

Voici les 3 principales formes conditionnelles avec IF.

  • Traitement Conditionnel IF - THEN - END IF.
  • Traitement Conditionnel IF - THEN - ELSE - END IF.
  • Traitement Conditionnel IF - THEN - ELSIF - END IF.

 

Traitement Conditionnel IF - THEN - END IF.

 

Syntaxe IF - THEN - END IF.

 
 IF condition1 THEN instruction1; instruction1.1; END IF; 
 
 SQL> SET SERVEROUTPUT ON SIZE 10000; SQL> DECLARE var_cp VARCHAR2(5) := '78000'; BEGIN IF SUBSTR(var_cp,1,2)='78' THEN DBMS_OUTPUT.PUT_LINE ('Département Yvelines'); END IF; END; / Département Yvelines Procédure PL/SQL terminée avec succès. 

 

Traitement Conditionnel IF - THEN - ELSE - END IF.

 

Syntaxe IF - THEN - ELSE - END IF.

 
 IF condition1 THEN instruction1; instruction1.1; ELSE instruction2; END IF; 
 
 SQL> SET SERVEROUTPUT ON SIZE 10000; SQL> DECLARE var_cp VARCHAR2(5) := '78000'; BEGIN IF SUBSTR(var_cp,1,2)='78' THEN DBMS_OUTPUT.PUT_LINE ('Département Yvelines'); ELSE DBMS_OUTPUT.PUT_LINE ('Département Autre'); END IF; END; / Département Yvelines Procédure PL/SQL terminée avec succès. 

 

Traitement Conditionnel IF - THEN - ELSIF - END IF.

 

Syntaxe IF - THEN - ELSIF - END IF.

 
 IF condition1 THEN instruction1; instruction1.1; ELSIF condition2 THEN instruction2; instruction2.1; ELSIF condition3 THEN instruction3; instruction3.1; ELSE instruction4; END IF; 
 
 SQL> SET SERVEROUTPUT ON SIZE 10000; SQL> DECLARE var_cp VARCHAR2(5) := '83000'; BEGIN IF SUBSTR(var_cp,1,2)='78' THEN DBMS_OUTPUT.PUT_LINE ('Département Yvelines'); ELSIF SUBSTR(var_cp,1,2)='94' THEN DBMS_OUTPUT.PUT_LINE ('Département Val de Marne'); ELSIF SUBSTR(var_cp,1,2)='83' THEN DBMS_OUTPUT.PUT_LINE ('Département Var'); ELSE DBMS_OUTPUT.PUT_LINE ('Département Autre'); END IF; END; / Département Var Procédure PL/SQL terminée avec succès. SQL> 

 

Haut de Page www.dba-ora.fr

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• PL-SQL IF
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
17 mai 2011 2 17 /05 /mai /2011 17:10

 

Oracle PL/SQL Gestion EXCEPTION Utilisateur avec RAISE.

Comment définir une EXCEPTION non associée à une erreur Oracle ?

PL/SQL permet de definir ses propres EXCEPTIONS, avec la commande RAISE qui interrompt le programme et transfère au gestionnaire d'EXCEPTION.

La déclaration du nom de l'exception doit se trouver dans la partie déclarative.

Voici un exemple (avec et sans gestion des erreurs) ou PLSQL soulève :

EXCEPTION UTILISATEUR e_dept_innexistant car le département 45 n'existe pas dans la base.
On s’aperçoit que pour la même requête nous avons deux messages bien différent.

APPEL EXCEPTION UTILISATEUR avec RAISE.

 
 SQL> SET SERVEROUTPUT ON; SQL> BEGIN 2 DELETE FROM scott.emp WHERE deptno = 45; 3 COMMIT; 4 dbms_output.put_line('Lignes departement 45 supprimees'); 5  END; 6 / Lignes departement 45 supprimees PL/SQL procedure successfully completed. 
 
 SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 e_dept_innexistant EXCEPTION; 3 BEGIN 4 DELETE FROM scott.emp WHERE deptno = 45; 5 IF sql%NOTFOUND THEN 6 RAISE e_dept_innexistant; 7 END IF; 8 COMMIT; 9 dbms_output.put_line('Lignes departement 45 supprimees'); 10 11 EXCEPTION 12 WHEN e_dept_innexistant THEN 13 dbms_output.put_line('Departement 45 innexistant'); 14 WHEN OTHERS THEN 15 dbms_output.put_line('Autres Erreurs'); 16 END; 17 / Departement 45 innexistant PL/SQL procedure successfully completed. 

 

Lorsque le traitement a été transferé du bloc BEGIN dans le BLOC EXCEPTION, il n'est plus possible de revenir dans le corps du bloc BEGIN (sauf utilisation de blocs imbriquées).
Quand le programme prend en compte l’erreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.

 

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• Oracle PL-SQL ERROR ZERO_DIVIDE EXCEPTION
• Oracle PL-SQL NO_DATA_FOUND TOO_MANY_ROWS EXCEPTIONS
• Oracle PL-SQL Structure d'un BLOC
• Oracle PL-SQL SELECT INTO
• Oracle PL-SQL Variables %TYPE %ROWTYPE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
17 mai 2011 2 17 /05 /mai /2011 12:02

 

Oracle PL/SQL ERROR CURSOR ZERO_DIVIDE EXCEPTIONS.

Comment gérer l'erreur Oracle  ORA-01476: divisor is equal to zero  dans un bloc EXCEPTION PLSQL ?

PL/SQL a un mécanisme de gestion des erreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.

Ce curseur c_emp renvoit des enregistrements dont le champ v_emp.comm qui renvoit des valeurs égales à 0. Célà provoque une division par zéro.

Voici un exemple (avec et sans gestion des erreurs) ou PLSQL soulève :

EXCEPTION prédéfinie ZERO_DIVIDE si v_emp.comm=0.

EXCEPTION prédéfinie ZERO_DIVIDE.

 
 SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 v_eval_prime scott.emp.comm%type; 3 v_emp scott.emp%rowtype; 4 CURSOR c_emp IS 5 SELECT ename, job, comm, sal 6 FROM scott.emp 7 WHERE deptno = 30; 8 BEGIN 9 OPEN c_emp; 10 LOOP 11 FETCH c_emp INTO v_emp.ename, v_emp.job, v_emp.comm, v_emp.sal; 12 EXIT WHEN c_emp%NOTFOUND; 13 v_eval_prime := v_emp.comm + (v_emp.sal/v_emp.comm); 14 dbms_output.put_line('Name = '||v_emp.ename || ' Job = ' || v_emp.job || 15 ' Nouvelle Prime = ' ||v_eval_prime); 16 END LOOP; 17 CLOSE c_emp; 18 END; 19 / Name = ALLEN Job = SALESMAN Nouvelle Prime = 305.33 Name = WARD Job = SALESMAN Nouvelle Prime = 502.5 Name = MARTIN Job = SALESMAN Nouvelle Prime = 1400.89 Name = BLAKE Job = MANAGER Nouvelle Prime = DECLARE * ERROR at line 1: ORA-01476: divisor is equal to zero ORA-06512: at line 13 
 
 SQL> SET SERVEROUTPUT ON; SQL> DECLARE 2 v_eval_prime scott.emp.comm%type; 3 v_emp scott.emp%rowtype; 4 CURSOR c_emp IS 5 SELECT ename, job, comm, sal 6 FROM scott.emp 7 WHERE deptno = 30; 8 BEGIN 9 OPEN c_emp; 10 LOOP 11 FETCH c_emp INTO v_emp.ename, v_emp.job, v_emp.comm, v_emp.sal; 12 EXIT WHEN c_emp%NOTFOUND; 13 v_eval_prime := v_emp.comm + (v_emp.sal/v_emp.comm); 14 dbms_output.put_line('Name = '||v_emp.ename || ' Job = ' || v_emp.job || 15 ' Re-evaluation Prime = ' ||v_eval_prime); 16 END LOOP; 17 CLOSE c_emp; 18 EXCEPTION 19 WHEN ZERO_DIVIDE THEN 20 dbms_output.put_line(SQLERRM(SQLCODE)||' SALARIE SANS PRIME !!'); 21 WHEN OTHERS THEN 22 dbms_output.put_line('Autres Erreurs'); 23 END; 24 / Name = ALLEN Job = SALESMAN Re-evaluation Prime = 305.33 Name = WARD Job = SALESMAN Re-evaluation Prime = 502.5 Name = MARTIN Job = SALESMAN Re-evaluation Prime = 1400.89 Name = BLAKE Job = MANAGER Re-evaluation Prime = ORA-01476: divisor is equal to zero SALARIE SANS PRIME !! PL/SQL procedure successfully completed. 

 

Lorsque le traitement a été transferé du bloc BEGIN dans le BLOC EXCEPTION, il n'est plus possible de revenir dans le corps du bloc BEGIN (sauf utilisation de blocs imbriquées).
Quand le programme prend en compte l’erreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.

 

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• Oracle PL-SQL NO_DATA_FOUND TOO_MANY_ROWS EXCEPTIONS
• Oracle PL-SQL Structure d'un BLOC
• Oracle PL-SQL SELECT INTO
• Oracle PL-SQL Variables %TYPE %ROWTYPE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
17 mai 2011 2 17 /05 /mai /2011 00:09

 

Oracle PL/SQL NO_DATA_FOUND et TOO_MANY_ROWS EXCEPTIONS.

Comment gérer l'erreur Oracle ORA-01403: no data found dans un bloc EXCEPTION PLSQL ?
Comment gérer l'erreur Oracle ORA-01422: exact fetch returns more than requested number of rows dans un bloc EXCEPTION PLSQL ?

PL/SQL a un mécanisme de gestion des erreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.

Cette requête SELECT INTO doit renvoyer impérativement 1 seul enregistrement sinon une erreur est declenchée.

Voici deux exemples (avec et sans gestion des erreurs) ou PLSQL soulève :

EXCEPTION prédéfinie NO_DATA_FOUND si aucune ligne n'est retournée (empno = 789 introuvable).
EXCEPTION prédéfinie TOO_MANY_ROWS si plusieurs lignes sont retournées (job = 'SALESMAN' 4 enreg. retournés).

EXCEPTION prédéfinie NO_DATA_FOUND.

 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE empno = 789; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 11 END; 12 / DECLARE * ERROR at line 1: ORA-01403: no data found ORA-06512: at line 5 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE empno = 789; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 EXCEPTION 11 WHEN NO_DATA_FOUND THEN 12 dbms_output.put_line(SQLERRM(SQLCODE)||' SALARIE INNEXISTANT !!'); 13 WHEN OTHERS THEN 14 dbms_output.put_line('Autres Erreurs'); 15 END; 16 / ORA-01403: no data found SALARIE INNEXISTANT !! PL/SQL procedure successfully completed. 

 

EXCEPTION prédéfinie TOO_MANY_ROWS.

 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE job = 'SALESMAN'; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 11 END; 12 / DECLARE * ERROR at line 1: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 5 
 
 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 v_ename scott.emp.ename%type; 3 v_job scott.emp.job%type; 4 BEGIN 5 SELECT ename, job 6 INTO v_ename, v_job 7 FROM scott.emp 8 WHERE job = 'SALESMAN'; 9 dbms_output.put_line('Name = '||v_ename || ' Job = ' || v_job); 10 EXCEPTION 11 WHEN TOO_MANY_ROWS THEN 12 dbms_output.put_line(SQLERRM(SQLCODE)||' Ce Job n''est pas Unique !!'); 13 WHEN OTHERS THEN 14 dbms_output.put_line('Autres Erreurs'); 15 END; 16 / ORA-01422: exact fetch returns more than requested number of rows Ce Job n'est pas Unique !! PL/SQL procedure successfully completed. 

Lorsque le traitement a été transferé du bloc BEGIN dans le BLOC EXCEPTION, il n'est plus possible de revenir dans le corps du bloc BEGIN (sauf utilisation de blocs imbriquées).
Quand le programme prend en compte l’erreur dans une entrée WHEN, les instructions de cette entrée sont exécutées et le programme se termine.

 

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• Oracle PL-SQL Structure d'un BLOC
• Oracle PL-SQL SELECT INTO
• Oracle PL-SQL Variables %TYPE %ROWTYPE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article
14 mai 2011 6 14 /05 /mai /2011 10:08

 

Oracle PL/SQL Liste des Erreurs gérée dans le BLOC EXCEPTION.

Comment gérer les erreurs dans un bloc PL/SQL ?
Avec la gestion des EXCEPTIONS. Les erreurs d’exécutions dans un bloc PL/SQL peuvent être multiples (erreurs système, erreurs Oracle, erreurs de codage, dépassement de limite,...)
PL/SQL a un mécanisme de gestion des erreurs qui permet de traiter ces évènements dans le BLOC EXCEPTION.

 

Liste des EXCEPTIONS PL/SQL.

EXCEPTIONS

 ERROR_ORA 

 SQLCODE 

Description

ACCESS_INTO_NULL ORA-06530 -6530 Un programme tente d'attribuer des valeurs aux attributs d'un objet non initialisé
CASE_NOT_FOUND ORA-06592 -6592 Aucun des choix dans les clauses WHEN d'une instruction CASE est sélectionné, et il n'ya pas de clause ELSE
COLLECTION_IS_NULL ORA-06531 -6531 Un programme tente d'appliquer les méthodes de collecte autres que celle qui existe à une table imbriquée non initialisée ou VARRAY, ou le programme tente d'attribuer des valeurs aux éléments d'une table imbriquée non initialisée ou VARRAY.
CURSOR_ALREADY_OPEN ORA-06511 -6511 Un programme tente d'ouvrir un curseur déjà ouvert. Un curseur doit être fermé avant d'être rouvert. Une boucle de curseur FOR ouvre automatiquement le curseur sur laquelle il se réfère, afin que votre programme ne peut pas ouvrir ce curseur à l'intérieur de la boucle.
DUP_VAL_ON_INDEX ORA-00001 -1 Un programme tente de stocker des valeurs en double dans une colonne qui est contraint par un index unique.
INVALID_CURSOR ORA-01001 -1001 Un programme tente une opération de curseur qui n'est pas autorisé, comme la fermeture d'un curseur non ouvert.
INVALID_NUMBER ORA-01722 -1722 Dans une instruction SQL, la conversion d'une chaîne de caractères en un nombre échoue parce que la chaîne ne représente pas un nombre valide. (Dans les déclarations de procédure, VALUE_ERROR est soulevée.) Cette exception est également soulevée lorsque l'expression LIMIT-clause dans un communiqué en vrac FETCH n'évalue pas à un nombre positif.
LOGIN_DENIED ORA-01017 -1017 Un programme tente de se connecter à Oracle avec un nom d'utilisateur ou mot de passe invalide
NO_DATA_FOUND ORA-01403 100 Une instruction SELECT INTO ne renvoie aucune ligne, ou vos références programme un élément supprimé dans une table imbriquée ou un élément non initialisée dans un index par table
NOT_LOGGED_ON ORA-01012 -1012 Un programme lance un appel à la base de données sans être connecté à Oracle
PROGRAM_ERROR ORA-06501 -6501 PL / SQL à un problème interne
ROWTYPE_MISMATCH ORA-06504 -6504 La variable de curseur d'accueil et PL / SQL variable de curseur impliqués dans une mission ont des types de retour incompatibles. Quand une variable hôte ouvert le curseur est passé à une procédure stockée sous-programme, les types de retour des paramètres réels et formels doivent être compatibles
SELF_IS_NULL ORA-30625 -30625 Un programme tente d'appeler une méthode membre, mais l'instance du type d'objet n'a pas été initialisé. Le haut-paramètre AUTO points à l'objet, et est toujours le premier paramètre passé à une méthode MEMBRES
STORAGE_ERROR ORA-06500 -6500 PL / SQL est à court de mémoire ou la mémoire a été endommagée.
SUBSCRIPT_BEYOND_COUNT ORA-06533 -6533 Un programme de références d'une table imbriquée ou VARRAY élément utilise un numéro d'index plus grand que le nombre d'éléments dans la collection
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 -6532 Un programme de références d'une table imbriquée ou VARRAY élément utilise un numéro d'index (-1 par exemple) qui est en dehors de l'intervalle légal
SYS_INVALID_ROWID ORA-01410 -1410 La conversion d'une chaîne de caractères dans un rowid universel échoue parce que la chaîne de caractères ne représente pas un rowid valide
TIMEOUT_ON_RESOURCE ORA-00051 -51 TIMEOUT car Oracle est en attente d'une ressource
TOO_MANY_ROWS ORA-01422 -1422 Un SELECT INTO retourne plus d'une ligne
VALUE_ERROR ORA-06502 -6502 Une opération arithmétique, de conversion, de truncate, ou d'une erreur de taille de contrainte se produit. Par exemple, lorsque votre programme sélectionne une valeur de colonne dans une variable de caractères, si la valeur est supérieure à la longueur déclarée de la variable, PL / SQL annule la cession et soulève VALUE_ERROR. Dans des déclarations de procédure, VALUE_ERROR est levée si la conversion d'une chaîne de caractères en un nombre échoue. (Dans une requête SQL, INVALID_NUMBER est levée.)
ZERO_DIVIDE ORA-01476 -1476 Un programme tente de diviser un nombre par zéro
Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• Oracle PL-SQL Structure d'un BLOC
• Oracle PL-SQL SELECT INTO
• Oracle PL-SQL Variables %TYPE %ROWTYPE
Repost 0
Published by Daniel Roesch - dans ORACLE PLSQL
commenter cet article