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 :

Sortie de requête SQLPLUS dans une variable dans un shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut Sortie de requête SQLPLUS dans une variable dans un shell
    Bonjour,

    Je souhaite récupérer le résultat d'un requête sqlplus afin que chacune des valeurs-résultat soit une variable.
    J'ai écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $SQLPLUS  user/motdepasse@PDBessai @/home/tutu/TITI/script/requete.sql
    J'obtiens bien le résultat de ma requête si j'ajoute >RESULT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $SQLPLUS  user/motdepasse@PDBessai @/home/tutu/TITI/script/requete.sql >RESULT
    mais avec des informations du type :
    SQL*Plus: Release 19.0.0.0.0 - Production on Jeu. Juin 20 08:18:00 2024
    Version 19.10.0.0.0

    Copyright (c) 1982, 2020, Oracle. All rights reserved.

    Heure de la dernière connexion réussie : Mer. Juin 19 2024 15:49:31 +02:00

    Connecté à :
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.10.0.0.0

    1) Comment faire pour ne plus avoir ce type d'informations
    2) Comment sortir les résultats de ma requête pas à pas dans une variable ?

    Merci d'avance pour vos idées,

    FredNV

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

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

    pourquoi écris-tu $SQLPLUS ?
    as-tu lu le man pour voir s'il est possible de ne pas avoir les en-têtes dans la sortie du programme ?

    je vois que tu es un grand débutant (parce que tu ne montres pas comment mettre la sortie d'une commande dans une variable, ni connecter (pipe) la sortie d'une commande à l'entrée d'une autre; sais-tu même ce que sont les entreé/sortie et les codes de retour d'une commande ?! ).

    tu dois lire les tutos avant de poser une question sur les forums, puis expliquer comment «ça marche pas».
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Sinon, j'ai tenté ça pour avoir le résulat de ma commande dans une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RESULT=$($SQLPLUS  user/motdepasse@PDBessai @/home/tutu/TITI/script/requete.sql)
    Je pursuis pour avoir chaque résultat dans une variable...

    Cordialement,

    FredNV

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    Bonjour

    N_BaH te demande si tu as lu la doc, tu ne réponds pas
    Si c'est juste supprimer l'entête, existe une option "silent" (comme le client mysql), mais ceci n'est pas du bash, juste utiliser son outil. Si tu ne trouve pas la doc, existe un forum oracle

    Pour le coté bash, puisque tu n'indiques rien sur le format de sortie, aucune idée de ce que tu désires faire véritablement (une variable par ligne ou ligne/colonne ? une matrice, un tableau, une liste ... dates, réels, ...)
    $moi= ( !== ) ? : ;

  5. #5
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Merci papajoker, je ne connaissais pas l'option silent et du coup en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $SQLPLUS -S  user/motdepasse@PDBessai @/home/tutu/TITI/script/requete.sql
    je n'ai plus cette vilaine entête.

    Oui, je ne suis pas trés claire dans la formulation de ce que je souhaite.
    J'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RESULT=$($SQLPLUS  user/motdepasse@PDBessai @/home/tutu/TITI/script/requete.sql)
    Donc maintenant j'ai bien tout le résultat de ma requête dans la variable RESULT.
    Cela donne une serie de nombres séparés par des espaces : 456 886 999 etc....

    Je vais chercher comment lire ces nombres un à un pour que chaque nombre soit une variable elle même que je pourrai utiliser ailleurs ....suis-je plus claire ?

    Cordialement,

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    pas forcément
    Le résultat n'est qu'une ligne ? donc c'est un tableau si oui, reste à le convertir directement en "tableau" bash
    que chaque nombre soit une variable
    un tableau est une variable qui est constitué de valeurs : resultat[0] ... resultat[9]

    Ou boucler sur chaque valeur mais le traitement peut-être complexe
    $moi= ( !== ) ? : ;

  7. #7
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Je me dis que je peux utiliser split avec comme séparateur "espace" puisque chaque valeur est séparée de la suivante par un espace ...
    Je suis en train de chercher la syntaxe exacte.

    Cordialement,

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 568
    Points : 19 402
    Points
    19 402
    Par défaut
    Je me dis que je peux utiliser split avec comme séparateur "espace" puisque chaque valeur est séparée de la suivante par un espace ...
    pourquoi ? puisque bash peut "naturellement" produire un tableau,
    soit avec read -ra, soit avec readarray (ou mapfile).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 254
    Points : 13 489
    Points
    13 489
    Par défaut
    Bonjour

    Je soutiens la réponse de N_BaH, à laquelle je pensais dès le premier message. (read)

    Personnellement, cette manie de vouloir toujours mettre les choses dans une variable me hérisse, et elle est inadaptée au shell. Pour avoir les nombres de la sortie dans un fichier avec un nombre par ligne, on peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '\<[0-9]*\>' RESULT
    On peut ensuite, par exemple, enchaîner avec une boucle "while" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '\<[0-9]*\>' RESULT | while read ligne;do echo traitement de $ligne;done
    ou en bashisme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read ligne;do echo traitement de $ligne;done < <(grep -o '\<[0-9]*\>' RESULT)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Merci vos réponses m'ont bien aidée.
    J'ai encore une petite quetsion qui devriat être facile pour des experts et que je n'arrive pas à toruver :
    voilà j'aimerai sortir le résultat de mon awk suivant dans deux variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat RES3| while read ligne;do awk '{print $1 "\n" $2}' FS="," ;done
    est-ce possible?
    Merci d'avance,
    FredNV

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 568
    Points : 19 402
    Points
    19 402
    Par défaut
    mais, pourquoi cat, et pourquoi awk ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while IFS=',' read -r prems deuz; printf '%s\n' "$prems" "$deuz"; done <RES3
    et, pourquoi un fichier intermédiaire ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    il y a un rapport avec le sujet ??? si oui, RES3 est quoi ?
    Si il y a un rapport avec le sujet, on ne sait même pas si ce que tu as fait est bon (ca marche ne veut pas dire c'est bon). Si ton RES3 vient de ta demande initiale, c'est bizarre.

    Si c'est toujours le même sujet et tu ne veux pas utiliser de tableau ... tu as, peux avoir (devrais avoir ?) sans doute une chose du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read -r janv fev mars avril mai autre; do
        echo "01: $janv , 05: $mai, ..."
        echo
    done < <(monClientSql "select * from ventes")
    Si ce n'est pas le même sujet, j'espère que tu n'as pas géré ta sortie sql avec awk (surtout qu'il est simple de modifier la requete sql elle-même pour un bon formatage)

    Si je comprend ta demande, en plus général, tu désires remplacer tous les séparateurs (,) par un retour à la ligne. peut être suffisant ? echo -e "${resultat//,/'\n'}"
    $moi= ( !== ) ? : ;

  13. #13
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Je vais résumer ce que je souhaite faire dans mon script : je souhaite lancer une requête sqlplus qui sortira pour chaque ligne deux valeurs séparées par un espace ou une virgule ( ça c'est ok) .
    Puis pour chaque ligne-résultat de cette requête je souhaite mettre les 2 valeurs obtenues dans deux variables qui iront alimenter un curl.
    Donc je pensais faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $SQLPLUS -S  toto/mtptoto@PDBASE @/home/titit/tutu/script/requete.sql > RES3
    cat RES3| while read ligne;do awk '{print $1 "\n" $2}' FS=","  ;done   ==> si j'arrive à recup valeur1 et valeur 2 qui correspondraient à print$1 et print$2
    curl -u 'ESSAI:123456' https://www.br.fr/api/brabra/ESSAI.api?action=devel&INEST=valeur1&MATRTA=valeur2"
    Je ne sais pas si cela est plus clair pour vous.
    En tout cas, merci à tous pour votre aide.

    FredNV

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 568
    Points : 19 402
    Points
    19 402
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while IFS=',' read -r prems deuz; curl ..."$prems"..."$deuz"; done < <($SQLPLUS -S  toto/mtptoto@PDBASE @/home/titit/tutu/script/requete.sql )
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    re bonjour,

    Merci pour la mise en forme de la commande : ça aide !!
    Par contre, si je tente ça pour voir ce qu'il y a dans prems et deuz :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while IFS=',' read -r prems deuz;do echo $prems $deuz;done < <($SQLPLUS -S  toto/mtptoto@PDBASE @/home/titit/tutu/script/requete.sql)
    je n’obtiens rien pour $deuz : pourquoi ?
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 568
    Points : 19 402
    Points
    19 402
    Par défaut
    je ne peux visualiser le résultat de la requête, je ne peux donc pas répondre.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    ben je devrais avoir un chiffre .
    La ligne de la requête est : 14562368,123

    et du coup 123 ne ressort pas, j'ai juste 14562368 lorsque je fais le echo.

    merci

  18. #18
    Membre à l'essai
    Femme Profil pro
    Ingénieur intégration
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    oupsssss je n'ai rien dit ...boulette de mon côté

  19. #19
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 172
    Points : 4 594
    Points
    4 594
    Par défaut
    Citation Envoyé par FredNV Voir le message
    deux valeurs séparées par un espace ou une virgule ( ça c'est ok) .
    Pas logique, en fonction de ta requete/serveur, tu dois avoir qu'un seul séparateur et à chaque fois


    Puis pour chaque ligne-résultat de cette requête je souhaite
    Tu ne nous montres toujours pas ton résultat actuel, mais le dernier montré #13 était loin de faire ceci puisque ton curl n'était même pas dans la boucle.
    $moi= ( !== ) ? : ;

Discussions similaires

  1. [Python 3.X] Problème sortie de la valeur d'une variable d'une fonction
    Par Equinox612 dans le forum Général Python
    Réponses: 7
    Dernier message: 12/05/2017, 07h53
  2. Réponses: 1
    Dernier message: 07/05/2014, 18h27
  3. tester l'existence d'une variable en bourne SHELL
    Par nicolas.pailheret dans le forum Linux
    Réponses: 1
    Dernier message: 14/04/2009, 17h28
  4. Passer une variable C en Shell avec un system()
    Par electro38 dans le forum Linux
    Réponses: 9
    Dernier message: 24/02/2008, 10h26

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