Есть несколько способов сделать «переменную в списке», которую вы ищете. Использовать связанный параметр.
Это основано на этом:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:210612357425
Откровенно говоря, я стараюсь использовать переменные связывания как можно чаще, не только для повышения производительности, но и для дополнительного уровня безопасности.
в то время как есть много способов снять шкуру с кошки, это (хотя и многословно) должно сделать это
в Oracle
- создать свой тип
создать или заменить тип varcharTableType в виде таблицы varchar2 (255);
--create your function
function in_varchar( p_string in varchar2 ) return varcharTableType
as
l_string long default p_string || ',';
l_data varcharTableType := varcharTableType();
n number;
begin
loop
exit when l_string is null;
n := instr( l_string, ',' );
l_data.extend;
l_data(l_data.count) :=
ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
l_string := substr( l_string, n+1 );
end loop;
RETURN L_DATA;
END in_varchar;
Теперь измените ваш запрос в .net
col4 in ( select COLUMN_VALUE from table(in_varchar(:idArray )) )
(кстати, я скопировал большую часть этого кода из предыдущего сообщения, на которое я ответил на форумах оракула:
http://forums.oracle.com/forums/thread.jspa?messageID=4299793�
это на самом деле сделает так, что вам не придется использовать привязку массива, просто убедитесь, что это строка с разделителями-запятыми:: idArray = "A, B, C"
Другой вариант - вернуть операторы select в массив курсоров ref:
/* example table
*
Create Table Zzztab(Deptno Number, Deptname Varchar2(50) , Loc Varchar2(50) , State Varchar2(2) , Idno Number(10)) ;
/
insert into Zzztab(Deptno , Deptname , Loc , State , Idno)
values (0,'Zero','US','NY',0);
insert into Zzztab(Deptno , Deptname , Loc , State , Idno)
values (1,'One','CA','ON',1);
insert into Zzztab(Deptno , Deptname , Loc , State , Idno)
values (2,'Three','IS',null,2);
insert into Zzztab(Deptno , Deptname , Loc , State , Idno)
values (3,'Four','BD',null,3);
*/
string connectStr = GetConnectionString();
// Initialize array of data
String[] myArrayDeptName = { "Zero", "Three", "Four" };
OracleConnection connection = new OracleConnection(connectStr);
OracleCommand command = new OracleCommand();
command.Connection = connection;
command.CommandType = CommandType.Text ;
command.CommandText = "begin open :cur for SELECT DEPTNO, DEPTNAME FROM ZZZTAB WHERE DEPTNAME = :DEPT; end;";
command.ArrayBindCount = myArrayDeptName.Length ;
command.BindByName = true;
OracleParameter cur = new OracleParameter("cur", OracleDbType.RefCursor );
cur.Direction = ParameterDirection.Output;
cur.Value = myArrayDeptName;
command.Parameters.Add(cur);
// deptname parameter
OracleParameter deptNameParam = new OracleParameter("DEPT", OracleDbType.Varchar2);
deptNameParam.Direction = ParameterDirection.Input;
deptNameParam.Value = myArrayDeptName;
command.Parameters.Add(deptNameParam);
try
{
connection.Open();
command.ExecuteNonQuery();
foreach (Oracle.DataAccess.Types.OracleRefCursor rc in (Oracle.DataAccess.Types.OracleRefCursor[])cur.Value)
{ ... fill in an join the datatables
вы можете использовать точно такую же логику и просто вернуть столбцы в каждый свой массив.