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 : 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
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 : 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.
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>
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 : 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.