CREATE OR REPLACE PROCEDURE TEILNEHMER_EDUCATION /* + zusaetzlich zum teilnehmernamen eine zusätzliche ausbildung (p_add_education) angeben und die an die schon vorhandenen anhaengen und den Teilnehmer damit updaten */ (p_tln_name teilnehmer.tln_name%type, p_add_education varchar2 ) AS t_education education; BEGIN select coalesce(tln_education, education() ) into t_education from teilnehmer where tln_name = p_tln_name; -- dbms_output.put_line(t_education.count); t_education.extend; t_education(t_education.last) := p_add_education; update teilnehmer set tln_education = t_education where tln_name = p_tln_name; if t_education.count <> 0 then for i in 1..t_education.last loop -- dbms_output.put_line(t_education(1)||' '|| t_education.count); dbms_output.put_line(t_education(i)); end loop; end if; END TEILNEHMER_EDUCATION; CREATE OR REPLACE TYPE ausbildung AS TABLE OF VARCHAR2(100) CREATE TABLE "HR"."KURSTEILNEHMER" ("ID" NUMBER, "NAME" VARCHAR2(100), "AUSBILDUNG" "HR"."AUSBILDUNG" ) NESTED TABLE ausbildung STORE AS store_ausbildung CREATE SEQUENCE "HR"."S"; PROCEDURE teilnehmer_ausbildung ( p_name VARCHAR2, p_add_ausbildung VARCHAR2) IS t_ausbildung ausbildung := ausbildung(); c INTEGER; f BOOLEAN := FALSE; al number; BEGIN SELECT COUNT (id) INTO c FROM kursteilnehmer WHERE name = p_name; IF c = 0 THEN INSERT INTO kursteilnehmer (id, name, ausbildung) VALUES (s.NEXTVAL, p_name, ausbildung (p_add_ausbildung)); ELSE SELECT ausbildung INTO t_ausbildung FROM kursteilnehmer WHERE name = p_name; FOR i IN 1 .. t_ausbildung.last LOOP IF t_ausbildung (i) = p_add_ausbildung THEN f := TRUE; END IF; END LOOP; IF f = FALSE THEN t_ausbildung.EXTEND; t_ausbildung (t_ausbildung.last) := p_add_ausbildung; UPDATE kursteilnehmer SET ausbildung = t_ausbildung WHERE name = p_name; END IF; END IF; /* FOR i IN 1 .. t_ausbildung.LAST LOOP DBMS_OUTPUT.put_line (t_ausbildung (i)); END LOOP;*/ END; -- Procedure