SQL typu tablica nie jest konieczne. Nie, jeśli typ elementu jest prymitywny. (Varchar, numer, data, ...)
Bardzo prosty przykład:
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;
Gdy chcesz go ponownie użyć, to może być interesujące wiedzieć, jak to będzie wyglądać. Jeśli wydasz kilka poleceń, które mogą zostać zgrupowane w pakiecie. Sztuczna sztuczka pakietu z powyższej listy ma swoje wady. Gdy dodajesz zmienne do pakietu, nadajesz mu stan, a teraz nie działa on jako bezpaństwowy zestaw funkcji, ale zamiast tego jest jakaś dziwna instancja typu singleton.
np. Gdy przekompilujesz ciało, spowoduje to podniesienie wyjątków w sesjach, które już go używały.(ponieważ zmienne wartości zostały unieruchomione)
Można jednak zadeklarować typ w pakiecie (lub globalnie w sql) i użyć go jako parametru w metodach, które powinny z niego korzystać.
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;
Jak nazwać:
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;
Um ... Jaki problem należy próbują rozwiązać tutaj? Dlaczego po prostu nie wybierzesz? –
Wartości, które zapisałem w tabeli pidms, zostaną ponownie wykorzystane wielokrotnie podczas przetwarzania. Same wartości zabierają trochę czasu, aby wydostać się z bazy danych, dlatego chciałem przechowywać je w pośredniej lokalizacji. Mam problem z odzyskaniem wartości po ich wprowadzeniu ... –