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();
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:
ResultSet
a partir de uma função armazenadaA 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();