ODP.Net公开了将关联数组作为参数从C#传递到Oracle存储过程的能力.除非您尝试在SQL查询中使用该关联数组中包含的数据,否则它是一个很好的功能.
原因是它需要上下文切换 – sql语句需要sql类型,并且传递到PL / sql的关联数组实际上定义为PL / sql类型.我相信在PL / sql包/过程/函数中定义的任何类型都是PL / sql类型,而在这些对象之外创建的类型是sql类型(如果你能提供更清晰的那些,请做但不是它的目标)题).
所以,问题是,您将使用什么方法将PL / sql关联数组参数转换为过程中可以在sql语句中使用的方法,如下所示:
OPEN refCursor FOR SELECT T.* FROM SOME_TABLE T,( SELECT COLUMN_VALUE V FROM TABLE( associativeArray ) ) T2 WHERE T.NAME = T2.V;
出于此示例的目的,“associativeArray”是由PLS_INTEGER索引的varchar2(200)的简单表.在C#中,associativeArry参数填充了字符串[].
解决方法
我会创建一个这样的数据库类型:
create type v2t as table of varchar2(30); /
然后在程序中:
FOR i IN 1..associativeArray.COUNT LOOP databaseArray.extend(1); databaseArray(i) := associativeArray(i); END LOOP; OPEN refCursor FOR SELECT T.* FROM SOME_TABLE T,( SELECT COLUMN_VALUE V FROM TABLE( databaseArray ) ) T2 WHERE T.NAME = T2.V;
(其中databaseArray声明为v2t类型.)