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.
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;
/