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 :

Conserver les quotes au sein d'une chaîne de caractères


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Conserver les quotes au sein d'une chaîne de caractères
    Bonjour

    j'ai écris un script shell appelant un script sql avec un paramètre.

    Le shell est de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TYPE='type1','type2','typeX'
    ./lancerequete.sh $TYPE
    Le script lancerequete.sh ressemble à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo "sqlplus scott/tiger@bdd @recup.sql $1" > lancer.bat
    ./lancer.bat > "resultat.RES"
    et enfin recup.sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from table
    where type not in (&&1);
    Tout va bien jusqu'à l'intégration de la variable dans la requête, qui donne:
    select * from table
    where type not in (type1,type2,typeX);

    Les quotes ont disparu!!
    Et donc la requête ne peut être lancée!

    Voilà, si vous avez un "truc", merci de m'en faire profiter SVP!

    Susu39.

  2. #2
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    protège les quotes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TYPE="\'type1\',\'type2\',\'typeX\'"
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    OK!Merci pour cette réponse!

    Quelle commande puis-je utiliser pour insérer les \ au bon endroit? en effet je prends mes données d'un fichier de paramètres donc si je peux éviter la saisie de ces \ en plus des quotes ce serait super! (et je pourrais régler le problème des quotes par la même occasion!!)

    J'ai fouillé un peu du coté des commandes sed, cut, awk, wc mais je ne trouve pas comment parcourir ma chaine tout en insérant mes caractères aux endroits voulus...

    Je sais je corse l'affaire mais si tu as une piste, je prends!

    merci

    susu39

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    cette commande sed devrait faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed  -e "s/'/\\\'/g"
    Maintenant il faut pouvoir repérer les chaines dans ton fichier ou il faut protéger les quotes. La c'est à toi de me donner des critères.
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    En fait la protection des quotes ne fonctionne pas!
    J'ai testé en ajoutant les \ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    VAL="\'TYPE1\',\'TYPE2\'"
    ./lancerequete.sh $VAL
    Mais au final les quotes et les antislashes disparaissent quand même et en plus ma chaîne est tronquée : il ne reste plus que TYPE1!

    Je pense que le problème vient plutôt de l'appel au script SQL car le paramètre garde le bon format jusqu'à son intégration dans la requête SQL (où il perd ses quotes et antislashes).

  6. #6
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    faut peut etre trouver une autre solution pour passer les arguments a ta fonction sql. Comment récuperes tu les valeurs "type1" "type2" "type3" ?
    Il est a mon avis plus simple d'avoir autant de variable que de "type" et a partir de ces variables de créer la chaine "\'type1\',\'type2\',\'type3\'"
    Mais je sais pas comment SQL interprete les parametres qu'on passe dans une fonction.
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Finalement j'ai procédé d'une autre manière: je construit ma requête sql dans le script shell au moment où les paramètres ont encore leurs quotes.

    Mais ce que j'aimerais bien faire c'est :

    - dans mon fichier de config, avoir
    MESVALEURS|type1,type2,typeX

    - dans mon script shell, une fois que j'ai récupéré ma chaîne "type1,type2,typeX", insérer des quotes pour chaque valeur.

    Sur le même principe que dont je ne comprends pas bien la syntaxe (), comment ajouter une quote avant et après chaque virgule?

  8. #8
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    si tu as dans ton script une variable de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var=type1,type2,type3
    tu peux rajouter les quotes de cette facon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     quoted_var=\'$(echo $var | sed -e "s/,/','/g")\'
    En revanche, selon ce que tu vas faire avec ta nouvelle variable ainsi définie, tu peux avoir de mauvaises surprises. Il pourrait etre utile de protéger les quotes le cas échéant. Comme j'ai dit je sais pas comment sql va interpréter le contenu de cette variable.
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    J'ai réessayé en insérant des quotes et en les protégeant mais rien n'y fait, au final ma requête SQL est toujours la même:les quotes et les antislashes disparaissent!

    Je reste donc sur ma première solution : je construit ma requête directement dans le script shell mais les valeurs que je récupère auparavant doivent être entre quotes.

    Susu39.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    il faut 3 quotes de chaque coté...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut résolu!
    Ca marche avec 3 quotes de chaque côté!

    Merci!

  12. #12
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    et donc au final t'as mis quoi comme commande ?
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Ma variable de départ ne contient aucune quote.
    Je rajoute des quotes: 3 de chaque côté des virgules:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quoted_var=\'$(echo $var | sed -e "s/,/''','''/g")\'
    et j'en ajoute 2 au début de ma variable et 2 à la fin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./lancerequete.sh "''$quoted_var''"
    dans ma requête sql j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from table
    where type not in ('&&1');

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

Discussions similaires

  1. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13
  2. Lister toutes les possibilités de casse d'une chaîne
    Par nerok dans le forum Windows Forms
    Réponses: 20
    Dernier message: 15/06/2007, 11h11
  3. [RegEx] Supprimer caractères invisibles au sein d'une chaîne
    Par webrider dans le forum Langage
    Réponses: 9
    Dernier message: 19/04/2007, 11h07
  4. Gérer les guillemeets à l'intérieur d'une chaîne
    Par LAGARDETTE dans le forum ASP
    Réponses: 5
    Dernier message: 27/06/2006, 22h08
  5. [TestStand] Compter les éléments d'une chaîne de caractères
    Par capblans dans le forum Autres langages
    Réponses: 2
    Dernier message: 29/04/2005, 09h29

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