CREATE OR REPLACE PROCEDURE UPSERT_TEILNEHMER ( /* wir uebergeben an die prozedur name, birthday height gender und ENTWEDER inserten wir den teilnehmer ODER machen ein update auf den schon vorhandenen Teilnehmer */ p_tln_name in teilnehmer.tln_name%type, p_tln_birthday in teilnehmer.tln_birthday%type, p_tln_height in teilnehmer.tln_height%type, p_gen_name in gender.gen_name%type ) AS e_no_such_gender exception; pragma exception_init (e_no_such_gender, -20001); v_gen_id number; BEGIN begin select gen_id into v_gen_id from gender where gen_name = p_gen_name; exception when no_data_found then raise e_no_such_gender; -- raise_application_error(e_no_such_gender, 'account past due.'); end; insert into teilnehmer ( tln_id, tln_name, tln_birthday, tln_height, tln_gen_id ) values ( seq.nextval, p_tln_name, p_tln_birthday, p_tln_height, v_gen_id ); exception when dup_val_on_index then update teilnehmer set tln_birthday = p_tln_birthday, tln_height = p_tln_height, tln_gen_id = v_gen_id where tln_name = p_tln_name; END UPSERT_TEILNEHMER; END; -- Procedure