Lancer SQL*Plus sous Windows avec un .bat et récupérer le code erreur
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.
Code:
1 2 3
| sqlplus "*****/*****@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=**********)(PORT=****))(CONNECT_DATA=(SID=REFD01)))" @P:\ERROR02.sql
ECHO %ERRORLEVEL%
pause |
Contenu du fichier P:\ERROR02.sql.
La table ZZZ_DDU a un seul champ ID NUMBER(2), je vais donc provoquer une erreur en insérant un number 3.
Code:
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.
Code:
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> |
Quand je tape quit à l'invite SQL, voilà ce que j'ai.
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:
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.