Il tipo di matrice SQL non è necessario. Non se il tipo di elemento è primitivo. (Varchar, numero, data, ...)
campione molto semplice:
declare
type TPidmList is table of sgbstdn.sgbstdn_pidm%type;
pidms TPidmList;
begin
select distinct sgbstdn_pidm
bulk collect into pidms
from sgbstdn
where sgbstdn_majr_code_1 = 'HS04'
and sgbstdn_program_1 = 'HSCOMPH';
-- do something with pidms
open :someCursor for
select value(t) pidm
from table(pidms) t;
end;
Quando si desidera riutilizzarlo, allora potrebbe essere interessante sapere come sarebbe simile. Se si emettono più comandi di quelli che potrebbero essere raggruppati in un pacchetto. Il trucco della variabile del pacchetto privato dall'alto ha i suoi lati negativi. Quando si aggiungono le variabili a un pacchetto, gli si fornisce lo stato e ora non si comporta come un gruppo di funzioni senza stato ma come una sorta di strana istanza di un oggetto Singleton.
ad es. Quando ricompili il corpo, solleverà eccezioni nelle sessioni che lo hanno già usato in precedenza.(perché i valori delle variabili sono stati invalidati)
Tuttavia, è possibile dichiarare il tipo in un pacchetto (o globalmente in sql) e utilizzarlo come parametro in metodi che dovrebbero utilizzarlo.
create package Abc as
type TPidmList is table of sgbstdn.sgbstdn_pidm%type;
function CreateList(majorCode in Varchar,
program in Varchar) return TPidmList;
function Test1(list in TPidmList) return PLS_Integer;
-- "in" to make it immutable so that PL/SQL can pass a pointer instead of a copy
procedure Test2(list in TPidmList);
end;
create package body Abc as
function CreateList(majorCode in Varchar,
program in Varchar) return TPidmList is
result TPidmList;
begin
select distinct sgbstdn_pidm
bulk collect into result
from sgbstdn
where sgbstdn_majr_code_1 = majorCode
and sgbstdn_program_1 = program;
return result;
end;
function Test1(list in TPidmList) return PLS_Integer is
result PLS_Integer := 0;
begin
if list is null or list.Count = 0 then
return result;
end if;
for i in list.First .. list.Last loop
if ... then
result := result + list(i);
end if;
end loop;
end;
procedure Test2(list in TPidmList) as
begin
...
end;
return result;
end;
Come chiamarlo:
declare
pidms constant Abc.TPidmList := Abc.CreateList('HS04', 'HSCOMPH');
xyz PLS_Integer;
begin
Abc.Test2(pidms);
xyz := Abc.Test1(pidms);
...
open :someCursor for
select value(t) as Pidm,
xyz as SomeValue
from table(pidms) t;
end;
fonte
2009-10-19 23:10:32
Um ... quale problema stai cercando di risolvere qui? Perché non esegui solo una selezione? –
I valori che ho memorizzato nella tabella dei pidm verranno riutilizzati più volte in seguito durante l'elaborazione. I valori stessi richiedono un po 'di tempo per uscire dal database e quindi ho voluto memorizzarli in una posizione intermedia. Sto solo avendo problemi a recuperare i valori una volta che li ho inseriti ... –