Как использовать ассоциативный массив Oracle в запросе SQL - PullRequest
8 голосов
/ 11 ноября 2009

ODP.Net предоставляет возможность передавать ассоциативные массивы как параметры в хранимую процедуру Oracle из C #. Это хорошая возможность, если вы не пытаетесь использовать данные, содержащиеся в этом ассоциативном массиве, в 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;

Для целей этого примера "ассоциативный массив" представляет собой простую таблицу varchar2 (200), проиндексированную PLS_INTEGER. В C # параметр ассоциативного Arry заполняется строкой [].

Не стесняйтесь обсуждать другие способы сделать это помимо использования ассоциативного массива, но заранее знайте, что эти решения не будут приняты. Тем не менее, мне интересно увидеть другие варианты.

Ответы [ 2 ]

12 голосов
/ 11 ноября 2009

Я бы создал тип базы данных следующим образом:

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.)

1 голос
/ 08 августа 2017

Нельзя использовать ассоциативные массивы в области 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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...