PDA

Ver la Versión Completa : problema trigger no se que hago mal


elistraus
14-12-2010, 06:04:32
hola amigos del club delphi
tengo un problemas con un trigger que no lo se manejar, igual soy nuevo en los trigger, haber si me pueden ayudar

tengo una tabla secciones donde se crean secciones con sus modulos, formadores (profes), y un atributo tipo que es un dominio MNO(modulo normal), MES (modulo especial).
otra tabla que se llama modulo_inscrito donde se inscriben las personas a dichos modulos, la cual tiene un atributo tipo pero ese atributo quiero cargarlo mediante trigger automaticamente cuando seleccione el numero de la seccion y no puedo ya he buscado bastante y no pillo como hacerlo este error me da

control reached end of trigger procedure without return le muestro el codigo para que me ayuden si pueden please

---------------------------
pgAdmin III
---------------------------
Ha ocurrido un error:

ERROR: control reached end of trigger procedure without RETURN
CONTEXT: PL/pgSQL function "TRG_SEQ_tipo_mod_ins"
---------------------------
Aceptar
---------------------------

CREATE TABLE secciones ( codigo numeric(5,0) NOT NULL, numero numeric(4,0) NOT NULL, estado estado NOT NULL, fecha_no_vigencia date, descripcion character varying(1000), fecha_ingreso date NOT NULL, for_1_per_rut numeric(10,0) NOT NULL, for_1_per_prf_codigo numeric(5,0) NOT NULL, mod_1_codigo numeric(5,0) NOT NULL, sed_codigo numeric(5,0) NOT NULL, tipo tipo_modulo NOT NULL, CONSTRAINT sec_pk_cod PRIMARY KEY (codigo), CONSTRAINT sec_for_1_fk FOREIGN KEY (for_1_per_rut, for_1_per_prf_codigo) REFERENCES formadores (per_rut, per_prf_codigo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT sec_mod_1_fk FOREIGN KEY (mod_1_codigo) REFERENCES modulos (codigo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT sec_sed_fk FOREIGN KEY (sed_codigo) REFERENCES sedes (codigo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT avcon_1290713870_estad_011 CHECK (estado::bpchar = ANY (ARRAY['VG'::bpchar, 'NV'::bpchar])), CONSTRAINT avcon_1290713870_tipo_000 CHECK (tipo::bpchar = ANY (ARRAY['MNO'::bpchar, 'MES'::bpchar])) )


CREATE TABLE modulos_inscritos ( codigo numeric(5,0) NOT NULL, estado estado NOT NULL, fecha_no_vigencia date, fecha_registro date, evaluacion_del_contenido eva_contenido, asistencia numeric(3,0), evaluacion_final eva_final, fecha_ingreso date NOT NULL, per_rut numeric(10,0) NOT NULL, per_prf_codigo numeric(5,0) NOT NULL, sec_codigo numeric(5,0) NOT NULL, tipo character varying(8), CONSTRAINT mi_pk PRIMARY KEY (per_rut, per_prf_codigo), CONSTRAINT mi_per_fk FOREIGN KEY (per_rut, per_prf_codigo) REFERENCES personas (rut, prf_codigo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT mi_sec_fk FOREIGN KEY (sec_codigo) REFERENCES secciones (codigo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT avcon_1290713870_estad_004 CHECK (estado::bpchar = ANY (ARRAY['VG'::bpchar, 'NV'::bpchar])), CONSTRAINT avcon_1290713870_evalu_000 CHECK (evaluacion_del_contenido::bpchar = ANY (ARRAY['SU'::bpchar, 'IN'::bpchar])), CONSTRAINT avcon_1290713870_evalu_001 CHECK (evaluacion_final::bpchar = ANY (ARRAY['APR'::bpchar, 'NPR'::bpchar])) ) WITHOUT OIDS; ALTER TABLE modulos_inscritos OWNER TO formacio; GRANT ALL ON TABLE modulos_inscritos TO formacio;


CREATE OR REPLACE FUNCTION "TRG_SEQ_tipo_mod_ins"() RETURNS "trigger" AS $BODY$ DECLARE var varchar (8); BEGIN SELECT tipo FROM secciones WHERE codigo = sec_codigo into var; IF (var = 'MES') THEN var:= 'ESPECIAL'; ELSEIF (var = 'MNO') THEN var:= 'NORMAL'; NEW.tipo := var; Return NEW; END IF; END; $BODY$ LANGUAGE plpgsql VOLATILE; ALTER FUNCTION "TRG_SEQ_tipo_mod_ins"() OWNER TO formacio;


CREATE TRIGGER trg_mod_inscrito_tipo BEFORE INSERT ON modulos_inscritos FOR EACH ROW EXECUTE PROCEDURE "TRG_SEQ_tipo_mod_ins"();


espero sirva esto

saludos

elistraus
14-12-2010, 16:30:53
ya he arreglado mi problema,,, la solucion fué, primero que la funcion no me retornaba nada porque el return esta dentro del if, tube que cambiar el valor del tipo de dato la columna TIPO ya que le habia dado el mismo largo que el dominio,,, espero que esto sirva de ejemplo para otros programadores,,,
saluodos

Casimiro Notevi
14-12-2010, 16:49:19
Gracias por comentarlo :)