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