Domanda

Ecco una versione semplificata di pseudo-codice di ciò che mi piacerebbe poter fare in PL-SQL (Oracle):

DECLARE
  mylist as ARRAY
BEGIN
  mylist (1) := '1'
  mylist (2) := '3'
  ...
  SELECT *
  FROM aTable
  WHERE aKey IN mylist;
END;

SELECT dovrebbe restituire i record corrispondenti per mylist (1), mylist (2) ecc. Dovrebbe essere simile a ORing tutti i valori, ma ovviamente non sappiamo in anticipo quanti valori otteniamo.

Come posso raggiungere questo obiettivo? So che PL / SQL ha alcuni tipi di dati di raccolta, ma non riesco a farli funzionare correttamente nelle istruzioni SQL.

Grazie per qualsiasi idea.

È stato utile?

Soluzione

Questo è facile da fare con la funzione TABLE () . L'unico problema è che la variabile array deve utilizzare un tipo dichiarato in SQL. Questo perché SELECT utilizza il motore SQL, quindi le dichiarazioni PL / SQL non rientrano nell'ambito.

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>

Altri suggerimenti

Un paio di suggerimenti:

1.) C'è una parola chiave CAST SQL che puoi fare che potrebbe fare il lavoro ... fa sì che la tua raccolta sia trattata come se fosse una tabella.

2.) Funzioni pipeline. Fondamentalmente una funzione restituisce dati che sembrano una tabella.

Questo link riassume le opzioni e contiene una serie di elenchi di codici che le spiegano.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top