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

Sql*Plus Oracle Discussion :

Code retour de la commande @


Sujet :

Sql*Plus Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut Code retour de la commande @
    Bonjour,

    ça fait plusieurs heures que j'essaie, sans succès, de faire quelque chose qui me paraît pourtant simple ...

    en gros, un "ami" ma laissé un script sql qui lui-même contient des appels à des scripts sql par la commande @. Ces scripts contiennent des instructions DDL.
    Ca marche bien sauf que je n'arrive pas à intercepter les éventuelles erreurs et du coup arrêter mon traitement ...

    En bref :

    script1.sql lancé par un .bat ou un .sh

    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
    set serveroutput on size 1000000;
    set linesize 1000
    set pagesize 0
    set feedback on
    set heading  off
    set arraysize 7
    set echo on
    set verif off
    set termout on
    set trims on
    set show off
    spool "&6"
     
    Whenever sqlerror Exit Failure ;
     
    PROMPT appel script2
    @script2.sql -- le script DDL
    show sqlcode -- affiche tout le temps 0
     
    -- ...
    et script2.sql, le script contenant les DDL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Whenever sqlerror Exit Failure ;
     
    CREATE OR REPLACE procedureblabla(code_retour out number) as
    BEGIN
    END;
    /

    Le script2 provoque une erreur, ce qui me donne dans la console/le log :
    Avertissement : Procédure créée avec erreurs de compilation.

    Mais je suis bien incapable de detecter cette erreur par programmation.
    La solution du "Whenever sqlerror" semblait bonne mais bon, en fait non ...
    Et je n'ai pas envie de passer par du PL et de l'execute immediate (il y a trop de scripts DDLs).

    Avez-vous une idée que je puisse exploiter ?

    Merci d'avance

    In

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Avertissement : Procédure créée avec erreurs de compilation.
    Ce n'est pas une erreur, mais un warning
    Il faudrait plutôt tester les objets invalides
    Cordialement,
    Franck.

  3. #3
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    donc tu penses que si j'avais des erreurs ORA-xxx le code retour de mes scripts serait différent de 0.

    D'après toi, il faut qu'après l'exécution des scripts, je regarde dans la base si les objets sont bien compilés ? Il va falloir que je mette un poil de PL pour gérer ça dans mon script1 ...

    Y a t'il une manière propre d'appeler des scripts sql depuis du PL. J'ai vu la commande host, mais je trouve ça bizarre de lancer sqlplus qui va exécuter du PL pour lancer encore du sqlplus ...

    Y a t'il moyen de faire un truc comme

    execute immediate @script2.sql

    ?

  4. #4
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Je te propose 2 solutions:

    1- tu execute tout ton script et ensuite tu regardes ALL_ERRORS pour les objets en question.

    2- tu crée le script suivant et tu l'appelles ('@showerrors.sql') après chaque create procedure à la place d'appeler 'show errors':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    show errors
    declare
     nberr number;
    begin
    for r in (select sql_text from v$session join v$sql on (v$session.prev_sql_id=v$sql.sql_id) where v$session.audsid=userenv('SESSIONID')) loop
     execute immediate 'select count(*) from ( ' || r.sql_text || ')' into nberr;
     if ( nberr > 0 ) then raise_application_error(-20000,'Warning from show errors'); end if;
    end loop;
    end;
    /
    Voilà, il lance la même chose que show errors mais lève une erreur ORA-20000 s'il y a des warnings.

    Cordialement,
    Franck.

  5. #5
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Ok, super. Je teste dès que possible.

  6. #6
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Bon,

    j'ai nettoyé un peu les scripts sql.
    A la fin de celui qui me crée les procédures avec des warnings, j'ai ajouté ton morceau de code qui avait l'air pas mal.

    Par contre il provoque des erreurs de compilation que je n'arrive pas à résoudre pour le moment :

    Citation Envoyé par sqlplus
    FOR r IN (SELECT sql_text FROM v$session JOIN v$sql ON (v$session.prev_sql_id=v$sql.sql_id) WHERE v$session.audsid=userenv('SESSIONID')) loop
    *
    ERREUR à la ligne 7 :
    ORA-06550: Ligne 7, colonne 78 :
    PL/SQL: ORA-00904: "V$SQL"."SQL_ID" : identificateur non valide
    ORA-06550: Ligne 7, colonne 10 :
    PL/SQL: SQL Statement ignored
    ORA-06550: Ligne 8, colonne 49 :
    PLS-00364: utilisation de variable d'index boucle 'R' invalide
    ORA-06550: Ligne 8, colonne 2 :
    PL/SQL: Statement ignored
    C'est peut être dû à la version d'Oracle ?
    Le script doit passer sur du 9 et du 10. Ici pour le moment je suis en 9 ...

    [EDIT]
    A priori dans v$session je n'ai pas prev_sql_id et dans v$sql je n'ai pas sql_id

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

Discussions similaires

  1. [batch] Récupération du code retour d'une commande
    Par fenrys_1 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 06/03/2009, 18h05
  2. code retour première commande dans un pipe
    Par ArnaudD dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 26/09/2007, 10h30
  3. [Perl] code retour de la commande "perl"
    Par NikoBe dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 14/08/2007, 10h16
  4. [commande DOS] Récupérer le code retour d'un programme
    Par bobunny dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 04/06/2004, 15h51

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