Gracias por la documentacion, la voy a leer y tenerla en cuenta para crear la nueva funcion.
Mientras tanto les muestro como quedo la funcion que duplica el libro de actas. Unas pruebas preliminares parecen indicar que funciona bien, pero queria que el foro la vea a ver si se me escapo algo. Su definicion es muy parecida a la anterior, salvo un pequeño arreglo en un INSERT.
CREATE OR REPLACE FUNCTION negocio.f_duplicar_libro_de_actas(plibro integer, pactivarlibro character)
RETURNS integer AS
$BODY$
-- Variables locales
DECLARE _libro_nuevo integer;
DECLARE _libro_tomo_1 integer;
DECLARE _fecha_actual DATE;
DECLARE _activo char(1);
BEGIN
_libro_nuevo := NULL;
_libro_tomo_1 := NULL;
_fecha_actual := CURRENT_DATE;
IF pActivarLibro = 'S' THEN
_activo := 'S';
ELSE
_activo := 'N';
END IF;
INSERT INTO sga_libros_actas (
nro_libro, nombre, descripcion, fecha_activacion, fecha_fin_vigencia, es_libro_activo, anio_academico)
SELECT nro_libro, nombre, descripcion, _fecha_actual, NULL, _activo, anio_academico
FROM sga_libros_actas
WHERE libro = pLibro;
-- Obtengo el ID del libro
_libro_nuevo := (SELECT currval('sga_libros_actas_seq'));
-- Tomos del Libro
INSERT INTO sga_libros_tomos (libro, nro_tomo, cant_max_folios, ultimo_acta, ultimo_folio)
SELECT _libro_nuevo, 1, cant_max_folios, NULL, NULL
FROM sga_libros_tomos
WHERE libro = pLibro;
-- Obtengo el id del tomo 1 del nuevo libro
SELECT libro_tomo
INTO _libro_tomo_1
FROM sga_libros_tomos
WHERE libro = _libro_nuevo
AND nro_tomo = 1;
-- Copio la definicion del libro
-- Alcance
INSERT INTO sga_libros_actas_alcance (libro, origen)
SELECT _libro_nuevo, origen FROM sga_libros_actas_alcance WHERE libro = pLibro;
-- Ubicacion
INSERT INTO sga_libros_actas_ubicacion (libro, ubicacion)
SELECT _libro_nuevo, ubicacion FROM sga_libros_actas_ubicacion WHERE libro = pLibro;
-- Propuestas
INSERT INTO sga_libros_actas_propuesta (libro, propuesta)
SELECT _libro_nuevo, propuesta FROM sga_libros_actas_propuesta WHERE libro = pLibro;
-- Actividades
INSERT INTO sga_libros_actas_actividad (libro, elemento)
SELECT _libro_nuevo, elemento FROM sga_libros_actas_actividad WHERE libro = pLibro;
-- Inactivo el Libro de actas.
IF pActivarLibro = 'S' THEN
UPDATE sga_libros_actas SET es_libro_activo = 'N' WHERE libro = pLibro;
END IF;
-- Retorno el id del tomo 1 del nuevo libro creado
RETURN _libro_tomo_1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION negocio.f_duplicar_libro_de_actas(integer, character)
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION negocio.f_duplicar_libro_de_actas(integer, character) TO postgres;
GRANT EXECUTE ON FUNCTION negocio.f_duplicar_libro_de_actas(integer, character) TO public;
Capaz hay alguien con el mismo problema y le sirve. Si necesitan alguna informacion mas, avisenme.
Saludos!