在SELECT IN中使用Oracle参数的问题

agh*_*aux 4 c# sql oracle parameters ora-01722

在sql查询中插入一串数字时遇到问题

  SELECT * 
    FROM tablename a 
   WHERE a.flokkurid IN (3857,3858,3863,3285) 
ORDER BY sjodategund, rodun 
Run Code Online (Sandbox Code Playgroud)

...要么:

  SELECT * 
    FROM tablename a 
   WHERE a.flokkurid IN (:strManyNumbers) 
ORDER BY sjodategund, rodun 
Run Code Online (Sandbox Code Playgroud)

...使用此代码:

using (OracleCommand sel = new OracleCommand(SQL, connectionstring)) {
  sel.Parameters.Add(":strManyNumbers", 
                      OracleDbType.Varchar2, 
                      "Client",
                      ParameterDirection.Input);
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我运行此查询,我得到:

ORA-01722:无效的号码

但如果我只插入一个数字,即"3857",它将返回查询确定数据.

Cod*_*odo 6

要传递一组值,您需要使用Oracle的表或数组类型.

首先,您创建一个表类型(例如,对于NUMBER):

CREATE TYPE number_table AS TABLE OF NUMBER; 
Run Code Online (Sandbox Code Playgroud)

为查询创建参数时,将其声明为关联的PL/SQL数组:

OracleParameter param1 = new OracleParameter(); 
param1.OracleDbType = OracleDbType.Int32; 
param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
Run Code Online (Sandbox Code Playgroud)

然后分配一些值:

param1 = new int[] { 3857, 3858, 3863, 3285 }; 
Run Code Online (Sandbox Code Playgroud)

你的查询需要一个演员:

SELECT * FROM tablename a 
where a.flokkurid in (TABLE(CAST(:manyNumbers AS number_table)))
order by sjodategund, rodun 
Run Code Online (Sandbox Code Playgroud)