Java / Oracle

10 respostas
D

Pessoal, estou com uma dúvida, tenho que executar uma procedure que me retorna um cursor e não estou conseguindo fazer isso.

Alguém tem alguma dica?

Grato

10 Respostas

K

procedure ñ te retorna nada o que te retorna é a function pode estar ai o seu erro.

D

Pessoal, vê se vocês podem me ajudar.

Tenho a seguinte procedure:

PROCEDURE IDENT_BASE01
Argument Name Type In/Out Default?


TIPO NUMBER IN
DADO_CONTA CHAR IN
RESULTADO REF CURSOR IN/OUT

Repare bem que é um REF CURSOR, tenho que pegar o resultado dele passando os parâmetros.

Fiz da seguinte forma:

CallableStatement cs = con.prepareCall("{call IDENT_BASE01(1,'Márcio',null)}");
        cs.setString(1, "Entrou"); 
        cs.registerOutParameter(2,java.sql.Types.VARCHAR); 
        cs.executeQuery(); 

        cs.getString(2);

Só que deu o seguinte erro dizendo que o valor do parâmetro não pode ser nulo

java.sql.SQLException: ORA-06550: line 1, column 61:
PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter
ORA-06550: line 1, column 61:
PLS-00363: expression ’ NULL’ cannot be used as an assignment target
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

No caso do 3º parâmetro é o resultado e não tenho o que passar nele.

Sei que tem um jeito de fazer isso, só que não estou sabendo como.

Pelo SQL_PLUS eu consegui fazer da seguinte maneira:

SQL> declare

2  TYPE cat_cv IS REF CURSOR;

3  mar cat_cv;

4  begin

5  EBT_TELACORE_CAT.EBT_TELACORE_IDENT_BASE01(4,Marcio,mar);

6  end;

7  /

Grato…

V

tente isto…

String mensagem = "";

CallableStatement cstmt= conn.getConnection().prepareCall("{ CALL procedure_teste(?,?,?) }");

        cstmt.setString(1, 'teste');
        cstmt.setInt(2, 123456);
        cstmt.registerOutParameter(3,Types.VARCHAR);
        cstmt.execute(); 

    if( cstmt.getString(3) == null){    
         mensagem =  cstmt.getString(3) ;

   }
D
"vansol":
tente isto...
String mensagem = "";

CallableStatement cstmt= conn.getConnection().prepareCall("{ CALL procedure_teste(?,?,?) }");

        cstmt.setString(1, 'teste');
        cstmt.setInt(2, 123456);
        cstmt.registerOutParameter(3,Types.VARCHAR);
        cstmt.execute(); 

    if( cstmt.getString(3) == null){    
         mensagem =  cstmt.getString(3) ;

   }

Amigo, mais o que exatamete eu colocaria aqui nesse parâmetro:
CallableStatement cstmt= conn.getConnection().prepareCall("{ CALL procedure_teste(?,?,?) }");

está dando erro exatamente nessa linha.

D

Fiz assim agora

CallableStatement cs = con.prepareCall("{call IDENT_BASE01()}");
        cs.setInt(1, 4);
        cs.setString(2, "Marcio");
        cs.registerOutParameter(3,java.sql.Types.VARCHAR);
        cs.executeQuery();

E me retorna o seguinte erro:
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to IDENT_BAS
E01’
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Alguém pode me ajudar por favor, estou desesperado tentando resolver isso…

Grato.

V
CallableStatement cstmt= conn.getConnection().prepareCall("{ CALL procedure_teste(?,?,?) }");

… Cada interrogação da procedure representa os parâmetros da sua procedure, inclusive o parâmetro OUT. Se na sua procedure tivesse cinco parâmetros você teria que colocar cinco interrogações …

cstmt.setString(1, 'teste'); 
 cstmt.setInt(2, 123456); 
 cstmt.registerOutParameter(3,Types.VARCHAR); 
 cstmt.execute();

Você deve atribuir os valores de cada parâmetro IN que sua produre tem através dos métodos SET do seu método CallableStatement, na ordem dos parâmetros de sua procedure, ou seja, se o seu primeiro parâmetro é um varchar você deve usar o método setString , o segundo é um number então eu uso o setInt, o meu terceiro parâmetro é um OUT então eu uso cstmt.registerOutParameter, o valor 3 dele significa que ele é o terceiro parâmetro da procedure, logo após eu informo que ele vai me retornar um Varchar.

