gorka escribió: > Hola: > > El problema es que esta función es llamada desde Java, siendo recogida > en un resultset dentro del metodo java, y no se como se puede recoger > desde java un setof xxxx. Además a estas alturas, con el producto ya en > producción, no se yo si la gente de Java va a estar dispuesta a cambiar > la forma de obtener los datos.
Ugh. Bueno, quizás funcione de todas formas. La idea es que en lugar de hacer OPEN foo CURSOR FOR ... WHERE fecha < param1 AND fecha > param2 hagas esto: EXECUTE 'OPEN foo CURSOR FOR ... WHERE fecha < ' || param1 || ' AND fecha > ' || param2' La diferencia es que en el segundo caso, los valores son interpolados al momento de crear el plan, en cambio en el primer caso se hace el plan y después se entregan los valores de los parámetros. De hecho puedes conseguir imitar esto directamente en SQL para que veas que se estropea el plan, de la siguiente forma: PREPARE foo(timestamp, timestamp) AS SELECT bla, bla ... WHERE fecha < $1 AND fecha > $2 EXPLAIN ANALYZE EXECUTE foo(fecha1, fecha); Y compara el plan que obtienes ejecutando la consulta directamente con los valores: EXPLAIN ANALYZE SELECT bla, bla ... WHERE fecha < 'fecha1' AND fecha > 'fecha2' -- Alvaro Herrera http://planet.postgresql.org/ "MySQL is a toy compared to PostgreSQL." (Randal L. Schwartz) (http://archives.postgresql.org/pgsql-general/2005-07/msg00517.php) -- TIP 4: No hagas 'kill -9' a postmaster