Skip site navigation (1) Skip section navigation (2)

(CREATE TEMP | 'DROP') TABLE en una (funcion | transaccion) ¿?

From: Victor Lopez <v(dot)lopez(dot)s(at)ono(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: (CREATE TEMP | 'DROP') TABLE en una (funcion | transaccion) ¿?
Date: 2007-03-25 04:32:11
Message-ID: 200703250632.11528.v.lopez.s@ono.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Saludos.
La situacion es la siguiente ...
test=# -----------------------------------------------------------------------------------------------------------------------
test=# CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler 
AS '$libdir/plpgsql' LANGUAGE C;
CREATE FUNCTION
test=# CREATE FUNCTION plpgsql_validator(oid) RETURNS void 
AS '$libdir/plpgsql' LANGUAGE C;
CREATE FUNCTION
test=# CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler 
VALIDATOR plpgsql_validator;
NOTICE:  usando información de pg_pltemplate en vez de los parámetros de 
CREATE LANGUAGE
CREATE LANGUAGE
test=# CREATE DOMAIN domUsuario AS VARCHAR(16) NOT NULL CONSTRAINT usuarioChk 
CHECK(VALUE ~ '^[a-zA-Z0-9]{8,}$');
CREATE DOMAIN
test=# CREATE OR REPLACE FUNCTION usuarioOK(VARCHAR(16)) RETURNS boolean AS
test-# $$
test$# BEGIN
test$#   BEGIN
test$#     CREATE TEMP TABLE TabUsuario (usuario domUsuario) ON COMMIT DROP;
test$#     INSERT INTO TabUsuario(usuario) VALUES ($1);
test$#     RETURN true;
test$#   EXCEPTION
test$#     WHEN check_violation THEN
test$#       RETURN false;
test$#   END;
test$# END;
test$# $$
test-# LANGUAGE plpgsql
test-# SECURITY DEFINER;
CREATE FUNCTION
test=# SELECT usuarioOK('gtfrthjuk');
 usuariook
-----------
 t
(1 fila)

test=# -- Hasta aqui, todo bien
test=# --
test=# SELECT usuarioOK('gtf');
ERROR:  no existe la relación con OID 17123
CONTEXT:  sentencia SQL: «INSERT INTO TabUsuario(usuario) VALUES ( $1 )»
PL/pgSQL function "usuariook" line 4 at SQL statement
test=# SELECT usuarioOK('gtfrthjuk');
ERROR:  no existe la relación con OID 17123
CONTEXT:  sentencia SQL: «INSERT INTO TabUsuario(usuario) VALUES ( $1 )»
PL/pgSQL function "usuariook" line 4 at SQL statement
test=# -----------------------------------------------------------------------------------------------------------------------

Al ser una tabla temporal, con ON COMMIT DROP no debería eliminarse al acabar 
la transacción )
Porque ... una función es una transacción (por defecto) ... ¿no?

Al entrar en la función / transacción se crea siempre antes de hacer el 
INSERT ... ¿no?
¿Entonces el OID  de que es?

O yo hago algo mal (para no variar) o ...

¿Alguien me lo puede explicar?

NOTA : El ejemplo es real y no 'retocado'.

-- 
----o---(  )---o----
Saludos de Victor Lopez Sabio
v(dot)lopez(dot)s(at)ono(dot)com
--------oooo-------- 

Responses

pgsql-es-ayuda by date

Next:From: Jaime CasanovaDate: 2007-03-25 04:54:04
Subject: Re: (CREATE TEMP | 'DROP') TABLE en una (funcion | transaccion) ¿?
Previous:From: Daniel Ricardo MedinaDate: 2007-03-25 03:01:40
Subject: RE: Ayuda urgente

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group