有幾種方法可以用來搜索「列表中的變量」。利用綁定參數。
這是基於這樣的: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:210612357425
坦白說,我試着儘可能多,如果不只是爲提高性能,但出於安全的其他級別使用綁定變量。
雖然有很多方法對皮膚一隻貓,這(而詳細)應該做
在甲骨文 --create你的類型 創建或替換型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;
現在ammend查詢在.NET
col4 in (select COLUMN_VALUE from table(in_varchar(:idArray)))
(順便說一句我複製大多數代碼從以前的帖子我在Oracle論壇上回答: http://forums.oracle.com/forums/thread.jspa?messageID=4299793�
這實際上使它所以你不必使用數組綁定,只要確保這是一個逗號分隔的字符串::idArray =「A,B,C」
另一個op重刑是對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
您可以使用完全相同的邏輯,只是有列返回到每個各自爲陣。
您是否找到解決方案? – aggsol 2015-04-27 09:56:38
我不認爲我們曾經這樣做過。我記得我們用硬編碼的方式編碼... – MonkeyWrench 2015-06-09 19:43:07
根據這個問題,http:// stackoverflow。com/questions/25401787/c-odp-net-large-in-clause-workaround,請參閱Tyree Jackson的評論「例如,ArrayBindCount的使用受Oracle限制僅用於ExecuteNonQuery(更新/插入/刪除)語句「。我無法從Oracle文檔中確認這一點,但這也是我的經驗。 – VinceJS 2016-09-26 13:33:00