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