RE: [pgsql-es-ayuda] Problemas con función que usa tablas temporales

From: Gerardo Castillo <gcastillo(at)ice(dot)co(dot)cr>
To: araquisc(at)datafull(dot)com, pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: [pgsql-es-ayuda] Problemas con función que usa tablas temporales
Date: 2004-07-21 16:33:12
Message-ID: 0I1700FCKN5CYN@ice.co.cr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

En algun momento tuve en cuenta la posibilidad de que la tabla existiera.
Para descartar eso agregué la sintaxis ON COMMIT DROP a la creación de la
tabla temporal y ejecuté la función así:
begin;
SELECT * FROM funcion_prueba() as r(x integer);
commit;
y si ejecuto esto por segunda vez también me da "ERROR: no existe la
relación con OID 93031", que en realidad el 93031 es un número que siempre
esta cambiando tras cada recompilación de la función.

Según lo que leí en la documentación, ese commit, debería eliminar la tabla
temporal.

Saludos,
Gerardo.

_____

De: Christian G. Araquistain [mailto:araquisc(at)datafull(dot)com]
Enviado el: Miércoles, 21 de Julio de 2004 10:14 a.m.
Para: Gerardo Castillo; pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] Problemas con función que usa tablas temporales

Esto es seguramente porque estas dentro de la misma sesión y cuando quiere
crear la tabla tira error porque ya existe. Seria conveniente que verifiques
si existe la tabla antes de crearla.

Saludos ...

Christian G. Araquistain
araquisc(at)datafull(dot)com

----- Original Message -----
From: Gerardo <mailto:gcastillo(at)ice(dot)co(dot)cr> Castillo
To: pgsql-es-ayuda(at)postgresql(dot)org
Sent: Wednesday, July 21, 2004 12:53 PM
Subject: [pgsql-es-ayuda] Problemas con función que usa tablas temporales

Hola,

Estoy utilizando PostgreSQL 7.4.

El problema es que tengo una función que devuelve los resultados de una
tabla temporal.
Mi función es mucho más compleja y maneja mas de una tabla temporal, pero
para ilustrar, sería algo como lo siguiente:

CREATE OR REPLACE FUNCTION "public"."funcion_prueba" () RETURNS SETOF
"pg_catalog"."record" AS'
BEGIN
--CREA TABLA TEMPORAL
CREATE TEMPORARY TABLE tmp_prueba(
x integer
)ON COMMIT DROP;

--INSERTA INFORMACION
INSERT INTO tmp_prueba
SELECT x
FROM tabla;

--RETORNA LOS RESULTADOS
FOR resultado IN SELECT x FROM tmp_prueba LOOP
RETURN NEXT resultado;
END LOOP;
RETURN;
END;
'LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY DEFINER;

El asunto es que cuando ejecuto la función:
SELECT * FROM function_prueba() as r(x integer);
la primera vez se ejecuta adecuadamente, pero cuando la ejecuto por segunda
ocación me da el siguiente error:
"ERROR: no existe la relación con OID 93031"
y para que funcione denuevo, debo recompilar la función.

Tengo funciones que no utilizan tablas temporales que no presentan este
problema, es por ello que creo que podría andar por allí el problema.

Gracias de antemano a cualquier sugerencia,
Gerardo Castillo.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Roberto Andrade Fonseca 2004-07-21 18:45:10 VB y PostgreSQL
Previous Message Christian G. Araquistain 2004-07-21 16:14:29 Re: [pgsql-es-ayuda] Problemas con función que usa tablas temporales