将C#中的整数列表传递到Oracle存储过程中

Dee*_*pak 2 c# sql oracle stored-procedures

我有一个oracle存储过程,该存储过程使用以下语句更新表。

update boxes 
set    location = 'some value'
where  boxid = passed value
Run Code Online (Sandbox Code Playgroud)

我有一个页面,用户可以选择100多个框并用新的位置值更新它们。当前,我必须调用存储过程100次以上以更新每个框(通过每次传递一个boxid)。

我想知道如何将Boxid列表从中传递C#到存储过程中,这样我就只能调用存储过程一次。

我希望在update语句中使用where in(boxids)种where子句。

请让我知道如何实现这一目标。提前致谢!

Pan*_*vos 5

Oracle允许您将值的数组作为参数传递。从这个SO问题以及这个问题中借用,您可以定义如下INT_ARRAY类型:

create or replace type CHAR_ARRAY as table of INTEGER;
Run Code Online (Sandbox Code Playgroud)

然后将您的存储过程定义为:

CREATE OR REPLACE PROCEDURE product_search(
        ...
        myIds IN CHAR_ARRAY,
        ...)
AS  
    SELECT ...
    ...
    WHERE SomeIdField IN (Select column_value FROM TABLE(myIds))
    ...
Run Code Online (Sandbox Code Playgroud)

然后,可以通过如下设置OracleParameter.CollectionType属性来传递值列表:

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