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.

Foi útil?

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.

http://www.databasejournal.com/features/oracle/article.php/3352091/CASTing-About-For-a-Solution-Using-CAST-and-Table-Functions -in-PLSQL.htm

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top