CREATE OR REPLACE PROCEDURE WRITE_TEILNEHMER_JN (p_tln_id teilnehmer.tln_id%type, p_tln_name teilnehmer.tln_name%type, p_tln_groesse teilnehmer.tln_groesse%type, p_tln_geburtstag teilnehmer.tln_geburtstag%type, p_jntyp teilnehmer_jn.tlnjn_typ%type) as vt_ausbildung t_ausbildung := t_ausbildung(); v_current timestamp := current_timestamp; v_tlnjn_id number; BEGIN for r_aus in (select aus_name from ausbildungen join teilnehmer_x_ausbildung on aus_id = txa_aus_id where txa_tln_id = p_tln_id) loop vt_ausbildung.extend; vt_ausbildung(vt_ausbildung.last) := r_aus.aus_name; end loop; insert into TEILNEHMER_JN ( tlnjn_id, tlnjn_tln_id, tlnjn_tln_name, tlnjn_tln_groesse, tlnjn_tln_geburtstag, tlnjn_typ, tlnjn_ausbildung, tlnjn_valid_from ) values ( seq.nextval, p_tln_id, p_tln_name, p_tln_groesse, p_tln_geburtstag, p_jntyp, vt_ausbildung, v_current ) returning tlnjn_id into v_tlnjn_id; update TEILNEHMER_JN set tlnjn_valid_to = v_current where tlnjn_id = (select max(tlnjn_id) from TEILNEHMER_JN where tlnjn_tln_id = p_tln_id and tlnjn_valid_to is null and tlnjn_id != v_tlnjn_id ); END WRITE_TEILNEHMER_JN; CREATE OR REPLACE TRIGGER TRg_teilnehmer_jn AFTER INSERT OR DELETE OR UPDATE ON TEILNEHMER FOR EACH ROW declare v_typ teilnehmer_jn.tlnjn_typ%type; BEGIN if inserting then v_typ := 'I'; elsif updating then v_typ := 'U'; else v_typ := 'D'; end if; WRITE_TEILNEHMER_JN (p_tln_id => coalesce(:new.tln_id, :old.tln_id), p_tln_name => coalesce(:new.tln_name, :old.tln_name), p_tln_groesse => coalesce(:new.tln_groesse, :old.tln_groesse), p_tln_geburtstag => coalesce(:new.tln_geburtstag, :old.tln_geburtstag), p_jntyp => v_typ ); END;