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
Это позволит вам воспользоваться преимуществами привязки. Вам нужно будет добавить каждую запись возврата в свою собственную коллекцию, поскольку она будет возвращать только одну за раз.