Oracle / c #: как использовать переменные связывания с операторами выбора для возврата нескольких записей? - PullRequest
0 голосов
/ 26 мая 2010

У меня вопрос по поводу переменных связывания Oracle и операторов выбора.

Чего я хотел бы добиться, так это выбрать несколько значений для первичного ключа. Я хотел бы передать эти значения через массив, используя значения связывания.

select * from tb_customers where cust_id = :1

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

Затем я связываю DataReader, чтобы получить значения в таблицу.

Проблема в том, что результирующая таблица содержит только одну запись (для cust_id=51). Таким образом, кажется, что каждое утверждение выполняется независимо (как и должно быть), но я хотел бы, чтобы результаты были доступны в виде коллектива (одна таблица).

Обходной путь - создать временную таблицу, вставить все значения cust_id, а затем выполнить объединение с tb_customers. Проблема с этим подходом состоит в том, что мне потребуются временные таблицы для каждого различного типа первичного ключа, поскольку я хотел бы использовать это для ряда таблиц (некоторые даже объединяли первичные ключи).

Есть ли что-то, чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2010

Я знаю, что это спросили некоторое время назад, но не блестящий ответ.

Я бы сделал что-то вроде этого - извините за грубый псевдокод

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 + ")";

Итак, запрос в конечном итоге имеет ((1,: 2,: 3 и т. Д.) И каждый из них связан отдельно.

Здесь также есть похожий вопрос: OracleParameter и IN Clause

0 голосов
/ 26 мая 2010

Не задавая вопрос о том, почему вы хотели бы сделать это для начала. Не должно ли выражение sql быть чем-то вроде

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

Edit:

Я ограничен в Oracle, но когда я просматриваю документацию, я думаю, что вам, возможно, придется сделать что-то вроде этого:

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

Это позволит вам воспользоваться связыванием. Вам нужно будет добавить каждую запись возврата в свою собственную коллекцию, поскольку она будет возвращать только одну за раз.

...