El SQL tipo de matriz no es necesario. No si el tipo de elemento es primitivo. (Varchar, número, fecha, ...)
ejemplo muy básico:
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;
Cuando desee volver a utilizarlo, entonces podría ser interesante saber cómo se vería así. Si emite varios comandos, estos se pueden agrupar en un paquete. El truco de variable de paquete privado de arriba tiene sus desventajas. Cuando agrega variables a un paquete, le da el estado y ahora no actúa como un conjunto de funciones sin estado, sino como un tipo extraño de instancia de objeto singleton en su lugar.
p. Ej. Cuando recompila el cuerpo, levantará excepciones en sesiones que ya lo usaron antes.(porque los valores de la variable se invalidaron)
Sin embargo, puede declarar el tipo en un paquete (o globalmente en sql) y usarlo como un parámetro en los métodos que deben usarlo.
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;
cómo llamarlo:
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 ... ¿qué problema está tratando de resolver aquí? ¿Por qué no solo ejecutas un seleccionar? –
Los valores que he almacenado en la tabla de pidms van a ser reutilizados varias veces más tarde en mi procesamiento. Los valores en sí tardan un poco en salir de la base de datos, por lo que quería almacenarlos en una ubicación intermedia. Solo estoy teniendo problemas para recuperar los valores una vez que los puse en ... –