Problemas con el valor actual de una secuencia dentro de una función

From: "Carlos Chávez Z(dot)" <cchavez(at)oxyman(dot)com(dot)pe>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Problemas con el valor actual de una secuencia dentro de una función
Date: 2007-06-07 14:48:00
Message-ID: 46681AA0.6030106@oxyman.com.pe
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos, tengo un problema al capturar el valor actual de una
secuencia dentro de una función. Les explico mejor lo que estoy
intentando hacer... Desde una aplicación (en jaya) creo una tabla
temporal de la siguiente forma:

create temp table tdetpermisos (percodigo integer default 0,
dpeitem smallint default nextval('rrhh.peq_seq'),
dpefecini date,
dpefecfin date,
dpetotal time without time zone);

y luego invoco a mi función

select rrhh.fncgrabapermisos(193, '06-06-2007 08:00:00', '06-06-2007
11:00:00', 1,false,1,false,'C') as ddd;

internamente mi función debe realizar las siguientes acciones:
1. insertar un registro en mi tabla permisos
2. capturar el insertado (mi PK) que es una resultado de una secuencia
3. actualizar dicho campo en mi tabla temporal
4. grabar mi tabla temporal a mi tabla detpermisos
5. borrar mi tabla temporal y dejar mi secuencia (la que utilizo en la
tabla temporal) en 1

mi función es la siguiente:
--------
CREATE OR REPLACE FUNCTION rrhh.fncgrabapermisos(trab integer, fhini
timestamp without time zone, fhfin timestamp without time zone, aut
integer, paga boolean, tipo integer, ghab boolean, fc bpchar)
RETURNS boolean AS
$BODY$
declare
--actual integer;
begin
insert into rrhh.permisos
(tracodigo,perfhini,perfhfin,autcodigo,perpagado,tpecodigo,perghaber,perfc)
values (trab,fhini,fhfin,aut,paga,tipo,ghab,fc);
if not found then
return false;
else
if fc ='C' then
--select into actual currval('rrhh.permisos_percodigo_seq');
update tdetpermisos set percodigo= (select
currval('rrhh.permisos_percodigo_seq')); --actual;
insert into rrhh.detpermisos select * from tdetpermisos;
end if;
drop table tdetpermisos;
perform setval('rrhh.peq_seq',1,false);
return true;
end if;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
--------

Bueno mi problema es que al ejecutar por primera vez la función no hay
ningún problema, pero al volver a ejecutar nuevamente la función me da
como resultado el siguiente error:

ERROR: relation with OID 34255 does not exist
SQL state: 42P01
Context: SQL statement "update tdetpermisos set percodigo= (select
currval('rrhh.permisos_percodigo_seq'))"
PL/pgSQL function "fncgrabapermisos" line 11 at SQL statement

Bueno según entiendo tiene que ver con la captura del valor actual de mi
secuencia pero no se como reemplazarlo o que está de más. Les agradezco
de antemano por cualquier ayuda que me puedan brindar y desde luego
cualquier sugerencia para mejorar mi función es bienvenida.

Saludos

Carlos Chávez Z.
Arequipa - Perú

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Eduard Miquel i Gavaldà 2007-06-07 14:54:28 Migració de datos a tabla particionada
Previous Message Sonia Malave 2007-06-07 14:39:30 Seguimiento de Store!