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;