Question

ODP.Net expose la capacité de passer des tableaux Associatif comme params dans une procédure stockée Oracle de C #. C'est une fonctionnalité intéressante, sauf si vous essayez d'utiliser les données contenues dans ce tableau associatif dans une requête SQL.

La raison est qu'il nécessite un changement de contexte - des instructions SQL et SQL types nécessitent un tableau associatif passé dans PL / SQL comme celui-ci est en fait défini comme un type PL / SQL. Je crois que tous les types définis dans un package PL / SQL / procédure / fonction des types PL / SQL en un type créé en dehors de ces objets est un type SQL (si vous pouvez fournir plus de clarté à ce sujet, s'il vous plaît faire, mais ce ne est pas le but de ce question).

Alors, la question est, quelles sont les méthodes que vous utilisez pour convertir le tableau associatif PL / SQL en quelque chose qui param au sein de la procédure peut être utilisée dans une instruction SQL comme ceci:

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

Aux fins de cet exemple, le « tableau associatif » est une simple table de varchar2 (200) indexé par PLS_INTEGER. En C #, le param associativeArry est remplie avec une chaîne [].

Sentez-vous libre de discuter d'autres façons de le faire en plus d'utiliser un tableau associatif mais savoir à l'avance ces solutions ne seront pas acceptées. Pourtant, je suis intéressé à voir d'autres options.

Était-ce utile?

La solution

Je voudrais créer un type de base de données comme ceci:

create type v2t as table of varchar2(30);
/

Et puis dans la procédure:

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;

(où databaseArray est déclaré comme étant de type V2T).

Autres conseils

Vous ne pouvez pas utiliser des tableaux associatifs dans le champ SQL - ils ne sont utilisables que dans le champ d'application PL / SQL

.

Une méthode consiste à cartographier le tableau associatif à une collection (qui peut être utilisé dans le champ SQL si le type de collection a été défini dans le champ d'application SQL et non la portée 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;
/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top