Retorno de função postgre para java!

3 respostas
S

Fala galera,

Como alguns sabem aqui sou novato no mundo java.

Hoje estou fazendo meu projeto se conectar com o postgre, a conexão está rodando normalmente, se eu chamo uma query executa normal, retorna resultado e trato.

Minha dúvida é, como trabalhar com o postgre + java quando tenho uma função que precisa gravar no banco e me retornar um resultado de uma table?

tenho o seguinte código java:

CallableStatement userSession = con.prepareCall("{ ? = call open_session (?,?,?,?) }");
            userSession.registerOutParameter(1, Types.OTHER);
            userSession.setString(2, _user_id);
            userSession.setString(3, _user_ip);
            userSession.setString(4, _session_token);

            userSession.execute();

            ResultSet results = (ResultSet) userSession.getObject(1);

            while (results.next()) {
                Debugger.getInstance().showMsg(String.valueOf(results.getFloat(1)));
            }

            results.close();

            userSession.close();

e tenho o seguinte código em plpgsql:

CREATE OR REPLACE FUNCTION open_session(character varying, character varying, character varying) RETURNS refcursor AS
$$
DECLARE
	idUser 	character varying(32);
	ipUser 	character varying(15);
	token 	character varying(50);
	dateIn 	timestamp;

	DECLARE cs_user CURSOR FOR SELECT limit, earn FROM user_balances WHERE user_id = idUser;
	limit user_balances.limit%TYPE;
	earn user_balances.earn%TYPE;

	dataUser refcursor;
BEGIN
	idUser 	= $1;
	ipUser 	= $2;
	token	= $3;

	SELECT now() INTO dateIn;

	BEGIN
		OPEN cs_user;
		FETCH cs_user INTO limit, earn;
	END;

	BEGIN
		INSERT INTO coin_flip_sessions (user_id, user_ip, token, date_in, credit_in, bonus_in, earn_in, round, status)
			VALUES (idUser, ipUser, token, dateIn, money, bonus, earn, 0, 'o');
	END;
	
	CLOSE cs_user;

	OPEN dataUser for
		SELECT user_balances.*, user_data.currency_id, user_data.language_id FROM user_balances, user_data WHERE user_balances.user_id = ipUser  ORDER BY user_balances.date_in DESC LIMIT 1;
	RETURN dataUser;
END;
$$
LANGUAGE 'plpgsql';

se eu deixo con.setAutoCommit(false);
ele não grava na base e me retorna nada.

se eu deixo con.setAutoCommit(true);
ele grava na base e diz que “<unnamed portal 1>” não existe.

O que é esse “<unnamed portal 1>”?
Existe outra forma de fazer isso?
Qual é o retorno que tenho q dar no postgre e tratar no java?

Se puderem me ajudar agradeço.

Obrigado

3 Respostas

S

É colocar a dúvida aqui no fórum depois de horas pesquisando na net e eu descubro o erro.

No select onde eu coloco: WHERE user_balances.user_id = ipUser tem que ser WHERE user_balances.user_id = idUser

Cabaçada total.

Mas ainda fica uma dúvida.

pra pegar o resultado eu uso results.getFloat(1) e vou pegando o resultado pelo index dentro da tabela.

tem como eu pegar o resultado pelo nome da coluna?

[]'s

A

tem sim…

results.getFloat("nome_coluna")

Acho que só dá zica se o campo da tabela não conseguir ser convertido para o tipo que tá sendo usado na chamada do método. Mas deve então lançar exception que dá pra perceber isso

S

Perfeito,

Valeu cara.

[]'s

Criado 14 de junho de 2011
Ultima resposta 14 de jun. de 2011
Respostas 3
Participantes 2