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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut sqlplus et shell : utilisation d'un parametre et récupération dans une variable ?
    Bonjour

    Dans un script unix en ksh, j'ai souvent besoin d'aller interroger une table oracle via une requete SQL et lui passant un parametre et en récupérant le résultat dans une variable,

    Lorsque la commande SQL est dans un fichier, pas de problème cela fonctione.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo ""
    echo "==== FONCTIONNE - APPEL par fichier SQL ====="
    CP=3193
    libCP=`sqlplus -s $ORACLE_USER @/applis/ctif/hf3/vftools/libCP.sql $CP`
    echo "libCP = "$libCP
    renvoie
    ==== FONCTIONNE - APPEL par fichier SQL =====
    libCP = AME101 - Cash Pool Elementaire

    Mais du coup, je me retrouve avec beaucoup de petits fichiers SQL à gérer.

    Alors pour faciliter la compréhension du script ksh, je préférerai avoir un seul fichier ksh et que ce fichier contienne les différentes requetes SQL.

    Et là, ca ne marche plus

    J'ai essayé trois méthodes différentes mais pas une ne fonctionne.
    NOTE : bien sûr, si on enleve le parametre, ces trois méthodes fonctionnent mais sans le paramétre, cela ne m'interesse plus.

    1ere méthode
    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
     
    echo ""
    echo "==== 1ere METHODE - KO ====="
    CP=3193
     
    libCP=`sqlplus -s $ORACLE_USER <<EOF
        SET HEADING OFF
        SET ECHO OFF
        SET FEEDBACK OFF
        SET VERIFY OFF
        select lilgroup FROM TBGROUP where IDGROUP IN (&1);
        exit;
        EOF $CP`
     
    echo "libCP = "$libCP
    donne comme résultat

    ==== 1ere METHODE - KO =====
    libCP = Entrez une valeur pour 1 : select lilgroup FROM TBGROUP where IDGROUP IN ( exit CTI_REF CTI_changeDate.ksh CTI_changeIBAN.ksh CTI_runtest.ksh CTI_runtest_chantier.ksh del25.sh del25.sql files libCP.sql listeIDGROUP.sql logs prgs purge.ksh purge.sql purge_ipo.sql raz_viregul.sql temp zer.sql zer3.sql ERREUR à la ligne 1 : ORA-00911: caractère non valide SP2-0042: commande inconnue "EOF 3193" - reste de la ligne ignoré.
    2eme méthode
    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
     
    echo ""
    echo "==== 2eme METHODE - KO ====="
    CP=3193
     
    libCP=`echo "
        SET HEADING OFF
        SET ECHO OFF
        SET FEEDBACK OFF
        SET VERIFY OFF
        select lilgroup FROM TBGROUP where IDGROUP IN (&2);
        exit;
        " | sqlplus -s $ORACLE_USER $CP`
     
    echo "libCP = "$libCP
    a pour résultat le message de bienvenu de sqlplus

    ==== 2eme METHODE - KO =====
    libCP = SQL*Plus: Release 10.2.0.3.0 - Production Copyright (c) 1982, 2006, Oracle. All Rights Reserved. Syntaxe 1 : sqlplus -H | -V -H Affiche la version de SQL*Plus et l'aide sur la syntaxe. -V Affiche la version de SQL*Plus. Syntaxe 2 : sqlplus [ [<option>] [<logon>] [<start>] ] <option> : [-C <version>] [-L] [-M "<options>"] [-R <level>] [-S] -C <version> Définit la compatibilité des commandes affectées à la version spécifiée par <version>. Cette version est dotée de la syntaxe "x.y[.z]". Par exemple, -C 10.2.0 -L Ne tente de se connecter qu'une seule fois, au lieu de réafficher l'invite en cas d'erreur. -M "<options>" Définit le balisage HTML automatique de la sortie. Les options sont au format suivant : HTML [ON|OFF] [HEAD text] [BODY text] [TABLE text] [ENTMAP {ON|OFF}] [SPOOL {ON|OFF}] [PRE[FORMAT] {ON|OFF}] -R <level> Définit le mode restreint pour désactiver les commandes SQL*Plus qui interagissent avec le système de fichiers. Le niveau peut être 1, 2 ou 3. La valeur la plus restrictive est -R 3, qui désactive toutes les commandes utilisateur interagissant avec le système de fichiers. -S Définit le mode client qui supprime l'affichage de la bannière SQL*Plus, les invites et la sortie (echo) des commandes. <logon> : (<username>[/<password>][@<connect_identifier>] | /) [AS SYSDBA | AS SYSOPER] | /NOLOG Indique le nom utilisateur, le mot de passe et l'identificateur de connexion du compte de base de données pour la connexion à cette base. Sans ID de connexion, SQL*Plus se connecte à la base de données par défaut. Les options AS SYSDBA et AS SYSOPER sont des privilèges d'administration de base de données. L'option /NOLOG permet de démarrer dans SQL*Plus sans connexion à une base de données. <start> : @<URL>|<filename>[.<ext>] [<parameter> ...] Exécute le script SQL*Plus spécifié depuis un serveur Web (URL) ou le système de fichiers local (filename.ext) à l'aide des paramètres fournis, qui seront affectés aux variables de substitution du script. Lorsque SQL*Plus démarre, et après l'exécution des commandes CONNECT, le profil de site (ex. : $ORACLE_HOME/sqlplus/admin/glogin.sql) et le profil utilisateur (ex. : login.sql dans le répertoire de travail) sont exécutés. Les fichiers peuvent contenir des commandes SQL*Plus. Pour plus d'informations, reportez-vous au manuel SQL*Plus User's Guide and Reference.
    3eme méthode

    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
     
    echo ""
    echo "==== 3eme METHODE - KO ====="
    CP=3193
     
    libCP=$(sqlplus -s $ORACLE_USER<<-EOF
     
        SET HEADING OFF
        SET ECHO OFF
        SET FEEDBACK OFF
        SET VERIFY OFF
        select lilgroup FROM TBGROUP where IDGROUP IN (&1);
        $CP
        exit;
        EOF)
     
    echo "libCP = "$libCP
    débouche sur

    ==== 3eme METHODE - KO =====
    libCP = Entrez une valeur pour 1 : AME101 - Cash Pool Elementaire
    Cette 3eme méthode me semble la plus proche de la vérité...Mais elle n'est pas trés élégante et plutot compliquée à gérer (bizarre, ce parametre $CP perdu dans le code SQL)
    Il reste aussi à se débarrasser du libellé superflu "Entrez une valeur pour 1:"

    Une idée ? (avec une préférence pour les méthodes 1 ou 2)

    D'avance merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 730
    Points : 29 102
    Points
    29 102
    Par défaut
    As-tu essayé avec :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Merci pour ta réponse!
    Cela fonctionne
    A force de chercher le détail, on ne voit plus l'évidence.

    Finalement, ce post devrait s'appeler "les différentes façon d’exécuter du code dans un script"

    On obtient :

    1ere méthode

    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
     
    echo ""
    echo "==== 1ere METHODE - OK ====="
    CP=3193
     
    libCP=`sqlplus -s $ORACLE_USER <<-EOF
        SET HEADING OFF
        SET ECHO OFF
        SET FEEDBACK OFF
        SET VERIFY OFF
        select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
        exit;
        EOF`
     
    echo "libCP = "$libCP
    2eme methode

    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
     
    echo ""
    echo "==== 2eme METHODE - OK ====="
    CP=3193
     
    libCP=`echo "
        SET HEADING OFF
        SET ECHO OFF
        SET FEEDBACK OFF
        SET VERIFY OFF
        select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
        exit;
        " | sqlplus -s $ORACLE_USER`
     
    echo "libCP = "$libCP
    3eme methode

    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
     
    echo ""
    echo "==== 3eme METHODE - OK ====="
    CP=3193
     
    libCP=$(sqlplus -s $ORACLE_USER<<-EOF
        SET HEADING OFF
        SET ECHO OFF
        SET FEEDBACK OFF
        SET VERIFY OFF
        select lilgroup FROM TBGROUP where IDGROUP IN ($CP);
        exit;
        EOF)
     
    echo "libCP = "$libCP
    donne dans les 3 cas le meme résultat

    ==== 1ere METHODE - OK =====
    libCP = AME101 - GROUPE MADRID - Cash Pool Elementaire

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

Discussions similaires

  1. [Débutant] Utiliser la valeur d'un Slider dans une variable
    Par franck34matlab dans le forum Interfaces Graphiques
    Réponses: 19
    Dernier message: 18/10/2013, 17h09
  2. Réponses: 3
    Dernier message: 28/05/2009, 15h27
  3. utiliser le resultat d'un SUM dans une variable
    Par Qapoka dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/05/2006, 15h47
  4. Shell: récupérer le bon nom de fichier dans une variable
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 10/01/2006, 11h45
  5. Utiliser la valeur d'un input dans une variable php
    Par megane dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/08/2005, 16h02

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