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

SQL Oracle Discussion :

[ODP.NET] Requete avec parametres


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Par défaut [ODP.NET] Requete avec parametres
    Bonjour, voici mon problème:
    Je recoit en entrée une liste d'id sous la forme "id1,id2,id3,id3".
    J'ai une fonction getObjectsByIds(idList) qui appelle un dataset ODP.NET
    Je dois ne retourner que les objets ayant un id inclut dans la liste du dessus.

    Actuellement j'ai mis en place la requête suivante qui a beaucoup de désavantages:
    - Performances médiocres
    - Pour un id '123' il matchera un id '1234' car inclut dans celui ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT        ID
    FROM           T_OBJECTS
    WHERE        (INSTR(:IdList, ID) <> 0)
    Faire une fonction qui retourne un table a partir de la chaine de char est impossible car je n'ai pas les droit sur la DB.

    Auriez vous des solutions plus élégantes?

    Merci

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    quelques pistes...
    1. collection
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      SQL> select 'YES' from dual where 12 in (select value(t) from table(sys.odcinumberlist(12,34,56))t)
       
      'YES'
      -----
      YES  
      1 row selected.
      SQL> select 'YES' from dual where 12 in (select value(t) from table(sys.odcinumberlist(1234,56)) t)
      no rows selected.
    2. regular expression
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
      SQL> select 'YES' from dual where regexp_like('12,34,56','(\W|\A)12(\W|\Z)')
       
      'YES'
      -----
      YES  
      1 row selected.
      SQL> select 'YES' from dual where regexp_like('1234,56','(\W|\A)12(\W|\Z)')
      no rows selected.
    3. LIKE
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      SQL> select 'YES' from dual where ',' || '12,34,56' || ',' like '%,'||'12'||',%'
       
      'YES'
      -----
      YES  
      1 row selected.
      SQL> select 'YES' from dual where ',' || '1234,56' || ',' like '%,'||'12'||',%'
      no rows selected.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Par défaut
    Merci pour la réponse!
    Je vais creuser du coté des regexp, je n'y avais pas pensé merci.

    (EDIT: Je n'avais pas vu ta facon de générer le contenue du tube de IN a l'aide d'une sous requete)

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    quelques pistes...[*]regular expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL> select 'YES' from dual where regexp_like('12,34,56','(\W|\A)12(\W|\Z)')
    Cette solution marche à merveille, merci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE1 WHERE REGEXP_LIKE(:idsList, '(\W|\A)'||TABLE1.ID||'(\W|\Z)')

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    le plus performant restant la soluce 1, car on peut employer l'index sur ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'YES' FROM dual WHERE id IN (SELECT value(t) FROM TABLE(:list)t)

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Par défaut
    L'admin de la DB a considéré que les index ca servait à rien.... (aucun index existant)
    Et que les clef primaire en chaine de char éclaté sur 3 champs c'etait super

Discussions similaires

  1. Executer une requete avec parametre passe variables
    Par vincent. dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 18/07/2006, 09h18
  2. Pb Graphique sur requete avec parametre
    Par catoucat dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/06/2006, 08h21
  3. syntaxe requete avec parametres
    Par mike600river dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/05/2006, 17h03
  4. [C#/VB.Net] Exe avec parametre.
    Par elkamy dans le forum C#
    Réponses: 9
    Dernier message: 04/12/2005, 11h59
  5. [VB.NET] Requete avec des dates dans un DataSet
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2005, 14h30

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