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 ^
// Recuperando o valor do código atualtry{// Preparando o comando para a chamada da Stored Procedurejava.sql.CallableStatementcs=conn.prepareCall("{call RET_GEN_CLIENTE}");// Executando a Stored Procedurejava.sql.ResultSetrs=cs.executeQuery();inti_codigo=rs.getInt(0);Strings_codigo=Integer.toString(i_codigo);fieldCodigo.setText(s_codigo);}catch(Exceptione){javax.swing.JOptionPane.showMessageDialog(null,“Falhaaorecuperar”+" o código");dispose();e.printStackTrace();}}
Quando eu tendo executar ele me fala q naum acha a coluna correspondente.
java.sql.CallableStatementcs=conn.prepareCall("{call RET_GEN_CLIENTE}");// Executando a Stored Procedure java.sql.ResultSetrs=cs.executeQuery();inti_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.
O
oadventista
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:
selectgen_id(nome_generator,0)fromrdb$database
ou se quiser mesmo fazer via procedure:
select*fromnome_procedure
O
oadventista
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
oadventista
Rodrigo, fiz o q vc me falou, como mostrado no código abaixo:
// Recuperando o valor do código atualtry{// Preparando o comando para a chamada da Stored ProcedureStringsql=“selectgen_id(gen_cliente,1)fromrdb$database”;// Executando a Stored Procedurejava.sql.Statementst=conn.createStatement();java.sql.ResultSetrs=st.executeQuery(sql);inti_codigo=rs.getInt(“GEN_ID”);Strings_codigo=Integer.toString(i_codigo);fieldCodigo.setText(s_codigo);}catch(Exceptione){javax.swing.JOptionPane.showMessageDialog(null,“Falhaaorecuperar”+" 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
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