Recuperar valor de um generator do interbase

8 respostas
O

Olá pessoal,

Tenho uma base de dados no interbase onde existe uma tabela cliente, criei entaum um generator para para esta tabela, posteriormente criei uma stored procedure para recuperar o valor dela e também atualizar o generator, porém não sei como por exemplo recuperar o valor da consutla e colocar em um JTextField, veja o meu codigo

Stored Procedure no Banco:

SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE “RET_GEN_CLIENTE”
RETURNS
(
“RETORNO_CLIENTE” INTEGER
)
AS
BEGIN EXIT; END ^

ALTER PROCEDURE RET_GEN_CLIENTE

RETURNS

(

RETORNO_CLIENTE INTEGER

)

AS

BEGIN

RETORNO_CLIENTE = GEN_ID(gen_cliente, 1);

END

^

SET TERM ; ^

Vejam o meu codigo no Java:

// Recuperando o valor do código atual

try{

// Preparando o comando para a chamada da Stored Procedure

java.sql.CallableStatement cs = conn.prepareCall("{call RET_GEN_CLIENTE}");

// Executando a Stored Procedure

java.sql.ResultSet rs = cs.executeQuery();

int i_codigo = rs.getInt(0);

String s_codigo = Integer.toString(i_codigo);

fieldCodigo.setText(s_codigo);

}

catch(Exception e){

javax.swing.JOptionPane.showMessageDialog(null,Falha ao recuperar +

" o código");

dispose();

e.printStackTrace();

}

}

Quando eu tendo executar ele me fala q naum acha a coluna correspondente.

Valeu

Paulo Henrique

8 Respostas

T
java.sql.CallableStatement cs = conn.prepareCall("{call RET_GEN_CLIENTE}"); 
// Executando a Stored Procedure 
java.sql.ResultSet rs = cs.executeQuery(); 
int i_codigo = rs.getInt(0);

Hum, não testei, mas normalmente a gente faz algo como
“{? = call RET_GEN_CLIENTE}” e “rs.getInt(1)”, sem contar que precisa registrar o parâmetro de saída como um OUT parameter (registerOutParameter () ) .

Aqui vai um pedacinho do Javadoc de java.sql.CallableStatement, veja o resto no site da Sun.

JDBC provides a stored procedure SQL escape syntax that allows stored procedures to be called in a standard way for all RDBMSs. This escape syntax has one form that includes a result parameter and one that does not. If used, the result parameter must be registered as an OUT parameter. The other parameters can be used for input, output or both. Parameters are referred to sequentially, by number, with the first parameter being 1.

{?= call <procedure-name>[<arg1>,<arg2>, …]}
{call <procedure-name>[<arg1>,<arg2>, …]}

IN parameter values are set using the set methods inherited from PreparedStatement. The type of all OUT parameters must be registered prior to executing the stored procedure; their values are retrieved after execution via the get methods provided here.

O

Bom, primeiro valeu pela dica, mas como faço esta parada de registrar como parametro de saida.

Valeu

Paulo

urubatan

seguinte, vcs estão tentando chamar de maneira errada esta proc no interbase

faz assim que é mais fácil e rápido:

select gen_id(nome_generator, 0) from rdb$database

ou se quiser mesmo fazer via procedure:

select * from nome_procedure
O

Rodrigo Valeu pela dica, outra coisa se eu usar somente primeiro comando, ele vai também atualizar o valor do generator la no banco.

Valeu

Paulo

urubatan

bom, eu escrevi ali com 0, o ultimo parametro é qual o incremento que tu quer fazer no generator

select gen_id(generator,0) from rdb$database só retorna o valor mas não incrementa nada

select gen_id(generator,2) from rdb$database incrementa o generator em 2 e depois retorna o valor

O

Rodrigo, fiz o q vc me falou, como mostrado no código abaixo:

// Recuperando o valor do código atual

try{

// Preparando o comando para a chamada da Stored Procedure

String sql = select gen_id(gen_cliente, 1) from rdb$database;

// Executando a Stored Procedure

java.sql.Statement st = conn.createStatement();

java.sql.ResultSet rs = st.executeQuery(sql);

int i_codigo = rs.getInt(GEN_ID);

String s_codigo = Integer.toString(i_codigo);

fieldCodigo.setText(s_codigo);

}

catch(Exception e){

javax.swing.JOptionPane.showMessageDialog(null,Falha ao recuperar +

" o código");

dispose();

e.printStackTrace();

}

Porém da o seguinte erro:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Estado de cursor inválido

Vc sabe o q pode ser.

Valeu

Paulo

urubatan

o teu código ta errado, da mais uma estudada na API JDBC :smiley:
principalmente o ResultSet.next()

tenta isto que deve funcionar … (hoje to de bom humor, ou estou me controlando só por que to parando de fumar, normalmente eu responderia apenas RTFM)

// Recuperando o valor do código atual try{ String sql = "select gen_id(gen_cliente, 1) from rdb$database"; // Executando a Stored Procedure java.sql.Statement st = conn.createStatement(); java.sql.ResultSet rs = st.executeQuery(sql); rs.next(); int i_codigo = rs.getInt(1); String s_codigo = Integer.toString(i_codigo); fieldCodigo.setText(s_codigo); } catch(Exception e){ javax.swing.JOptionPane.showMessageDialog(null,"Falha ao recuperar" + " o código"); dispose(); e.printStackTrace(); }

da mais uma estudada em JDBC, e principalmente nos manuais do Firebird que estão disponiveis no site (acho eles melhores que os PDFs da borland, pelo menos os da versão 5.5 que foram os ultimos da borland que eu vi)

urubatan

ahh, se tu não viu diferença nenhuma nos dois códigos, eu coloquei um rs.next() e to pegando o campo pelo indice em vez do nome

Criado 8 de novembro de 2004
Ultima resposta 8 de nov. de 2004
Respostas 8
Participantes 3