… Use cstmt.execute(); para executar a procedure e não cstmt.executeQuery();

D

“vansol”:
CallableStatement cstmt= conn.getConnection().prepareCall("{ CALL procedure_teste(?,?,?) }");

… Cada interrogação da procedure representa os parâmetros da sua procedure, inclusive o parâmetro OUT. Se na sua procedure tivesse cinco parâmetros você teria que colocar cinco interrogações …

cstmt.setString(1, 'teste'); 
 cstmt.setInt(2, 123456); 
 cstmt.registerOutParameter(3,Types.VARCHAR); 
 cstmt.execute();

Você deve atribuir os valores de cada parâmetro IN que sua produre tem através dos métodos SET do seu método CallableStatement, na ordem dos parâmetros de sua procedure, ou seja, se o seu primeiro parâmetro é um varchar você deve usar o método setString , o segundo é um number então eu uso o setInt, o meu terceiro parâmetro é um OUT então eu uso cstmt.registerOutParameter, o valor 3 dele significa que ele é o terceiro parâmetro da procedure, logo após eu informo que ele vai me retornar um Varchar.

… Use cstmt.execute(); para executar a procedure e não cstmt.executeQuery();

obrigado amigo, pela paciência em me ajudar, fiz da seguinte forma agora:

CallableStatement cs = con.prepareCall("{call IDENT_BASE01()}");

cs.setInt(1, 4);

cs.setString(2, Marcio);

cs.registerOutParameter(3,java.sql.Types.VARCHAR); -  que ele não aceita esse tipo de variável, na procedure ele é REF CURSOR

cs.execute();
tentei criar com pl-sql assim:

Class.forName(oracle.jdbc.driver.OracleDriver);

Connection con = DriverManager.getConnection(jdbc:oracle:thin:@ + ip + : + 1521 + : + ADM , usuario, senha);

Statement sq_stmt = con.createStatement();
PreparedStatement stmt = null;

stmt = con.prepareStatement(declare TYPE cat_cv IS REF CURSOR; dan1 cat_cv; begin IDENT_BS(1,[telefone removido],dan1); end;);

stmt.execute();

ResultSet results = stmt.getResultSet();

String nome= results.getString(CONTA); -  que está dando erro nessa linha, não estou conseguindo pegar o retorno. me ajude por favor.
V

Faça assim…

Como a sua procedure retorna um REF CURSOR faça assim:

  1. importar a classe

import oracle.jdbc.OracleTypes;

  1. Mude o tipo do retorno do seu parâmetro OUT

cstmt.registerOutParameter(3, OracleTypes.CURSOR);

  1. Depois da linha de execução da procedure vc tem que atribuir o resultado num ResultSet

ResultSet rs = (ResultSet)cstmt.getObject(3);

/Esta procedure retorna 2 colunas do select/

while (rs.next()) {

System.out.println(rs.getString(1) + “\t +

rs.getString(2) + “\t);

}

espero que dê certo

D

“vansol”:
Faça assim…

Como a sua procedure retorna um REF CURSOR faça assim:

  1. importar a classe

import oracle.jdbc.OracleTypes;

  1. Mude o tipo do retorno do seu parâmetro OUT

cstmt.registerOutParameter(3, OracleTypes.CURSOR);

  1. Depois da linha de execução da procedure vc tem que atribuir o resultado num ResultSet

ResultSet rs = (ResultSet)cstmt.getObject(3);

/Esta procedure retorna 2 colunas do select/

while (rs.next()) {

System.out.println(rs.getString(1) + “\t +

rs.getString(2) + “\t);

}

espero que dê certo

Amigo, estou quase conseguindo, minha única dúvida agora é saber como faço para pegar o retorno da variável REF CURSOR.

Estou passando para o parametro 3 isso:cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);

este mesmo parametro me retorna o RESULTADO que na procedure foi definida como REF CURSOR.

V

Faça o passo 3 da minha última citação:

Pois como o seu OUT é um REF CURSOR vc tem que mandar para um Result Set.

Certo? :wink:

Criado 13 de julho de 2004
Ultima resposta 16 de jul. de 2004
Respostas 10
Participantes 3