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 :

[ksh] Boucler sur des lignes retournées par une requête SQL


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Points : 80
    Points
    80
    Par défaut [ksh] Boucler sur des lignes retournées par une requête SQL
    Bonjour,

    J'ai un petit soucis pour boucler sur des résultats retournés par une requête SQL. En effet, si dans mes retours SQL j'ai des espaces, mon for va interpréter les espaces présents dans mes lignes retournées par SQL. Comment faire abstraction de ces espaces?

    EX :

    Voici les 3 lignes retournées par mon select
    Premiere phrase
    Deuxieme phrase
    Troisieme phrase

    Comment boucler pour afficher mes 3 phrases l'une après l'autre?

    Merci d'avance

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Normalement avec une boucle "for" il faut changer le IFS (Internal Field Separator), c'est pour quoi on lui préfère en général une boucle "while".

    Comment est implémentée ta boucle "for" ?

    Exemple de boucle "while" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ while read line;do echo "Ligne : ${line}";done <<<"Premiere phrase
    Deuxieme phrase
    Troisieme phrase"
    Ligne : Premiere phrase
    Ligne : Deuxieme phrase
    Ligne : Troisieme phrase

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Exemple de boucle "while" :
    Spécifique bash, me semble-t-il...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ while read line;do echo "Ligne : ${line}";done <<<"Premiere phrase"
    ksh: syntax error: `< ' unexpected
    Bon, d'accord, il ne l'a précisé que dans le titre du post sans le rappeler dans le corps d'icelui...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ $ cat | while read line;do echo "Ligne : ${line}";done <<EOF
    > Premiere phrase
    > Deuxieme phrase
    > Troisieme phrase
    > EOF
    Ligne : Premiere phrase
    Ligne : Deuxieme phrase
    Ligne : Troisieme phrase
    Attention! Suivant la version du ksh, il peut être difficile de récupérer en dehors de la boucle while les valeurs lues dans icelle...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Points : 80
    Points
    80
    Par défaut
    Merci à tous les 2, j'ai essayé avec le while mais j'ai toujours erreur. J'ai oublié de préciser que j'avais également des retours à la ligne dans mes données SQL et je pense que c'est d'ailleurs ces retours à la ligne qui posent problèmes. Voici 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
     
    while read BODY
    do
    	echo ${BODY}
    done  < `/apps/oracle/10.2.0.4/bin/sqlplus -L -s toto@oracle_sid/toto  <<-EOF
    		select 'Phrase une, premier paragraphe
     
    Phrase une, deuxieme paragraphe
    ' from dual
    UNION
    select 'Phrase deux, premier paragraphe
     
    Phrase deux, deuxieme paragraphe' from dual; 
    		EOF`

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Quelle erreur?

    Peux-tu essayer avec un fichier intermédiaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /apps/oracle/10.2.0.4/bin/sqlplus -L -s toto@oracle_sid/toto > /tmp/toto  <<-EOF
    		select 'Phrase une, premier paragraphe
    Phrase une, deuxieme paragraphe
    ' from dual
    UNION
    select 'Phrase deux, premier paragraphe
    Phrase deux, deuxieme paragraphe' from dual; 
    EOF
     
    cat /tmp/toto # Pour voir
     
    cat /tmp/toto | while read BODY ; do
        echo ${BODY}
    done

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Points : 80
    Points
    80
    Par défaut
    Si je passe part un fichier intermédiaire il ne m'exécute pas le contenu, il ne fait que recopier les lignes présentes à l'intérieur.
    L'erreur que j'ai est une erreur oracle :
    SP2-0734: unknown command beginning "Phrase deu..." - rest of line ignored.
    SP2-0042: unknown command "UNION" - rest of line ignored.

    Elle est provoquée par le fait que ma ligne est mal interprétée car la quote ouvrante présente à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 'Phrase une, premier paragraphe
    ne fait plus son effet

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 401
    Points
    28 401
    Par défaut
    Je ne pense pas que le fait que tu passes par un fichier intermédiaire modifie le comportement de sqlplus.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Je ne pense pas que le fait que tu passes par un fichier intermédiaire modifie le comportement de sqlplus.
    C'était une tentative d'investigation pour tenter de comprendre s'il s'agissait d'une erreur SQL ou shell.

    Tu as compris ce qu'il voulait faire, toi?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Points : 80
    Points
    80
    Par défaut
    Ce que je souhaite faire c'est :
    Si ma requête SQL me retourne plusieurs lignes, afficher ligne par ligne

    Sachant qu'une ligne (et donc un champ de ma table) contient des espaces et des retours à la ligne.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par Cj_Dal Voir le message
    Ce que je souhaite faire c'est :
    Si ma requête SQL me retourne plusieurs lignes, afficher ligne par ligne

    Sachant qu'une ligne (et donc un champ de ma table) contient des espaces et des retours à la ligne.
    Alors, àmha, il faudrait commencer par débeuguer la commande SQL qui provoque une erreur! (Et ce forum n'est pas le meilleur pour cela!)

    Lorsque la commande SQL fonctionnera, je t'invite à revenir ici avec le résultat de sa sortie ainsi que la manière dont tu voudrais la voir transformée.

Discussions similaires

  1. [PDO] comptage des lignes retournées par une requête SELECT un peu complexe
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/02/2015, 21h37
  2. Réponses: 2
    Dernier message: 11/04/2008, 23h23
  3. Réponses: 4
    Dernier message: 21/02/2008, 22h35
  4. Réponses: 2
    Dernier message: 24/12/2007, 09h53
  5. Réponses: 2
    Dernier message: 31/05/2007, 10h57

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