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

VB.NET Discussion :

Formatage chaîne pour l'opérateur IN


Sujet :

VB.NET

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Formatage chaîne pour l'opérateur IN


    J'ai une procédure stockée sur une base Oracle dont le paramètre est une chaîne qui est passée dans un opérateur IN.
    Est-ce bien une chaîne qu'il faut passer à cet opérateur (si oui comment la formater ?) ou bien existe-il un autre type (liste, etc...) ?

    La procédure stockée
    Code sql : 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
    73
    74
    75
    76
    77
    78
       PROCEDURE proc_liste_pratiques_epandages (
          p_campagne       IN     VARCHAR2,
          p_liste_champs   IN     VARCHAR2,
          p_cur               OUT r_cursor)
       IS
       BEGIN
          OPEN p_cur FOR
               SELECT DISTINCT
                      champ.id_champ,
                      lot_boue.dp,
                      lot_boue.dr,
                      champ.num_sdea AS num_sdea_champ,
                      liste_parcelles.id_parcelle AS id_parcelle,
                      liste_parcelles.num_sdea AS num_sdea_parcelle,
                      champ.ilot_num_pac AS num_ilot,
                      champ.cad_lieu_dit AS lieu_dit,
                      com.nom AS commune,
                      exploit.id_exploitation,
                      exploit.nom_exploitation,
                      champ.champ_surf_declaree AS surface_totale,
                      DECODE (liste_parcelles.num_sdea,
                              '', '',
                              liste_parcelles.surface)
                         AS surface_parcelle,
                      DECODE (liste_parcelles.num_sdea,
                              '', champ.champ_surf_epandable,
                              liste_parcelles.surface)
                         AS surface_epandable,
                      DECODE (liste_parcelles.num_sdea,
                              '', champ.champ_surf_epandable,
                              liste_parcelles.surface)
                         AS surface_a_epandre,
                      type_cultures.id_culture_avant,
                      type_cultures.lib_culture_avant,
                      type_cultures.id_culture_intermediaire,
                      type_cultures.lib_culture_intermediaire,
                      type_cultures.id_culture_apres,
                      type_cultures.lib_culture_apres
                 FROM t_champs champ,
                      t_exploitations exploit,
                      v_communes com,
                      epf.lpe lot_boue,
                      t_campagnes_epandages camp,
                      (  SELECT DISTINCT id_parcelle,
                                         id_champ,
                                         surface,
                                         num_sdea
                           FROM t_parcelles_culturales
                       ORDER BY id_champ, num_sdea) liste_parcelles,
                      (  SELECT DISTINCT
                                pc.id_parcelle,
                                pc.id_champ,
                                pc.dte_fin,
                                pc.avant AS id_culture_avant,
                                tc_avant.lib AS lib_culture_avant,
                                pc.intermediaire AS id_culture_intermediaire,
                                tc_cipan.lib AS lib_culture_intermediaire,
                                pc.apres AS id_culture_apres,
                                tc_apres.lib AS lib_culture_apres
                           FROM t_parcelles_culturales pc,
                                t_type_culture tc_avant,
                                t_type_culture tc_cipan,
                                t_type_culture tc_apres
                          WHERE     tc_avant.id_culture = pc.avant
                                AND tc_cipan.id_culture = pc.intermediaire
                                AND tc_apres.id_culture = pc.apres
                                AND pc.dte_fin IS NULL
                       ORDER BY id_champ, id_parcelle) type_cultures
                WHERE     champ.id_champ IN (p_liste_champs)
                      AND camp.id_campagne = p_campagne
                      AND lot_boue.id = camp.lot_boues
                      AND champ.id_exploitation = exploit.id_exploitation
                      AND com.id = champ.idtcom
                      AND liste_parcelles.id_champ(+) = champ.id_champ
                      AND type_cultures.id_parcelle(+) =
                             liste_parcelles.id_parcelle
             ORDER BY id_champ, num_sdea_champ, num_sdea_parcelle;
       END;



  2. #2
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Oui c'est bien une chaîne String à passer.
    Pour l'appel de ta procédure, l'équivalent de String en OleDbType est System.Data.OleDb.OleDbType.Varchar.


    Ps-Edit: Et ne pas oublier qu'avec IN le parameterDirection est ParameterDirection.Input

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ok c'est déjà bien de savoir ça seul problème, comment formater la chaîne ? Y a t-il une manière spéciale de formater la chaîne pour la passer à IN ?
    Si je fournit en paramètre une chaîne style "1, 2, 3, 9, 10, 12, 23" bin ça marche pas

  4. #4
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Bin chez moi ça marche avec ta chaîne. (Et sinon, tu as plus précis comme message d'erreur que 'ça marche pas' ? )

    On ne fait aucun traitement sur la chaîne hormis doubler les apostrophes mais il n'y en a pas dans ton exemple ...

    Tu as bien tout renseigné pour ta DbCommand ? (.CommandType= storedprocedure , .CommandTexte=NomDeLaProc)
    Tu as bien renseigné/ajouté tes DbParameter ? (.Direction = Input, .Name = LeMêmeNameQueDansTaProcedure, .DbType = varchar) etc

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    soit il y a un quiproquo soit oracle est plus puissant que je ne le pensais ^^

    sur le IN en déclaration veut surement dire input, pas "dans"
    enfin sur sql server ce que tu veux faire n'est pas possible

    tu confirmes que tu as vu quelque part qu'on peut faire un IN sur une variable (autre qu'une variable de type tableau ou table) ou tu improvises ?

    les solutions techniques sont soit l'exécution d'une requete incluse dans une chaine de caractère (permettant la concaténation avec ta variable) ou passer une variable de type tableau/table

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    Bin chez moi ça marche avec ta chaîne. (Et sinon, tu as plus précis comme message d'erreur que 'ça marche pas' ? )
    Non, il n'y a pas de message d'erreur, c'est juste que la procédure ne remonte aucune info. Lorsque je met qu'une seule valeur dans la chaîne sans virgule ni rien ça fonctionne mais dès que j'ai une suite de valeur ça ne remonte plus rien.

    Citation Envoyé par _Ez3kiel Voir le message
    On ne fait aucun traitement sur la chaîne hormis doubler les apostrophes mais il n'y en a pas dans ton exemple ...
    En faut-il absolument des apostrophes dans la chaîne ?

    Citation Envoyé par _Ez3kiel Voir le message
    Tu as bien tout renseigné pour ta DbCommand ? (.CommandType= storedprocedure , .CommandTexte=NomDeLaProc)
    Tu as bien renseigné/ajouté tes DbParameter ? (.Direction = Input, .Name = LeMêmeNameQueDansTaProcedure, .DbType = varchar) etc
    J'utilise les DataSet donc tout est fait comme il faut.

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Je précise que je parle de la clause IN du WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE     champ.id_champ IN (p_liste_champs)
    J'aurais peut-être du le préciser au départ, c'est vrai que j'ai pas fait attention qu'il existe aussi IN pour les paramètres, toutes mes excuses

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    j'ai trouvé la démonstration qui explique pourquoi ca serait une hérésie de laisser passer cette syntaxe (ce que je cherchais précédemment)
    mais je n'ai pas le courage de l'écrire

    enfin ce que tu as à retenir c'est que IN ne peut pas s'utiliser comme tu le souhaites, il n'évalue pas ce que tu as mis dedans, lui il teste si id_champ = p_liste_champs
    c'est pour ca que ca marche quand tu n'as qu'un id dedans et que ca ne marche pas quand tu en as plusieurs

  9. #9
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Je précise que je parle de la clause IN du WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE     champ.id_champ IN (p_liste_champs)
    J'aurais peut-être du le préciser au départ, c'est vrai que j'ai pas fait attention qu'il existe aussi IN pour les paramètres, toutes mes excuses

    Haaaaa, en effet joli quiproquo. J'étais parti sur le IN de INPUT ...

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    enfin ce que tu as à retenir c'est que IN ne peut pas s'utiliser comme tu le souhaites, il n'évalue pas ce que tu as mis dedans, lui il teste si id_champ = p_liste_champs
    c'est pour ca que ca marche quand tu n'as qu'un id dedans et que ca ne marche pas quand tu en as plusieurs
    Oui ça je n'avais pas vraiment de doute sur la façon que c'est géré par la base oracle mais la question est vraiment: comment passer ma liste par argument !

    Citation Envoyé par _Ez3kiel Voir le message
    Haaaaa, en effet joli quiproquo. J'étais parti sur le IN de INPUT ...
    Oui je m'en suis rendu compte qu'après quelques messages

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Oui ça je n'avais pas vraiment de doute sur la façon que c'est géré par la base oracle mais la question est vraiment: comment passer ma liste par argument !
    Citation Envoyé par Pol63 Voir le message
    les solutions techniques sont soit l'exécution d'une requête incluse dans une chaine de caractère (permettant la concaténation avec ta variable) ou passer une variable de type tableau/table
    après je ne connais pas trop oracle et la question aurait plus sa place sur le forum oracle

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    En fait j'étais parti sur quelque chose d'assez compliqué alors que c'est plus simple. Je peut en effet garde ma chaîne telle qu'elle et dans la clause IN je fait un split et ça fonctionne nickel
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH t AS (SELECT p_liste_champs c FROM DUAL)
    SELECT EXTRACTVALUE (COLUMN_VALUE, '/x') AS id_champ
      FROM t,
           TABLE (
              XMLSEQUENCE (
                 EXTRACT (
                    XMLTYPE (
                          '<list><x>'
                       || REPLACE (c, '|', '</x><x>')
                       || '</x></list>'),
                    '/list/x')))


    quand même

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

Discussions similaires

  1. [Tableaux] Liste chaînée pour une arborescence
    Par Flo. dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2007, 21h05
  2. Récupérer une chaîne pour traitement
    Par loopback dans le forum Linux
    Réponses: 8
    Dernier message: 01/11/2007, 19h11
  3. Parcours de chaîne pour comparer avec un caractère
    Par scofild20 dans le forum Assembleur
    Réponses: 1
    Dernier message: 11/05/2007, 18h51
  4. Réponses: 13
    Dernier message: 29/09/2006, 16h10
  5. [Système] Probleme de chaîne pour [exec]
    Par dj-julio dans le forum Langage
    Réponses: 2
    Dernier message: 14/02/2006, 15h00

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