31.5. Chamadas de procedimentos armazenados

O driver JDBC do PostgreSQL suporta integralmente as chamadas de procedimentos armazenados do PostgreSQL.

Exemplo 31-4. Chamada de procedimento armazenado incorporado

Este exemplo mostra como chamar uma função incorporada do PostgreSQL, upper, que simplesmente converte as letras da cadeia de caracteres fornecida como argumento em maiúsculas.

// Desabilitar as transações.
conn.setAutoCommit(false);
// Chamada do procedimento.
CallableStatement procMaiusc = conn.prepareCall("{ ? = call upper( ? ) }");
procMaiusc.registerOutParameter(1, Types.VARCHAR);
procMaiusc.setString(2, "minusculas em maiusculas");
procMaiusc.execute();
System.out.println(procMaiusc.getString(1));
procMaiusc.close();

31.5.1. Utilização da interface CallableStatement

Todas as considerações que se aplicam a Statement e a PreparedStatement também se aplicam a CallableStatement, mas além destas deve ser considerada uma restrição extra:

31.5.2. Obtenção de um ResultSet a partir de uma função armazenada

A função armazenada do PostgreSQL pode retornar resultados através de um valor do tipo refcursor.

Como uma extensão ao JDBC, o driver JDBC do PostgreSQL pode retornar valores refcursor como valores ResultSet.

Exemplo 31-5. Obtenção de valores refcursor a partir de uma função

Quando se chama uma função que retorna refcursor, o tipo retornado por getObject deve ser transformado em ResultSet

// Desabilitar as transações.
conn.setAutoCommit(false);
// Chamada do procedimento.
CallableStatement proc = conn.prepareCall("{ ? = call doquery ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, -1);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
  // fazer alguma coisa com os resultados...
}
results.close();
proc.close();

Também é possível tratar o valor refcursor retornado como um tipo distinto. O driver JDBC fornece a classe org.postgresql.PGRefCursorResultSet para esta finalidade.

Exemplo 31-6. Tratamento do refcursor como um tipo distinto

conn.setAutoCommit(false);
CallableStatement proc = conn.prepareCall("{ ? = call doquery ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, 0);
org.postgresql.PGRefCursorResultSet refcurs
    = (PGRefCursorResultSet) conn.getObject(1);
String cursorName = refcurs.getRefCursor();
proc.close();
SourceForge.net Logo