web-dev-qa-db-fra.com

Comment puis-je utiliser une variable de tableau à l'intérieur de l'opérateur IN pour Oracle SQL?

Je déclare un type TYPE arr_type is TABLE of VARCHAR2(11 BYTE); puis je l'initialise: MY_array arr_type := arr_type();.

J'y insère quelques varchars, puis j'essaie de l'utiliser avec un opérateur IN.

set serveroutput on;
DECLARE
  TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
  my_array arr_type := arr_type();
  my_array_two arr_type := arr_type();
BEGIN 

  SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
  SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;

   FOR i IN 1..cm_array.COUNT LOOP
     DBMS_OUTPUT.PUT_LINE(my_array(i));
   END LOOP; 
END; 
/

J'obtiens l'erreur: local collection types not allowed in SQL statements Sur la ligne contenant: SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;, Mais cela n'a aucun sens car si je commente cette ligne, my_array S'imprime bien, ce qui signifie TYPE arr_type is TABLE of VARCHAR2(11 BYTE);.

Je soupçonne que le problème est dû au fait que j'essaie d'utiliser un tableau illimité avec l'opérateur IN, c'est-à-dire PARENT_ID IN my_array.

J'ai essayé de mettre la variable entre parenthèses, mais cela n'aide pas. Comment puis-je utiliser l'opérateur IN avec un tableau?

Je comprends que dans ce cas, je peux utiliser des sous-requêtes ou des jointures, mais je me demande s'il est possible d'utiliser un tableau avec un opérateur IN.

4
Abdul
WHERE PARENT_ID IN my_array;

Cela ne fonctionnera pas. Tout d'abord, comme l'indique le message d'erreur, vous n'êtes pas autorisé à utiliser des types de collection locaux dans les instructions SQL, vous devez les définir dans la base de données. Deuxièmement, cette syntaxe n'existe pas.

Vous définissez donc d'abord le type:

CREATE TYPE arr_type is TABLE of VARCHAR2(11 BYTE);

Et après cela, vous pouvez utiliser la collection avec la fonction TABLE() comme ci-dessous:

set serveroutput on;
DECLARE
  my_array arr_type := arr_type();
  my_array_two arr_type := arr_type();
BEGIN 

  SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
  SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST
  WHERE PARENT_ID IN (select * from table(my_array)); -- <==========================

   FOR i IN 1..cm_array.COUNT LOOP
     DBMS_OUTPUT.PUT_LINE(my_array(i));
   END LOOP; 
END; 
/
7
Balazs Papp