Oracle/ C#: как использовать переменные связывания с операторами выбора для возврата нескольких записей?

У меня есть вопрос, касающийся переменных связывания 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 ответа

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

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

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

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

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

Редактировать:

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

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

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

Другие вопросы по тегам