IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Lancer SQL*Plus sous Windows avec un .bat et récupérer le code erreur [11gR2]


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut 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 : 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.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Dès lors que l'erreur est traitée par le gestionnaire d'exception, elle ne ressort plus du bloc PL/SQL.

    Si vous ajoutez un simple RAISE; juste avant la fin du bloc, celle-ci va remonter et vous aurez bien le code d'erreur attendu dans %ERRORLEVEL%.

  3. #3
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Oui, tu as raison Pomalaix, j'avais pas compris qu'en gérant l'erreur avec WHEN OTHERS, le programme n'allait plus tomber en erreur et donc que le SQLCODE allait revenir à 0.

    J'ai enlevé le WHEN OTHERS et c'est nettement mieux!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lancer la console java sous windows avec le lancement d'un Jar
    Par wagui26 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 15/02/2009, 11h23
  2. Lancer une requête sql avec sql plus sous dos
    Par feragne dans le forum Sql*Plus
    Réponses: 12
    Dernier message: 15/10/2008, 14h49
  3. "Erreur SQL générale" sous NT2000 avec une base ac
    Par aleister dans le forum Bases de données
    Réponses: 5
    Dernier message: 14/04/2005, 20h10
  4. [ORACLE][SQL] procedure sous delphi avec une requete SQL
    Par nivet dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/11/2004, 13h43
  5. Réponses: 2
    Dernier message: 04/11/2003, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo