Oracle参数与IN语句?得到一个我需要修改的#.net应用程序。目前的查询有效地做到了这一点:select*fromcontractwherecontractnum=:ContractNum(非常简化,只是为了表明我们正在使用=和一个参数)参数是从C#应用程序上的Settings.Settings文件中读取的,它包含一个字符串。我需要修改它以包含多个合同,所以我想我可以将SQL更改为:select*fromcontractwherecontractnumin(:ContractNum)但无论我如何格式化参数中的字符串,都不会返回任何内容。有没有办法让oracle做一个带参数的IN?任何帮助表示赞赏,谢谢大家。尚未找到支持评估包含逗号的单个字符串变量作为唯一IN子句分隔的数据库。您可以选择对变量进行子字符串化,以将逗号分隔的变量内容转换为一行,以便您可以加入该行。或者使用动态SQL,它是在执行语句之前在存储过程中构造为字符串的SQL语句。您可以使用流水线函数将字符串转换为可与IN运算符一起使用的表。例如(用10gR2测试):SQL>select*fromtable(demo_pkg.string_to_tab('i,j,k'));COLUMN_VALUE--------------ijk使用以下包:SQL>CREATEORREPLACEPACKAGEdemo_pkgIS2TYPEvarchar_tabISTABLEOFVARCHAR2(4000);3FUNCTIONstring_to_tab(p_stringVARCHAR2,4p_delimiterVARCHAR2DEFAULT',')5RETURNvarchar_tabPIPELINED;6结束demo_pkg;7/创建包SQL>CREATEORREPLACEPACKAGEBODYdemo_pkgIS2FUNCTIONstring_to_tab(p_stringVARCHAR2,3p_delimiterVARCHAR2DEFAULT',')4RETURNvarchar_tabPIPELINEDIS5l_stringVARCHAR2(4000):=p_string;6l_first_delimiterNUMBER:=instr(p_string,p_delimiter);7BEGIN8LOOP9IFnvl(l_first_delimiter,0)=0THEN10PIPEROW(l_string);11返回;12如果结束;13PIPEROW(substr(l_string,1,l_first_delimiter-1));14l_string:=substr(l_string,l_first_delimiter+1);15l_first_delimiter:=instr(l_string,p_delimiter);16结束循环;17结束;18结束demo_pkg;19/Packagebodycreated您的查询将如下所示:select*fromcontractwherecontractnumin(selectcolumn_valuefromtable(demo_pkg.string_to_tab(:ContractNum)))当您使用ODP.NET作为数据提供者时,您可以使用Oracle数字集合作为参数(绑定变量)这适用于Oracle服务器9、10或11和ODP.net版本>=11.1.0.6.20。当您使用Devart.NETDataProviderforOracle时,可以使用类似的解决方案。让我们选择合同编号为3和4的合同。我们必须使用Oracle类型将一组合同编号传输到我们的查询中。MDSYS.SDO_ELEM_INFO_ARRAY是因为如果我们使用这个已经预定义的Oracle类型,我们就不必定义我们自己的Oracle类型。您可以使用最多1048576个数字填充MDSYS.SDO_ELEM_INFO_ARRAY。使用Oracle.DataAccess.Client;使用Oracle.DataAccess.Types;[OracleCustomTypeMappingAttribute("MDSYS.SDO_ELEM_INFO_ARRAY")]publicclassNumberArrayFactory:IOracleArrayTypeFactory{publicArrayCreateArray(intnumElems){returnnewDecimal[numElems];}}publicArrayCreateStatusArray(intnumElems){返回空;}}privatevoidTest(){OracleConnectionStringBuilderb=newOracleConnectionStringBuilder();b.UserID="sna";b.密码=“sna”;b.DataSource="ora11";使用(OracleConnectionconn=newOracleConnection(b.ToString())){conn.Open();使用(OracleCommandcomm=conn.CreateCommand()){comm.CommandText=@"select/*+cardinality(tab10)*/c.*"+@"fromcontractc,table(:1)tab"+@"其中c.contractnum=tab.column_value";OracleParameterp=newOracleParameter();p.OracleDbType=OracleDbType.Array;p.Direction=ParameterDirection.Input;p.UdtTypeName="MDSYS.SDO_ELEM_INFO_ARRAY";//选择合约3和4p.Value=新十进制[]{3,4};comm.Parameters.Add(p);intnumContracts=0;使用(OracleDataReaderreader=comm.ExecuteReader()){while(reader.Read()){numContracts++;}}conn.Close();如果省略提示/*+cardinality(tab10)*/,则不使用contract.contractnum上的索引我假设contractnum是主键,因此该列将被索引。另请参阅:http://forums.oracle.com/forums/thread.jspa?messageID=3869879#3869879要在IN语句中使用参数,您可以使用此构造:select*fromcontractwherecontractnumin(selectcolumn_valuefromtable(:ContractNum))其中ContractNum是自定义数组类型。以上就是C#学习教程:OracleparameterswithINstatements?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
