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

Shell et commandes GNU Discussion :

Script qui récupère résultat de procédure SQL


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 79
    Points : 62
    Points
    62
    Par défaut Script qui récupère résultat de procédure SQL
    Bonjour,

    Je dois créer un script sh qui appelle une procédure SQL. Le résultat de la procédure doit être récupérer et renvoyer dans un fichier dont le chemin sera spécifier.
    Je suis vraiment nouveau en sh, j'en ai fait il y a plusieurs année durant mes études mais je n'en ai plus aucun souvenir.
    Bref, je suis arrivé à construire ceci pour le moment :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #exit 0
    #!/bin/ksh
    #############################################################################
    #
    # Generate csv file to UPDATE DELAIS and send result to a shared folder
    #
    # Transfer by FTP the file in transfer/out/partners/IND_DELAIS*.xml
    #
    # If success, remove LOG files AND csv file                   
    #  Nota : 
    # 	FTP  codes used to check if the transfer is OK or NOK are :
    #	'200 PORT' 
    #	'150 Opening' 
    #	'226 Transfer'
    #	
    # - Transfer by FTP and check
    #	
    #############################################################################
     
    #### Directory of SQL procedure
    ACCES=`dirname $0`
    if [ $0 = `basename $0` ]
    then
            tst=`type $0 | awk '{print $NF}'`
            [ -z "$tst" ] && tst="not found"
            if [ $0 = `basename $tst` ]
            then
                    tst=`type $0 | awk '{print $NF}'`
                    ACCES=`dirname $tst`
            else
                    ACCES="."
            fi
    fi
    if [ "$ACCES" = "." ]
    then
            ACCES=`pwd`
    else
            deb=`echo $ACCES | sed -e "s/\(.\).*/\1/"`
            if [ "X$deb" != "X/" ]
            then
                    ACCES=`pwd`/$ACCES
            fi
    fi
    ####
    ####
     
    KPI_DELAYS_ENV_PATH=$ACCES
    . $KPI_DELAYS_ENV_PATH/kpi_delays_export_csv.sh
     
    VAR=$(sqlplus /NOLOG <<!
    connect E760/E760@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST=***)(PORT=1521))(CONNECT_DATA = (SID = ***)))@PA_IND_DELAYS_BODY.sql;
    !)
     
    result=`sqlplus / <<SCRIPT| grep ^result | sed "s/^result: //"
    set serveroutput on
    declare
        var_truc_result VARCHAR2(255);
    begin
       export_csv($0,$1);
       dbms_output.put_line( 'result: ' || var_truc_result);
    end;
    /
    exit
    SCRIPT`
     
    echo var_truc_result is: $result
     
    SHARED_FOLDER_PATH=$ACCES
    . $SHARED_FOLDER_PATH/TEST_FOLDER
     
    $RESULT * >$SHARED_FOLDER_PATH/
    Seulement je ne suis pas sûr des dernières lignes...
    En effet la procédure SQL se nomme export_csv() et prend deux paramètres en entrée.

    J'ai créé un dossier de test nommé TEST_FOLDER, je spécifie son emplacement et j'exécute une commande que j'ai trouvé sur le net pour diriger les résultats vers ce dossier.

    Voici les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Try `dirname --help' for more information.
    D:\Sopra\workspace_Visual_Studio\Evpt\EVPT\EVPT v3\Database\Scripts\005-KPIDelay\kpi_delays_export_csv.sh: line 22: [: too many arguments
    D:\Sopra\workspace_Visual_Studio\Evpt\EVPT\EVPT v3\Database\Scripts\005-KPIDelay\kpi_delays_export_csv.sh: line 48: /d/Sopra/workspace_Visual_Studio/Evpt/EVPT/EVPT: No such file or directory
    var_truc_result is:
    D:\Sopra\workspace_Visual_Studio\Evpt\EVPT\EVPT v3\Database\Scripts\005-KPIDelay\kpi_delays_export_csv.sh: line 69: /d/Sopra/workspace_Visual_Studio/Evpt/EVPT/EVPT: No such file or directory
    D:\Sopra\workspace_Visual_Studio\Evpt\EVPT\EVPT v3\Database\Scripts\005-KPIDelay\kpi_delays_export_csv.sh: line 71: 1: ambiguous redirect
    Mise à part les erreurs, je dois sûrement mal m'y prendre...
    Si vous avez des remarques, je suis preneur
    Merci !

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    beaucoup de ces erreurs peuvent être dûes à l'absence de guillemets autour des variables.

    NB: pour être prise en compte, l'indication du shell à utiliser (shebang) doit être sur la toute première ligne du script.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 79
    Points : 62
    Points
    62
    Par défaut
    Merci pour le message

    J'ai modifié un peu le code, histoire de voir si la fonction principale (exécuter la procédure et récupérer son résultat) fonctionne. J'en suis dont arrivé à ceci :
    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
     
    VAR=$(sqlplus /NOLOG <<!
    connect E760/E760@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST=p595n11)(PORT=1521))(CONNECT_DATA = (SID = DBUVNSD5)))@PA_IND_DELAYS_BODY.sql;
    !)
     
    result=`sqlplus / <<SCRIPT| grep ^result | sed "s/^result: //"
    set serveroutput on
    declare
        var_truc_result VARCHAR2(255);
    begin
       export_csv($0,$1);
       dbms_output.put_line( 'result: ' || var_truc_result);
    end;
    /
    exit
    SCRIPT`
     
    echo var_truc_result is: "$result"
    Et $result est vide.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Avant d'être un problème de shell, c'est avant un problème au niveau de l'utilisation de SQL*Plus et PL/SQL.

    Reprenons la partie en cause :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set serveroutput on
    declare
        var_truc_result VARCHAR2(255);
    begin
       export_csv($0,$1);
       dbms_output.put_line( 'result: ' || var_truc_result);
    end;
    /
    exit
    A quel moment dans ce code la variable var_truc_result reçoit-elle une valeur de la procédure export_csv ?
    Cette procédure export_csv, qu'attend-elle comme valeurs en paramètre ?
    Ici, $0 et $1 seront remplacés respectivement par le nom du script en cours d'exécution et le premier paramètre reçu par ce script, informations que PL/SQL ne pourra exploiter puisqu'une chaine de caractère doit être encadrée de guillemets en SQL.
    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.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 79
    Points : 62
    Points
    62
    Par défaut
    Honnêtement, je ne sais pas.
    C'est un code que j'ai récupéré sur internet dans un topic qui avait sensiblement le même besoin que moi.
    J'ai juste essayé d'adapter le code...
    Je ne suis pas étonné que ça ne fonctionne pas ^_^

    Je n'ai jamais utilisé SQL*PLUS, j'essaie de regarder un maximum d'information sur le net mais je suis cours en temps (user story < 8h).

    Les paramètres d'entrée de export_csv sont définis lors de l'appel du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./nom_script.sh Toulouse 9h00
    Ce sont deux string.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par CaNiBaLe Voir le message
    Les paramètres d'entrée de export_csv sont définis lors de l'appel du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./nom_script.sh Toulouse 9h00
    Ce sont deux string.
    Donc déjà, on peut modifier cela :
    Ensuite, qu'attends-tu comme résultat ?
    La procédure export_csv affiche-t-elle quelque chose ?
    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.

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 79
    Points : 62
    Points
    62
    Par défaut
    L'objectif souhaité est de récupérer le résultat de la procédure export_csv() pour le diriger vers un dossier.
    En gros je veux renvoyer le résultat de la procédure dans un dossier dont le chemin est spécifié.

    Oui elle renvoie plusieurs lignes de texte.

    Edit: je dois partir, je serais là demain matin. Merci encore

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Une procédure ne retourne pas de résultat. Une fonction éventuellement...

    Une procédure peut afficher des lignes. Ces lignes peuvent être récupérées dans un fichier de spool (voir la documention de SQL*Plus à ce propos).
    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.

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Citation Envoyé par CaNiBaLe Voir le message
    Oui elle renvoie plusieurs lignes de texte.
    Je ne crois pas du tout. La procédure semble faire un traitement qui remplit la variable "var_truc_result"; puis une autre ligne lance l'affichage. D'ailleurs, entre nous, mettre une entête "result" dans ton script sql, pour l'enlever dans ton script sh, est idiot.

    Et donc finalement, quel est le shebang ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 79
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Une procédure ne retourne pas de résultat. Une fonction éventuellement...

    Une procédure peut afficher des lignes. Ces lignes peuvent être récupérées dans un fichier de spool (voir la documention de SQL*Plus à ce propos).
    C'est une procédure qui fait différents SELECT sur une vue.

    Citation Envoyé par Flodelarab
    Je ne crois pas du tout. La procédure semble faire un traitement qui remplit la variable "var_truc_result"; puis une autre ligne lance l'affichage. D'ailleurs, entre nous, mettre une entête "result" dans ton script sql, pour l'enlever dans ton script sh, est idiot.
    Je l'utilise peut-être pas de la meilleure façon, mais j'essaie de faire un ECHO dessus

    Citation Envoyé par Flodelarab
    Et donc finalement, quel est le shebang ?
    #!/bin/ksh

    C'est pas évident de se mettre au script en quelques heures...

Discussions similaires

  1. [PostgreSQL] Script qui lit et exécute requetes à partir d'un .sql
    Par Adsm05 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/04/2012, 18h00
  2. Réponses: 1
    Dernier message: 22/10/2011, 23h30
  3. [MySQL] Transaction: procédure SQL ou script PHP
    Par franquis dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/03/2011, 11h31
  4. Réponses: 3
    Dernier message: 02/02/2007, 14h30
  5. Réponses: 2
    Dernier message: 31/05/2006, 09h58

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