Jefferson, td bem??
tem como passar sim (mas nao o List, propriamente dito), mas o metodo mais elegante, é atraves de um tipo especial chamado “Tipo Composto” na verdade é uma classe java que mapeia um tipo Oracle que voce criou!
Isso é possivel atravez do SQLJ+JPUB da Oracle (www.oracle.com)
é um procedimento meio trabalhoso mas vou tentar passar aqui
1 - FASE
1 - crie um tipo oracle que contera os atributos que iremos precisar
CREATE OR REPLACE TYPE SEUESQUEMA."TP_REGISTRO" as object
(
Id number(9),
nome varchar2(100)
)
/
2 - depois crie a colecao referente a esse tipo
CREATE OR REPLACE TYPE SEUESQUEMA."TP_COLECAO_REGISTROS" as table of SEUESQUEMA."TP_REGISTRO";
3 - Crie agora os tipos registro em PL/SQL em algum pacote criado por voce (ex: PCK_CONVERSAO).
type t_registro is record (
Id number(9),
nome varchar2(100)
);
type t_colecao_registros is table of t_registro index by binary_integer;
4 - agora faça a funcao para converter os tipos registro para tipo oracle
coloque dentro de um pacote chamado PCK_CONVERSAO
function t_registros2tp_registros(r t_registros)
return tp_registros is
begin
return tp_registros(
r.Id,
r.nome
);
end t_registros2tp_registros;
function tp_registro2t_registro(r tp_registro)
return t_registro is
res tp_registro;
begin
if r IS NOT NULL
then
res.id = r.id;
res.nome = r.nome;
end if;
return res;
end tp_registro2t_registro;
function t_colecao_reg2tp_reg (r t_colecao_registros)
return TP_COLECAO_REGISTROS is
tab TP_COLECAO_REGISTROS := TP_COLECAO_REGISTROS();
begin
FOR i IN 1..r.LAST LOOP
tab.extend(1);
tab(i) := t_registros2tp_registros(r(i));
END LOOP;
return tab;
end t_colecao_reg2tp_reg;
function tp_reg2t_colecao_reg (r tp_colecao_registros)
return T_COLECAO_REGISTROS is
res T_COLECAO_REGISTROS;
begin
FOR i IN 1..r.LAST LOOP
res(i) := tp_registro2t_registro(r(i));
END LOOP;
return res;
end tp_reg2t_colecao_reg;
2 - FASE
Agora voce deve utilizar o JPUB e depois o SQLJ mais ou menos assim…
Obs: Para utilizar os dois programas o CLASSPATH da sua maquina deve estar com as LIBS Oracle para conecatr ao banco
1 - crie em um diretorio seu (ex: c:/desenvolvimento/) um arquivo chamado jpub.properties
jpub.url=jdbc:oracle:thin:@IPBANCO:1521:SIDBANCO
jpub.user=USUARIOBANCO/SENHA
jpub.sql=SEUESQUEMA.NOMEDAPROCEDURE:NomeDaProcedureNoJava
jpub.sql=tp_colecao_registros:ColecaoRegistros
jpub.sql=tp_registro:Registro
jpub.addtypemap=DATE:java.sql.Date
##trecho onde adicionamos as conversoes
jpub.addtypemap=SEUESQUEMA.PCK_CONVERSAO.t_registro:\
SEU_PACOTE_JAVA.Registro:\
tp_registro:\
pck_conversao.tp_registro2t_registro:\
pck_conversao.t_registros2tp_registros
jpub.addtypemap=SEUESQUEMA.PCK_CONVERSAO.t_colecao_registros:\
SEU_PACOTE_JAVA.ColecaoRegistros:\
tp_colecao_registros:\
pck_conversao.tp_reg2t_colecao_reg :\
pck_conversao.t_colecao_reg2tp_reg
2 - execute o comando abaixo no Prompt de Comando dentro do diretorio onde esta o jpub.properties
jpub -props=jpub.properties
3 - ele ira criar no diretorio um arquivo chamado "NomeDaProcedureNoJava.sqlj"
agora so rodar o comando
sqlj NomeDaProcedureNoJava.sqlj
ele ira gerar 3 arquivos no final:
ColecaoRegistros.java (classe referente a colecao de objetos do tipo Registro)
Registro.java(classe contendo atributos)
NomeDaProcedureNoJava.java (Classe que mapeia a procedure do seu banco)
ai so utilizar a classe “NomeDaProcedureNoJava” na sua aplicacao passando uma instancia de “ColecaoRegistros” no parametro nescessario contem objetos do tipo “Registro”".
Ou caso de muito trabalho… cria duas procedures mesmo… =P
uma que executa o principal , e os registros filhos em outra procedure passando o codigo de chave primaria da principal…
abraço