Declaro um tipo TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
e inicializo-o: MY_array arr_type := arr_type();
.
Eu insiro alguns varchars nele e tento usá-lo com um operador 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;
/
Eu recebo o erro: local collection types not allowed in SQL statements
na linha que contém: SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;
, mas não faz sentido porque se eu comentar essa linha, my_array
imprime bem, o que significa TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
.
Eu suspeito que o problema é porque estou tentando usar uma matriz ilimitada com o operador IN, ou seja, PARENT_ID IN my_array
.
Eu tentei envolver a variável entre parênteses, mas não ajuda. Como posso usar o operador IN com uma matriz?
Entendo que neste caso posso usar subconsultas ou junções, mas gostaria de saber se é possível usar um array com um operador IN.
Isso não funcionará. Primeiro, como a mensagem de erro informa, você não tem permissão para usar tipos de coleta local em instruções SQL, você precisa defini-los no banco de dados. Segundo, essa sintaxe não existe.
Então, primeiro você define o tipo:
E depois disso, você pode usar a coleção com a
TABLE()
função abaixo: