CREATE OR REPLACE TRIGGER KrowieBezpieczenstwo 
  BEFORE INSERT OR UPDATE OF NrBoksu ON bydlo
  FOR EACH ROW
declare
  v_miejsca		boksy.miejsca%TYPE;
  v_zajete_miejsca	INTEGER;
  v_plec_pary		bydlo.plec%TYPE;
  v_imie_pary		bydlo.imie%TYPE;
  v_ciele		INTEGER;
begin
  begin
    select miejsca into v_miejsca
      from boksy
      where :new.NrBoksu = boksy.nr;
  exception
    when no_data_found then
      raise_application_error(-20001, 'Nie ma boksu o nrze ' || :new.NrBoksu);
  end;

  select count(*) into v_zajete_miejsca
    from Bydlo
    where Bydlo.NrBoksu = :new.NrBoksu;

  if v_zajete_miejsca = v_miejsca then
      raise_application_error(-20002, 'Brak miejsc w boksie o nrze ' 
							|| :new.NrBoksu);
  end if;

  if v_zajete_miejsca = 1 and v_miejsca = 2 then
    select plec, imie into v_plec_pary, v_imie_pary
      from bydlo
      where nrboksu = :new.nrboksu; 

    if :new.Plec = 'K' and v_plec_pary = 'B' then

      select count(*) into v_ciele
        from bydlopoczete
        where imiematki = :new.imie;
      if v_ciele > 0 then
        raise_application_error(-20003, 'Wstawienie byka do ciezarnej krowy');
      end if; 

    elsif :new.Plec = 'B' and v_plec_pary = 'K' then

      select count(*) into v_ciele
        from bydlopoczete
        where imiematki = v_imie_pary;
      if v_ciele > 0 then
        raise_application_error(-20004, 'Wstawienie ciezarnej krowy do byka');
      end if; 

    end if;
  end if;
end;
/
