ODP.Net暴露传递关联数组作为PARAMS成从C#Oracle存储过程的能力。它是一个不错的功能,除非你要使用包含在该关联数组中的数据的SQL查询。

这样做的原因是,它需要一个历境切换 - SQL语句需要实际上定义为PL / SQL类型SQL类型并进入这样的PL / SQL关联数组。我相信,一个PL / SQL包/过程/函数中定义的任何类型的PL / SQL类型,而这些对象外创建的类型是SQL类型(如果你能提供更清晰,请做,但它不是这样的目标问题)。

所以,问题是,什么是你会用的PL / SQL关联数组PARAM转换到的东西,在过程中可以在SQL语句中使用这样的方法:

OPEN refCursor FOR
SELECT T.*
FROM   SOME_TABLE T,
       ( SELECT COLUMN_VALUE V
         FROM   TABLE( associativeArray )
       ) T2
WHERE  T.NAME = T2.V;

有关本实施例的目的,“关联数组”是由PLS_INTEGER索引VARCHAR2(200)的一个简单的表。在C#中,associativeArry PARAM填充了一个串[]。

随时讨论这样做的其他方式除了使用关联数组,但事先知道这些解决方案将不被接受。不过,我希望看到其他的选择。

有帮助吗?

解决方案

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

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的。)

其他提示

您不能在SQL范围使用关联数组 - 它们只在PL / SQL范围可用

一种方法是将关联数组到集合(其可以在SQL范围如果集合类型已经在SQL范围被定义,而不是PL / SQL范围内使用)进行映射。

<强> SQL

CREATE TYPE VARCHAR2_200_Array_Type AS TABLE OF VARCHAR2(200);
/

<强> PL / SQL

DECLARE
  TYPE associativeArrayType IS TABLE OF VARCHAR2(200) INDEX BY PLS_INTEGER;
  i                PLS_INTEGER;
  associativeArray associativeArrayType;
  array            VARCHAR2_200_Array_Type;
  cur              SYS_REFCURSOR;
BEGIN
  -- Sample data in the (sparse) associative array
  associativeArray(-2) := 'Test 1';
  associativeArray(0)  := 'Test 2';
  associativeArray(7)  := 'Test 3';

  -- Initialise the collection
  array := VARCHAR2_200_Array_Type();

  -- Loop through the associative array
  i := associativeArray.FIRST;
  WHILE i IS NOT NULL LOOP
    array.EXTEND(1);
    array(array.COUNT) := associativeArray(i);
    i := associativeArray.NEXT(i);
  END LOOP;

  -- Use the collection in a query
  OPEN cur FOR
    SELECT *
    FROM   your_table
    WHERE  your_column MEMBER OF array;
END;
/
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top