CREATE OR REPLACE TYPE ausbildung AS TABLE OF VARCHAR2(100) / CREATE OR REPLACE TYPE varchar2_100 AS TABLE OF VARCHAR2(100) / CREATE TABLE kursteilnehmer_jn (id NUMBER, kursteilnehmer_id NUMBER, name VARCHAR2(100 BYTE), punkte NUMBER, log_date DATE, dml VARCHAR2(1 BYTE), telnr HR.VARCHAR2_100) NESTED TABLE telnr STORE AS telnr_store CREATE TABLE kursteilnehmer (id NUMBER , name VARCHAR2(100 BYTE), ausbildung HR.AUSBILDUNG, create_date DATE, change_date DATE, punkte NUMBER) NESTED TABLE ausbildung STORE AS store_ausbildung / -- Indexes for KURSTEILNEHMER CREATE UNIQUE INDEX sys_c009774 ON kursteilnehmer ( ausbildung ASC ) / -- Constraints for KURSTEILNEHMER ALTER TABLE kursteilnehmer ADD CONSTRAINT kursteilnehmer_name_uk UNIQUE (name) / ALTER TABLE kursteilnehmer ADD CONSTRAINT kursteilnehmer_id_pk PRIMARY KEY (id) / CREATE OR REPLACE PROCEDURE make_kursteilnehmer_jn ( p_dml IN varchar2, p_id IN number, p_name in varchar2 default null, p_punkte in number default null, p_telnr in varchar2_100 default null) IS BEGIN insert into kursteilnehmer_jn ( id, kursteilnehmer_id, name, punkte, log_date, dml, telnr ) values ( s.nextval, p_id, p_name, p_punkte, sysdate, p_dml, p_telnr ); END; -- Procedure / -- Triggers for KURSTEILNEHMER CREATE OR REPLACE TRIGGER kursteilnehmer_insert_id_trg BEFORE INSERT ON kursteilnehmer REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW begin :new.id := s.nextval; :new.create_date := sysdate; end; / CREATE OR REPLACE TRIGGER kursteilnehmer_change_date_trg BEFORE UPDATE ON kursteilnehmer REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW begin :new.change_date := sysdate; end; / CREATE OR REPLACE TRIGGER kursteilnehmer_log_trg AFTER INSERT OR DELETE OR UPDATE ON kursteilnehmer REFERENCING NEW AS NEW OLD AS OLD declare v_dml varchar2(1); begin if inserting then v_dml := 'I'; elsif updating then v_dml := 'U'; else v_dml := 'D'; end if; insert into log (logging) values (v_dml||' :kursteilnehmer'); end; / CREATE OR REPLACE TRIGGER kursteilnehmer_jn_trg AFTER INSERT OR DELETE OR UPDATE OF punkte, id, name, changed ON kursteilnehmer REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW declare v_dml varchar2(1); cursor c_tel_per_kursteilnehmer(p_id number) is select telnr from kt_telefon where kursteilnehmer_id = p_id; v_telnr varchar2_100 := varchar2_100(); begin v_dml := (case when inserting then 'I' when updating then 'U' else 'D' end); open c_tel_per_kursteilnehmer(coalesce(:new.id, :old.id)); fetch c_tel_per_kursteilnehmer bulk collect into v_telnr; close c_tel_per_kursteilnehmer; make_kursteilnehmer_jn( p_dml => v_dml, p_id => coalesce(:new.id, :old.id), p_name => coalesce(:new.name, :old.name), p_punkte => coalesce(:new.punkte, :old.punkte), p_telnr => v_telnr ); end; / CREATE TABLE kt_telefon (id NUMBER, kursteilnehmer_id NUMBER, telnr VARCHAR2(30 BYTE)) / ALTER TABLE kt_telefon ADD CONSTRAINT kt_telefon_kt_id_fk FOREIGN KEY (kursteilnehmer_id) REFERENCES kursteilnehmer (id) ON DELETE CASCADE / CREATE OR REPLACE TRIGGER kt_telefon_jn_trg BEFORE INSERT OR DELETE OR UPDATE ON kt_telefon REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW declare v_name varchar2(100); v_punkte number; v_telnr varchar2_100 := varchar2_100(); cursor c_tel_per_kursteilnehmer(p_id number) is select telnr from kt_telefon where kursteilnehmer_id = p_id; begin select name, punkte into v_name, v_punkte from kursteilnehmer where id = coalesce(:new.kursteilnehmer_id, :old.kursteilnehmer_id); open c_tel_per_kursteilnehmer( coalesce(:new.kursteilnehmer_id, :old.kursteilnehmer_id)); fetch c_tel_per_kursteilnehmer bulk collect into v_telnr; close c_tel_per_kursteilnehmer; v_telnr.extend; v_telnr(v_telnr.last) := coalesce(:new.telnr,:old.telnr); make_kursteilnehmer_jn( p_dml => 'U', p_id => coalesce(:new.kursteilnehmer_id,:old.kursteilnehmer_id), p_telnr => v_telnr, p_name => v_name, p_punkte => v_punkte ); end; /