Bonjour tout le monde,
Je lance SQL*Plus sous Windows depuis un fichier commande .bat avec en paramètre un fichier SQL.
Dans ce fichier SQL je provoque une erreur que j'arrive à afficher MAIS dans le .bat je n'arrive pas à avoir la valeur de l'erreur, le code retourné vaut 0.
Contenu du fichier .bat.
Contenu du fichier P:\ERROR02.sql.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 sqlplus "*****/*****@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=**********)(PORT=****))(CONNECT_DATA=(SID=REFD01)))" @P:\ERROR02.sql ECHO %ERRORLEVEL% pause
La table ZZZ_DDU a un seul champ ID NUMBER(2), je vais donc provoquer une erreur en insérant un number 3.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK WHENEVER OSERROR EXIT SQL.SQLCODE ROLLBACK SET SERVEROUTPUT ON DECLARE v_num_count number; BEGIN SELECT COUNT(*) INTO v_num_count FROM ZZZ_DDU; DBMS_OUTPUT.PUT_LINE('ETAPE 01, nb enregs dans zzz_ddu : ' || TO_CHAR(v_num_count)); INSERT INTO ZZZ_DDU VALUES (1); INSERT INTO ZZZ_DDU VALUES (158); INSERT INTO ZZZ_DDU VALUES (2); DBMS_OUTPUT.PUT_LINE('ETAPE 02' ); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('ERREUR CODE : ' || TO_CHAR(SQLCODE) || ' - MESSAGE : ' || SQLERRM ); SELECT COUNT(*) INTO v_num_count FROM ZZZ_DDU; DBMS_OUTPUT.PUT_LINE('ERREUR, nb enregs dans zzz_ddu avant rollback : ' || TO_CHAR(v_num_count)); ROLLBACK; SELECT COUNT(*) INTO v_num_count FROM ZZZ_DDU; DBMS_OUTPUT.PUT_LINE('ERREUR, nb enregs dans zzz_ddu après rollback : ' || TO_CHAR(v_num_count)); --DBMS_OUTPUT.PUT_LINE('02 - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()); END; /
Résultat de l'exécution du .bat.
On détecte bien l'erreur sur la valeur trop grande et on affiche bien le code erreur.
Quand je tape quit à l'invite SQL, voilà ce que j'ai.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 P:\>sqlplus "*****/*****@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=*****)(PORT=****))(CONNECT_DATA=(SID=*****)))" @P:\ERROR02.sql SQL*Plus: Release 11.2.0.1.0 Production on Tue Jun 7 08:31:18 2016 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning and Real Application Testing options ETAPE 01, nb enregs dans zzz_ddu : 0 ERREUR CODE : -1438 - MESSAGE : ORA-01438: value larger than specified precision allowed for this column ERREUR, nb enregs dans zzz_ddu avant rollback : 1 ERREUR, nb enregs dans zzz_ddu apr?s rollback : 0 PL/SQL procedure successfully completed. SQL>
ERRORLEVEL vaut 0 et je pense que c'est le SQL.SQLCODE lié à l'opération "PL/SQL procedure successfully completed." et non pas celui lié à l'INSERT qui a échoué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SQL> quit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning and Real Application Testing options P:\>ECHO 0 0 P:\>pause Appuyez sur une touche pour continuer...
Merci de me dire comment récupérer dans le .bat le code SQL.SQLCODE de l'erreur, soit -1438 dans cet exemple, car j'ai pas mal cherché sur le net et visiblement le problème n'est pas si trivial.
Partager