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

Linux Discussion :

IF sur une variable SHELL dans un bout de SQL


Sujet :

Linux

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Par défaut IF sur une variable SHELL dans un bout de SQL
    Bonjour à tous,

    Je souhaiterai obtenir des conseils au sujet d'un petit souci que j'ai en ce moment.
    En fait, j'exécute un script shell qui entre autre, fait appel à un bout de SQL pour extraire un fichier (dont le chemin et le nom sont stockés dans une table)

    Jusque là tout va bien, et le passage de variable du shell au SQL après m'avoir un peu fait galérer est géré.

    Maintenant, j'essaye d'affiner un aspect : sur le nommage du fichier que j'extrait (je le récupère, puis le renomme et l'envoie ailleurs).
    Pour affiner le nommage du fichier, il faudrait que je puisse au sein du SQL tester une condition mais sur une variable issue du shell.


    Voilà (en partie) le code :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    if [ $PROG = NomPROG_ORACLE ]
      then
      SORTIE=''
      cat << EOD2 | sqlplus -silent $APPS_USER/$APPS_PASS 1>&2
        whenever sqlerror exit sql.sqlcode
        whenever oserror exit oscode
     
      DECLARE 
      fin varchar2(1);
     
      BEGIN
     
      LOOP 
            select phase_code INTO fin
            from
            FND_CONCURRENT_REQUESTS fcr, FND_CONCURRENT_PROGRAMS fcp
            where  
            fcr.CONCURRENT_PROGRAM_ID=fcp.CONCURRENT_PROGRAM_ID
            and
            fcp.CONCURRENT_PROGRAM_NAME='NomPROG1_ORACLE' 
            and 
            PARENT_REQUEST_ID = '$REQUEST_ID';
            exit when fin='C';
      END LOOP;
     
      END;
      /
        set term off
        set echo off
        set feed off
        set verify off
        set pages 0
        set line 500
      spool ${TEMP_DIR}/cpc.sh
     
      select 'cp ' || OUTFILE_NAME || ' /CHEMIN/FICHIER_' || '$PROGPAR3' || '.txt'
      INTO :SORTIE
      from
            FND_CONCURRENT_REQUESTS fcr, FND_CONCURRENT_PROGRAMS fcp
            where  
            fcr.CONCURRENT_PROGRAM_ID=fcp.CONCURRENT_PROGRAM_ID
            and
            fcp.CONCURRENT_PROGRAM_NAME='GLLEZL' 
            and 
            PARENT_REQUEST_ID = '$REQUEST_ID';
     
        spool off
     
        exit
     
    EOD2
     
    chmod 777 ${TEMP_DIR}/cpc.sh
    ${TEMP_DIR}/cpc.sh
     
    fi
    Je teste en shell dès le début en fait le nom d'un prog que j'aurai lancé (un concurrent program au sens Oracle Appli pour être précis)
    Puis intervient le bout de SQL qui me permet de récupérer le fichier de sortie de ce prog pour aller le mettre ailleurs

    L'affinage dont je parle serait au milieu de ce code savoir s'il est possible d'aller tester autre chose du genre :

    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
     
    ......
     
      set pages 0
        set line 500
      spool ${TEMP_DIR}/cpc.sh
     
    ---->bout de shell si y'a moyen :
    if [ $AUTREVAR = AutreValeur ]
    then
     
      select 'cp ' || OUTFILE_NAME || ' /CHEMIN/FICHIER_' || '$AutreChose' || '.txt'
      INTO :SORTIE
      from
            FND_CONCURRENT_REQUESTS fcr, FND_CONCURRENT_PROGRAMS fcp
            where  
            fcr.CONCURRENT_PROGRAM_ID=fcp.CONCURRENT_PROGRAM_ID
            and
     
    .....
    fi
    .....

    Voilà, j'espère que c'est suffisament clair, la question étant simplement : est-il possible d'insérer du shell au sein de SQl, ou faudra-t-il que je fasse un équivalent "if, then" en SQL en passant par des variables SQL qui seraient créées à partir de mes variables shell.

    Merci à tous!
    A+
    Nico

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 826
    Billets dans le blog
    1
    Par défaut
    Désolé, tu ne peux pas.
    En fait, quand tu appelles ton ordre sql, il y a un branchement complet sur sql qui s'exécute dans son intégralité puis tu reviens au shell.

    Tu peux simuler ce fonctionnement de la façon suivante
    - tu vas sous "vi"
    - tu appelles ":sh" => ça t'ouvre un sous shell => tu peux taper des commandes, faire des trucs mais t'es plus du tout dans "vi"
    - en tapant "ctrl-d" tu quittes le sous-shell et tu reviens dans "vi"

    Comment résoudre ton problème ? Ben en découpant ton gros sql en plein de petits.
    Ensuite tu appelles le premier sql, puis le second, puis le 3° etc. Et entre deux, tu peux insérer des tests shells pour te brancher sur un sql X ou un sql Y.

    Sinon si le SQL accepte le if/then, alors tu peux lui faire faire des choix selon tes variables. Tu appelles le SQL en mettant tes variables et lors de l'appel, le shell transformera automatiquement la variable en son contenu
    Exemple qui expliquera plus clairement mes propos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/sh
    table="personne"
    echo "select * from $table where machin=truc" | mysql bdd
    Lors de l'exécution du script, le shell remplacera la variable "table" par son contenu et mysql recevra la chaine "select * from personne where machin=truc"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Par défaut
    Bonjour Svear,

    Merci pour les explications, et la méthode qui consiste en découper en plusieurs petits bouts de sql selon les tests a effectuer me semble la plus facile pour moi à mettre en oeuvre.
    Une question alors à ce sujet : cela implique-t-il de répéter les étapes de connexion à chaque appel d'un bout sql? j'imagine que oui.
    J'entends par là en partie ce passage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        cat << EOD2 | sqlplus -silent $APPS_USER/$APPS_PASS 1>&2
        whenever sqlerror exit sql.sqlcode
        whenever oserror exit oscode
    Merci en tout cas pour les conseils, bonne journée!
    A+
    Nico

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 826
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicolas.pailheret Voir le message
    Une question alors à ce sujet : cela implique-t-il de répéter les étapes de connexion à chaque appel d'un bout sql? j'imagine que oui.
    Hé oui !!! Chaque exécution d'un petit sql nécessitera de ta part la connexion à la bdd. Et chaque script une fois exécuté sera validé (par rapport au commit et au rollback).

    Sinon il y a une autre solution: ton script shell commence par créer le script sql et le stocke dans une variable. Ca peut se faire étape par étape, style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var="whenever sqlerror exit sql.sqlcode"
    var="$var whenever oserror exit oscode"
    var="$var DECLARE"
    var="$var fin varchar2(1);"
    etc etc et les étapes de création de ta variable pourront être contrôlées par le shell et certaines conditions X ou Y lui feront créer une variable qui contient l'ordre sqlX ou sqlY.
    Ensuite, une fois la variable terminée, tu l'exécutes via sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$var" |sqlplus -silent $APPS_USER/$APPS_PASS
    Une seule étape de connexion. Mais cette façon de procéder est plus difficile (ordre sql pas forcément bien lisible, erreurs possibles, etc...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Par défaut
    Merci Sve@r

    Je pense opter pour la première solution, quitte à alourdir le code,

    Cela dit je prend note de ta seconde idée, lorsque j'aurai plus de temps pour optimiser tout ça,

    Merci en tout cas, bon week-end!
    A+
    Nico

Discussions similaires

  1. Comment passer et lire une variable Shell dans un expect ?
    Par mederik dans le forum Shell et commandes POSIX
    Réponses: 8
    Dernier message: 10/06/2013, 10h22
  2. [Débutant] binding sur une variable définie dans un .cs
    Par Rakken dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 01/10/2012, 10h38
  3. Réponses: 21
    Dernier message: 21/08/2008, 23h30
  4. Réponses: 5
    Dernier message: 08/08/2006, 00h02
  5. Syntaxe d'une variable boolean dans INSERT INTO en SQL
    Par frevale dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/05/2006, 19h26

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