Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/03/2011, 12h17   #1
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 3
Points : 3
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 :
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
drfeelgood13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 13h21   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
quelques pistes...
  1. collection
    Code :
    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 :
    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 :
    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.
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 13h31   #3
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 3
Points : 3
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)
drfeelgood13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 13h43   #4
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 3
Points : 3
Citation:
Envoyé par laurentschneider Voir le message
quelques pistes...[*]regular expression
Code :
1
2
 
SQL> SELECT 'YES' FROM dual WHERE regexp_like('12,34,56','(\W|\A)12(\W|\Z)')
Cette solution marche à merveille, merci!
Code :
SELECT * FROM TABLE1 WHERE REGEXP_LIKE(:idsList, '(\W|\A)'||TABLE1.ID||'(\W|\Z)')
drfeelgood13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 14h00   #5
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
le plus performant restant la soluce 1, car on peut employer l'index sur ID

Code :
SELECT 'YES' FROM dual WHERE id IN (SELECT value(t) FROM TABLE(:list)t)
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 14h38   #6
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 3
Points : 3
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
drfeelgood13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h29.


 
 
 
 
Partenaires

Hébergement Web