OracleParameter和IN子句有没有办法使用System.Data.OracleClient给IN子句添加参数。例如:stringquery="SELECT*FROMTableNameWHEREUserNameIN(:Pram)";OracleCommand命令=newOracleCommand(query,conn);command.Parameters.Add(":Pram",OracleType.VarChar).Value="'Ben','Sam'";使用ODP.NET可以更轻松地做到这一点:在数据库中创建一个TABLE类型:CREATETYPEt_varchar2ASTABLEOFVARCHAR2(4000);创建集合参数:OracleParameterparam=newOracleParameter();param.OracleDbType=OracleDbType.Varchar2;param.CollectionType=OracleCollectionType.PLSQLAssociativeArray;填写参数:param=newstring[2]{"Ben","Sam"};将参数绑定到以下查询:SELECT*FROMTableNameWHEREUserNameIN(TABLE(CAST(:paramASt_varchar2)));您可以将其包装在OracleCommandExtension方法中:变量计数器=0;varcollectionParams=newStringBuilder(":");foreach(varobjincollection){varparam=名称+计数器;collectionParams.Append(参数);collectionParams.Append(",:");oraParams.Add(newOracleParameter(param,type){Value=obj});计数器++;}collectionParams.Remove(collectionParams.Length-3,3);command.CommandText=command.CommandText.Replace(":"+name,collectionParams.ToString());命令.Parameters.AddRange(oraParams.ToArray());返回命令;我知道这是前一段时间被问到的,但不是一个很好的答案我会做这样的事情-请原谅粗糙的psudo代码字符串args[]={'Ben','Sam'};字符串绑定列表="";for(intii=0;ii所以查询以(:1,:2)结束,并且分别绑定。这里有一个类似的问题:Oracle/c#:HowdoIusebindvariablesandselectstatementtoreturn多个记录?老问题,但我想分享我的代码。只是创建一个字符串的简单方法,该字符串可以连接到动态生成的sql而不会丢失绑定参数的性能和安全性://////1-给定一个int数组,为每个数组创建一个OracleParameter并分配值,uniquenamedusinguniqueParName///2-将创建的OracleParameter插入到引用列表中。///3-返回一个字符串,用于连接到主SQL///////////////privatestaticstringInsertParameters(refListorclParameters,int[]lsIds,stringuniqueParName){字符串strParameters=string.Empty;for(inti=0;i并像这样使用:ListparameterList=newList();int[]idAr=newint[]{1,2,3,4};stringidStr=InsertParameters(refparameterList,idAr,"idTest");stringSQL="SELECTnameFROMtblTestWHEREidTestin("+idStr+")";您可以使用Oracle自定义数据类型,如下所示:http://www.c-sharpcorner.com/code/2191/pass-collection-to-oracle-stored-procedure-from-net-layer.aspx和这里:https://stackoverflow.com/a/31466114/1867157首先在Oracle中创建一个类型并赋予它权限:CREATETYPEMYSCHEMA.VARCHAR2_TAB_T作为VARCHAR2的表(4000);GRANTEXECUTEONMYSCHEMA.VARCHAR2_TAB_TTOMYROLE然后创建2个类:StringListCustomType.cspublicclassStringListCustomType:IOracleCustomType,INullable{publicconststringName="MYSCHEMA.VARCHAR2_TAB_T";[OracleArrayMapping()]publicstring[]数组;#regionIOracleCustomTypepublicOracleUdtStatus[]StatusArray{get;放;}publicvoidToCustomObject(OracleConnectioncon,IntPtrpUdt){objectobjectStatusArray=null;Array=(string[])OracleUdt.GetValue(con,pUdt,0,outobjectStatusArray);StatusArray=(OracleUdtStatus[])objectStatusArray;}publicvoidFromCustomObject(OracleConnectioncon,IntPtrpUdt){OracleUdt.SetValue(con,pUdt,0,Array,StatusArray);}#endregion#regionINullablepublicboolIsNull{get;放;}publicstaticStringListCustomTypeNull{get{StringListCustomTypeobj=newStringListCustomType();obj.IsNull=true;返回对象;}}#endregion}StringListCustomTypeFactory.cs[OracleCustomTypeMapping(StringListCustomType.Name)]publicclassStringListCustomTypeFactory:IOracleCustomTypeFactory,IOracleArrayTypeFactory{#regionIOracleCustomTypeFactoryIOracleCustomTypeIOracleCustomTypeFactory.CreateObject(){返回新的StringListCustomType();}#endregion#regionIOracleArrayTypeFactory数组IOracleArrayTypeFactory.CreateArray(intnumElems){返回新字符串[numElems];}ArrayIOracleArrayTypeFactory.CreateStatusArray(intnumElems){返回新的OracleUdtStatus[numElems];}#endregion}然后你可以添加这样的参数:dbParameter=newOracleParameter();dbParameter.ParameterName="我的参数名";dbParameter.UdtTypeName=StringListCustomType.Name;dbParameter.OracleDbType=OracleDbType.Array;if(myarray!=null){StringListCustomTypenewArray=newStringListCustomType();newArray.Array=myarray;dbParameter.Value}else{dbParameter.Value=StringListCustomType.Null;}您的查询将如下所示:SELECT*FROMMYSCHEMA.MYTABLEWHEREMYVARCHARFIELDIN(SELECTCOLUMN_VALUEFROMTABLE(CAST(:myparamnameASMYSCHEMA.VARCHAR2_TAB_T)))然后你的查询将是:SELECT*FROMTableNameWHEREUserNameIN('''Ben'',''Sam''');这两个名称将作为单个值输入请查看asktom.oracle.com上的这篇文章,了解如何获取动态列表。http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:210612357425在ORACLE中很简单。步骤如下:1.在oracle中创建默认类型CREATEORREPLACETYPEt_varchar_tabASTABLEOFVARCHAR2(4000);2.在oracle中创建一个函数,将"a,b,c"之类的字符串分隔为"a','b','c"l_textVARCHAR2(32767):=p_in_list||',';l_idx号码;开始循环=l_idx:INSTR(l_text,',');当NVL(l_idx,0)=0时退出;l_tab.extend;l_tab(l_tab.last):=TRIM(SUBSTR(l_text,1,l_idx-1));l_text:=SUBSTR(l_text,l_idx+1);结束循环;返回l_tab;结尾;3:然后使用下面的查询从表中提取数据SELECT*FROMTABLE_NAMEEMPWHEREIN(SELECT*FROMTABLE(in_list(i_input1)));4.输入参数从c#.net传递到oracleSP,如cmd.Parameters.Add("i_input1",OracleType.VarChar,50).Value="S1,S2";我在搜索同样的问题时遇到了它,所以我想添加一个我觉得有用的答案,因为我不相信上面的内容实际上实现了它:http://forums.asp.net/t/1195359.aspx/1?Using%20bind%20variable%20with%20an%20IN%20clause我将在此处添加答案以防链接失效:回复:将绑定变量与IN子句一起使用2007年12月17日下午06:56|LINK您必须单独添加每个值这种情况(在Mac上写,所以我无法测试)stringsql="selectid,client_idasClientID,acct_nbrasAcctNbrfromacctwhereacct_nbrin(%params%)";OracleConnectionconn=newOracleConnection(DBConnection);OracleCommandcmd=newOracleCommand();列表参数=新列表();foreach(AcctNbrs.Split(',')中的字符串acctNbr){字符串paramName=":acctNbr"+params.Count.Tostring();params.Add(paramName)OracleParameterparms=newOracleParameter(paramName,OracleType.VarChar);parms.Value=acctNbr;cmd.Parameters.Add(参数);}cmd.CommandType=CommandType.Text;cmd.CommandText=sql.Replace("%params%",params.ToArray().Join(","));cmd.Connection=conn;OracleDataAdapterda=newOracleDataAdapter(cmd);da.Fill(ds);SELECT*FROMClientsWHEREidIN(SELECTtrim(regexp_substr(str,'[^,]+',1,level))strRowsFROM(SELECT:Pramasstrfromdual)tCONNECTBYinstr(str,',',1,等级-1)>0);也可能使用不同的方法SELECT*FROMSCOTT.EMPWHEREEMPNOIN(SELECTTO_NUMBER(X.COLUMN_VALUE)FROMXMLTABLE('7788,7900')X);或SELECT*FROMSCOTT.EMPWHEREENAMEIN(SELECTX.COLUMN_VALUE.GETSTRINGVAL()FROMXMLTABLE('"SCOTT","JAMES"')X);其中XMLTABLE的内容可以是单个参数,因此它应该可以在任何语言中使用。解决方案不应包含逗号字符或单引号、双引号。我建议您使用临时表,然后从中进行选择。使用常规命令参数填充临时表。其实我也会试试这段代码:以上就是C#学习教程分享的全部内容:OracleParameter和IN子句。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注---stringquery="SELECT*FROMTableNameWHEREUserNameIN(:Pram)";param=newstring[2]{"Ben","Sam"};OracleCommand命令=newOracleCommand(query,conn);command.ArrayBindCount=参数.Length;命令.Parameters.Add(":Pram",OracleType.VarChar).Value=param;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
