Recuperar valor de um generator do interbase

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

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.

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

Valeu

Paulo

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

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

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

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

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)

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