Saturday, May 17, 2008

Re: [pgsql-es-ayuda] Problema con Funcion de insercion en multiples tablas

Lo resolvi con la siguiente funcion, sin cursores:

CREATE OR REPLACE FUNCTION AGREGAR_DISPOSICION( disposicion TEXT,
anio_menor INT,
anio_mayor INT,
name TEXT,
archivo BYTEA,
tipe TEXT,
size FLOAT,
asignatura INT,
carrera INT,
tipo TEXT) RETURNS VOID AS
$$
DECLARE
existe TEXT;
plan RECORD;
BEGIN
IF anio_menor > anio_mayor THEN
RAISE EXCEPTION 'ERROR: El año de inicio debe ser mayor que el de fin!';
ELSE
SELECT nro_disposicion INTO existe FROM T_PROGRAMAS;
IF existe IS NULL THEN
INSERT INTO T_PROGRAMAS VALUES(nro_disposicion, name, archivo,
tipe, size, current_date, tipo);
END IF;
FOR plan IN SELECT codigo_plan
FROM T_ASIGNATURAS_X_PLAN
WHERE codigo_asignatura = asignatura AND codigo_carrera = carrera
ORDER BY codigo_plan ASC
LOOP
INSERT INTO T_PROGRAMAS_X_ASIGNATURA VALUES (disposicion,
plan.codigo_plan, carrera, asignatura, anio_menor, anio_mayor);
END LOOP;

END IF;
END;
$$ language 'plpgsql';

Todavia no esta del todo probada pero parece funcar! :P
Cualquier cosa comento!

Saludos,

Juan


2008/5/16 Juan Manuel Fernandez <jmfernandez@unlu.edu.ar>:
> Buenas Noches Lista!!!
> Tengo el siguiente problema, tengo una funcion (en realidad deseo
> tenerla) que lo que debe hacer es:
>
> * Insertar parte de los datos que son pasados como parametro en una Tabla.
> * En base a parte de estos datos, seleccionar datos de otra tabla para
> insertarlos junto con otros pasados como parametro en una tercera
> tabla...
>
> La idea de la funcion es la siguiente:
>
> CREATE OR REPLACE FUNCTION AGREGAR_DISPOSICION( disposicion TEXT,
> anio_menor INT,
> anio_mayor INT,
> name TEXT,
> archivo BYTEA,
> tipe TEXT,
> size FLOAT,
> asignatura INT,
> carrera INT,
> tipo TEXT) RETURNS VOID AS
> $$
> DECLARE
> existe TEXT;
> planes CURSOR FOR SELECT codigo_plan WHERE codigo_asignatura =
> asignatura AND codigo_carrera = carrera ORDER BY codigo_plan ASC;
>
> BEGIN
> IF anio_menor > anio_mayor THEN
> RAISE EXCEPTION 'ERROR: El año de inicio debe ser mayor que el de fin!';
> ELSE
> SELECT nro_disposicion INTO existe FROM T_PROGRAMAS;
> IF existe IS NULL THEN
> INSERT INTO T_PROGRAMAS VALUES(nro_disposicion, name, archivo,
> tipe, size, current_date, tipo);
> END IF;
>
> SELECT codigo_plan INTO planes FROM
> T_ASIGNATURAS_X_PLAN WHERE codigo_carrera = carrera AND
> codigo_asignatura = asignatura;
>
> // Aca esta el dilema! Como hago para que el
> programa se inserte en todos los planes coincidentes???
>
> INSERT INTO T_PROGRAMAS_X_ASIGNATURA VALUES (disposicion, :planes,
> carrera, asignatura, anio_menor, anio_mayor);
>
> END IF;
> END;
> $$ language 'plpgsql';
>
> Yo entiendo que en la variable planes va a quedar solo el ultimo plan
> coincidente, el tema es que deseo insertarlo en todos los que lo
> sean...
>
> Como puedo hacerlo? Creo que una alternativa seria un cursor, pero
> jamas use uno....
>
> Si me ayudan me sacarían de un enorme bache, un problema con el que
> lidie todo el día...
>
>
>
> Muchas gracias,
>
>
> Juan
>
--
TIP 5: ¿Has leído nuestro extenso FAQ?

http://www.postgresql.org/docs/faqs.FAQ.html

No comments: