2010-05-26 9 views
0

J'ai une question concernant les variables de liaison Oracle et les instructions select.Oracle/C#: Comment utiliser les variables bind avec des instructions select pour renvoyer plusieurs enregistrements?

Ce que je voudrais réaliser est de faire une sélection sur un certain nombre de valeurs différentes pour la clé primaire. Je voudrais passer ces valeurs via un tableau en utilisant des valeurs de liaison.

select * from tb_customers where cust_id = :1 

int[] cust_id = { 11, 23, 31, 44 , 51 };

Je lie alors un DataReader pour obtenir les valeurs dans une table.

Le problème est que la table résultante contient uniquement un enregistrement unique (pour cust_id=51). Il semble donc que chaque énoncé soit exécuté indépendamment (comme il se doit), mais j'aimerais que les résultats soient disponibles sous forme de collectif (table unique).

Une solution de contournement consiste à créer une table temporaire, insérer toutes les valeurs de cust_id, puis effectuer une jointure par rapport à tb_customers. Le problème avec cette approche est que j'aurais besoin de tables temporaires pour chaque type différent de clé primaire, comme je voudrais l'utiliser contre un certain nombre de tables (certaines ont même des clés primaires combinées).

Y at-il quelque chose qui me manque?

Répondre

0

Ne vous posez pas la question de savoir pourquoi vous voudriez faire cela pour commencer. Ne doit pas l'instruction SQL quelque chose comme

select * from tb_customers where cust_id = 11 or 23 or ... 

Edit:

je suis limité dans Oracle mais quand je regarde la documentation que je pense que vous pourriez avoir à faire quelque chose comme ceci:

variable i number 
exec :i := 11 
select * from tb_customers where cust_id = :i 

Cela vous permettrait de profiter de la liaison. Vous devrez ajouter chaque retour d'enregistrement à votre propre collection car il n'en retournera qu'un seul à la fois.

+0

Oui mon besoin sera satisfaite par une ou sur la sélection, mais je vais pousser éventuellement des milliers d'articles sur la chaîne de sélection dans ce cas, et une stratégie en utilisant des variables de liaison pourrait être éventuellement plus efficace? – twiga

0

Je sais que cela a été demandé il y a un moment, mais pas une réponse brillante.

je ferais quelque chose comme ça - s'il vous plaît excuser le code psudo brut

string bindList = ""; 
for(int ii=0;ii<cust_id.count;++ii) 
{ 
    if(ii == 0) 
    { 
    bindList += ":" + ii; 
    } 
    else 
    { 
    bindList += ",:" + ii; 
    } 
    OracleParameter param = new OracleParameter(); 
    param.dbType = types.int; 
    param.value = cust_id[ii]; 
    command.Parameters.Add(param); 
} 

query = "select * from tb_customers where cust_id in(" + bindList + ")"; 

Alors se termine requête en ayant en (: 1, 2, 3, etc.) et chacun d'entre eux sont liés séparément .

Il y a aussi une question similaire ici: OracleParameter and IN Clause

Questions connexes