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

Oracle Discussion :

Sql*Plus appelé depuis un Shell


Sujet :

Oracle

  1. #1
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut Sql*Plus appelé depuis un Shell
    Bonjour,

    voilà une question "classique" à laquelle j'ai trouvé 10 000 réponses sur le net mais aucun ne fonctionne pour mon cas qui me parait pourtant assez banal

    J'ai un shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/ksh
    #---------------------------------------------------------------------
    echo "LANCEMENT !"
    SORTIE=`sqlplus -S apps/apps @./sql.sql`
    echo $SORTIE
    echo "FIN !"
    Et je veux que la variable SORTIE soit alimentée par le fichier "sql.sql" qui est :

    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
    Set heading OFF
    Set linesize 1000
    Set feedback OFF
    Set echo OFF
    Set verify OFF
    Set serveroutput On
    Set SERVEROUTPUT ON SIZE 1000000
    
    WHENEVER sqlerror exit FAILURE ROLLBACK;
    
    declare
      i number;
    begin
    	dbms_output.put_line('Mes messages de LOG');
    	dbms_output.put_line('Mes messages de LOG');
    	dbms_output.put_line('Mes messages de LOG');
    	null;
            return 0;
    exception
      when others then
        null;
    end;
    /
    show error;
    exit;
    Le return ne fonctionne pas mais c'est l'idée de ce que je voudrais.

    Je ne veux pas que SORTIE contienne un grep du spool de mon sql car j'ai plein de message de debug, j'ai essayé exit 0; , j'ai essayé WHENEVER sqlerror exit 1 ROLLBACK; j'ai essayé un :sortie = 0; enfin tout ce que je trouvais mais rien ne fonctionne.

    Auriez-vous une idée ?

    Merci

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Je ne comprends pas ce que tu veux faire !
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Bonjour,

    Si j'ai bien suivi ce que tu veux faire,
    créer un fichier de sortie dans sql.sql (genre sortie.log)
    et ouvre simplement le fichier pour voir ce qu'il contient.
    Je ne comprend pas trop pourquoi tu veux le mettre dans une variable ?!
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  4. #4
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Ah désolé

    En fait je veux que mon fichier *.sql renvoie un code retour de type NUMBER au shell qui l'appelé.

  5. #5
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    en somme tu veux vérifier que ton traitement c'est bien passé ou pas.
    Perso j'ai jamais réussi à faire ça, alors ce que je fait c'est créer un fichier dans lequel je met mes logs, puis en shell si le fichier est vide c'est que le traitement est Ok, sinon Ko
    C'est tout ce que je peux te dire... Désolé...
    voili, voilou
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  6. #6
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Vous pouvez déclarer une variable SQL*Plus, la référencer en PL/SQL et l'utiliser dans l'instruction SQL*Plus EXIT. Voir cet exemple.

  7. #7
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par pifor
    Vous pouvez déclarer une variable SQL*Plus, la référencer en PL/SQL et l'utiliser dans l'instruction SQL*Plus EXIT. Voir cet exemple.
    Ok merci !

    Je me retrouve donc avec mon SQL :

    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
    Set heading OFF
    Set linesize 1000
    Set feedback OFF
    Set echo OFF
    Set verify OFF
    Set SERVEROUTPUT ON SIZE 1000000
    variable ret_val number
     
    WHENEVER sqlerror exit FAILURE ROLLBACK;
     
    declare
      i number;
    begin
    	dbms_output.put_line('Mes messages de LOG');
    	dbms_output.put_line('Mes messages de LOG');
    	dbms_output.put_line('Mes messages de LOG');
    	:ret_val := 9;
    	null;
    exception
      when others then
        null;
    end;
    /
    show error;
    exit :ret_val;
    Mon Shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/ksh
    #---------------------------------------------------------------------
    echo "LANCEMENT !"
    ret_val=`sqlplus -S apps/apps @./sql.sql`
    echo "#"$ret_val"#"
    echo "FIN !"
    Mais la valeur de la variable ne s'affiche, pas, à l'écran j'ai :

    LANCEMENT !
    #Mes messages de LOG Mes messages de LOG Mes messages de LOG No errors.#
    FIN !

  8. #8
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Merci Pifor pour l'astuce encore une fois

    Macben, je pense que le problème viens du fait que tu affecte à ta variable le résultat de sqlplus. Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/ksh
    #---------------------------------------------------------------------
    echo "LANCEMENT !"
    sqlplus -S apps/apps @./sql.sql
    echo "#"$ret_val"#"
    echo "FIN !"
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  9. #9
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Essayez de récupérer le code retour avec $? et non avec ``:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/ksh
    #---------------------------------------------------------------------
    echo "LANCEMENT !"
    sqlplus -S / @tcr.sql
    ret_val=$?
    echo "#"$ret_val"#"
    echo "FIN !"
    Sur Solaris 8, ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LANCEMENT !
    Mes messages de LOG
    Mes messages de LOG
    Mes messages de LOG
    No errors.
    #9#
    FIN !

  10. #10
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Merci pifor ! Tu as toutes les bonnes réponses !!!

    Je met mon code définitif il pourra servir pour d'autres.

    Merci à vous 2 pour vos réponses !

    Fichier SQL :

    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
    Set heading OFF
    Set linesize 1000
    Set feedback OFF
    Set echo OFF
    Set verify OFF
    Set SERVEROUTPUT ON SIZE 1000000
    variable ret_val number
     
    WHENEVER sqlerror exit FAILURE ROLLBACK;
     
    declare
      i number;
    begin
    	dbms_output.put_line('Mes messages de LOG');
    	dbms_output.put_line('Mes messages de LOG');
    	dbms_output.put_line('Mes messages de LOG');
    	:ret_val := 9;
    	null;
    exception
      when others then
        null;
    end;
    /
    show error;
    exit :ret_val;
    Fichier Shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/ksh
    #---------------------------------------------------------------------
    echo "LANCEMENT !"
    sqlplus -S apps/apps @./sql.sql
    ret_val=$?
    echo "#"$ret_val"#"
    echo "FIN !"

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

Discussions similaires

  1. [11gR2] Utiliser SQL*Plus dans un script Shell
    Par CinePhil dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 17/06/2013, 15h34
  2. Erreur Sql*Loader appelé depuis Forms
    Par sphinx18 dans le forum Forms
    Réponses: 2
    Dernier message: 17/03/2009, 14h03
  3. SQL Plus Et Shell Linux
    Par Dobyan08 dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 20/09/2007, 14h14
  4. Shell et sql plus
    Par pepin21 dans le forum Sql*Plus
    Réponses: 3
    Dernier message: 20/10/2006, 10h47
  5. Réponses: 1
    Dernier message: 24/04/2006, 18h03

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