Executar procedure com PreparedStatement

4 respostas
F

Olá

Há alguma forma para executar uma procedure com PreparedStatement e recuperar os parametros de out dessa procedure?

Eu preciso executar uma instrução SQL similar a essa:

DECLARE
     valores(i).valor1 pac_tipos.tipo_valor := 'A';
     valores(i).valor2 pac_tipos.tipo_valor := 'B';
     retorno varchar2(1000); -- parametro de out
BEGIN
     pro_atualizar(valores, retorno);
END;

Se eu executar esse SQL com o executeQuery() vai funcionar mas o problema é pegar o conteudo da variavel retorno.
Usando CallableStatement o problema seria inputar a variavel valores que é um TYPE table of.

Obrigado

4 Respostas

F

Eu não entendi muito bem, de qualquer forma, não seria algo mais ou menos assim:

CallableStatement call = myConn.prepareCall("EXEC PROC_XPTO(?,?)");
call.setInt(1, codigo);
call.registerOutParameter(2, java.sql.types.VARCHAR);

call.execute();

String x = call.get(2);
M

furutani:
Se eu executar esse SQL com o executeQuery() vai funcionar mas o problema é pegar o conteudo da variavel retorno.
Usando CallableStatement o problema seria inputar a variavel valores que é um TYPE table of.

e ae…

o Type ARRAY não resolve?!

Eu faço com CallableStatement e parece que não resolve seu caso.
Se sua variável valores for finita, será que vc não terá que passar valor a valor pra procedure?!

F

Olá

O problema é o type que esta dentro de uma package, se estivesse fora funcionaria.
Esse problema de array com oracle eu relatei nesse post http://www.guj.com.br/posts/list/63334.java.

Obrigado

F

Olá

O problema foi resolvido dessa forma.
public void executarProTeste() {
        Connection con = getJDBCConnection();

        StringBuilder sb = new StringBuilder();

        sb.append("DECLARE                                         ");
        sb.append("  v_nome  varchar2(20) := 'ROBERTO';            ");
        sb.append("  v_snome varchar2(20) := 'FURUTANI';           ");
        sb.append("BEGIN                                           ");
        sb.append("  pro_teste(v_nome, v_snome, ?);                ");
        sb.append("                                                ");
        sb.append("END;");

        try {
            CallableStatement cs = con.prepareCall(sb.toString());

            cs.registerOutParameter(1, Types.VARCHAR);

            cs.execute();

            System.out.println(cs.getString(1));

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
procedure PRO_TESTE(i_nome      in  varchar2,
                    i_sobrenome in  varchar2,
                    o_retorno   out varchar2) is
begin
  o_retorno := 'Nome completo: ' || i_nome || ' ' || i_sobrenome;

exception when others then
  o_retorno := 'ERRO - ' || sqlerrm;

end PRO_TESTE;
Criado 7 de novembro de 2007
Ultima resposta 8 de nov. de 2007
Respostas 4
Participantes 3