Función que devuelva un conjunto de registros

From: Guillermo Schulman <gschulman_ml(at)yahoo(dot)com(dot)ar>
To: lista de correo de postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Función que devuelva un conjunto de registros
Date: 2004-08-25 18:50:35
Message-ID: 412CDF7B.9010709@yahoo.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos.
En nuestro desarrollo tenemos una consulta muy pesada porque trabaja con
varias tablas de gran tamaño. Descubrí que es posible mejorar la
performance de la consulta a través de una serie de consultas parciales
usando tablas temporales.
Como la idea es que el cambio sea lo más transparente posible para la
aplicación mi idea fue crear una función que "encapsulara" todos los
pasos y devolviera el conjunto de registros resultante. Para esto hice
lo siguiente:

CREATE OR REPLACE FUNCTION getorderfunc() RETURNS refcursor AS '
declare
cur_test refcursor;
BEGIN
create temporary table ...;
create temporary table ...;

create index... ;

cur_test=''cur_order'';
OPEN cur_test FOR select blablabla...;

RETURN cur_test;
END;
' LANGUAGE plpgsql;

Para ver los resultados desde la consola hago:
begin;
select getorderfunc();
fetch all in cur_name;

Y así obtengo exactamente el resultado esperado.
Pero:
1) Es esta la mejor manera de realizar una función para que devuelva un
conjunto de registros para luego poder iterar desde una aplicación java?
(Les recuerdo que usamos version 7.2.1 y que estamos en plan de cambiar
pronto, pero por ahora eso es lo que hay).
2) Estoy teniendo problemas para obtener los resultados de la función
desde el código de la aplicación (en JAVA con JDBC).
El código es más o menos así:

con.setAutoCommit( false );

String query = "SELECT function_name()";

PreparedStatement stmt = jdbc.prepareStatement( query );
stmt.executeQuery();

query = "FETCH ALL IN cur_test_name";

PreparedStatement stmt2 = jdbc.prepareStatement( query );
ResultSet resultSet = stmt2.executeQuery();

con.setAutoCommit( true );

Por alguna razón me da una excepción: "java.sql.SQLException: ERROR:
cursor "cur_name" already in use"
Alguna ayuda?
Muchas gracias.

Responses

  • Re: Funci at 2004-08-25 19:50:30 from Alvaro Herrera

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2004-08-25 19:50:30 Re: Funci
Previous Message Leonel Nunez 2004-08-25 15:04:24 Re: Repositorio RPM