如何在SQL查询中使用Oracle关联数组

Sco*_*her 8 sql oracle plsql associative-array odp.net

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;
Run Code Online (Sandbox Code Playgroud)

出于此示例的目的,"associativeArray"是由PLS_INTEGER索引的varchar2(200)的简单表.在C#中,associativeArry参数填充了字符串[].

除了使用关联数组之外,请随意讨论其他方法,但提前知道这些解决方案将不被接受.不过,我有兴趣看到其他选择.

Ton*_*ews 12

我会创建一个这样的数据库类型:

create type v2t as table of varchar2(30);
/
Run Code Online (Sandbox Code Playgroud)

然后在程序中:

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;
Run Code Online (Sandbox Code Playgroud)

(其中databaseArray声明为v2t类型.)

  • 令人惊讶的是,有多少例子在循环中使用关联数组来运行插入,但没有讨论或提供用于支持上下文切换问题的示例.希望这对其他人也有帮助. (4认同)