Небольшие изменения в вашем операторе удаления
DELETE FROM supplier
WHERE supplier_id = d_supplier_id
AND NOT EXISTS (SELECT 1
FROM supplier_product,
supplier_invoice
WHERE supp_invoice_id = supp_invoice_id
AND supplier_id = d_supplier_id);
IF SQL%ROWCOUNT = 0 THEN
RAISE Invoice_exists_exception;
END IF;
, и это обеспечит удаление записей поставщика только в том случае, если в таблице supplier_product не существует записей с одинаковым идентификатором поставщика и связанным идентификатором счета-фактуры.
Конечно, если FK установлены (как вы упомянули) - тогда должно возникать исключение при попытке удалить ..
Обновление: я использовал SQLFiddle для построения образец схемы / данных, чтобы показать это :
Если у вас настроены внешние ключи, вы столкнетесь с нарушением целостности ORA-02292: ограничение целостности, которое вы можете соответствующим образом перехватить и обработать.