Arrays em Oracle SQL
Pergunta
Aqui está uma versão pseudo-código simplificado do que eu gostaria de ser capaz de fazer em PL-SQL (Oracle):
DECLARE
mylist as ARRAY
BEGIN
mylist (1) := '1'
mylist (2) := '3'
...
SELECT *
FROM aTable
WHERE aKey IN mylist;
END;
A instrução SELECT deve retornar os registros correspondentes para mylist (1), mylist (2) etc. Ele deve ser semelhante ao ORing todos os valores, mas é claro que não sabemos de antemão quantos valores que temos.
Como posso conseguir isso? Eu sei que PL / SQL tem alguns tipos de dados de cobrança, mas eu não consigo fazê-los funcionar adequadamente em instruções SQL.
Obrigado por todas as idéias.
Solução
Isso é fácil de fazer com a função TABLE()
. A um prendedor que é a variável de matriz deve usar um tipo declarado no SQL. Isso ocorre porque SELECT
usa o motor SQL, então declarações PL / SQL estão fora do escopo.
SQL> create or replace type numbers_nt as table of number
2 /
Type created.
SQL>
SQL> declare
2 l_array numbers_nt;
3 begin
4 l_array := numbers_nt (7521,7566,7654);
5 for r in ( select ename
6 from emp
7 where empno in ( select *
8 from table (l_array)
9 )
10 )
11 loop
12 dbms_output.put_line ( 'employee name = '||r.ename);
13 end loop;
14 end;
15 /
employee name = PADFIELD
employee name = ROBERTSON
employee name = BILLINGTON
PL/SQL procedure successfully completed.
SQL>
Outras dicas
Um par de sugestões:
1.) Há uma palavra-chave ELENCO SQL que você pode fazer que pode fazer o trabalho ... faz sua coleção ser tratada como se fosse uma tabela.
2.) Funções em pipeline. Basicamente uma função retorna dados que se parece com uma tabela.
Este link resume as opções e tem um número de listagens de código que os explicam.