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.
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.
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.
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
o teu código ta errado, da mais uma estudada na API JDBC
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)