Passagem de parametros "java.util.List" para uma SP do oracle;

Estou utilizando o banco oracle, sem hibernate.
no banco possuo algumas stored procedures e faço chamadas a elas através do spring;

gostaria de saber se posso passar um objeto Java do tipo List como parâmetro para a Stored procedure?

Exemplo
class A {
int id;
String algumaCoisa;
…}

class B {
int id
String outraCoisa;
List elementos;
}

Atualmente, se eu for salvar o objeto do tipo B no banco, eu faço duas stored procedures, uma para inserir o item B (sem o List, somente com os tipos primários) e outra SP para incluir o “elementos”, essa segunda SP, eu chamo para cada item do “List elementos”;

repetindo : posso passar um objeto Java do tipo List como parâmetro para a Stored procedure? Derrepente exista alguma forma de eu passar um list como um cursor para o oracle.

Alguem sabe se tem como? ou pode me informar que NÃO tem como para eu deixar de procurar; :slight_smile:

Agradeço

Jefferson, as chamadas realizadas aqui nos projetos que tenho trabalhado passam os parâmetros com objetos primitivos. Nunca testei passando objetos. Veja se da forma que o colega abaixo citou funciona. Abraço.

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