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
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
procedure ñ te retorna nada o que te retorna é a function pode estar ai o seu erro.
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…
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) ;
}
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.
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.
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();
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ãocstmt.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); - só 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”); - só que está dando erro nessa linha, não estou conseguindo pegar o retorno. me ajude por favor.
Faça assim…
Como a sua procedure retorna um REF CURSOR faça assim:
import oracle.jdbc.OracleTypes;
cstmt.registerOutParameter(3, OracleTypes.CURSOR);
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
Faça assim…Como a sua procedure retorna um REF CURSOR faça assim:
- importar a classe
import oracle.jdbc.OracleTypes;
- Mude o tipo do retorno do seu parâmetro OUT
cstmt.registerOutParameter(3, OracleTypes.CURSOR);
- 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.
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? 