Как создать хранимую процедуру удаления, убедившись, что ее нельзя удалить, если у нее есть связанные записи в другой таблице? - PullRequest
0 голосов
/ 27 марта 2012

У меня есть таблицы

  • поставщик (supplier_id (pk), имя, адрес) supplier_invoice (supp_invoice-id (pk), баланс)
  • supplier_product (supp_prod_id (pk),Supplier_id (fk), product_id (fk), supp_invoice_id (fk))

Я пытаюсь выполнить процедуру удаления:

set serveroutput on;
create or replace
procedure delete_supp
(d_supplier_id int)
is
v_count  int;
begin
select count(*) into v_count from supplier_product where d_supplier_id=supplier_id;
    if v_count > 0 then
        dbms_output.put_line('Supplier cannot be deleted because there is an existing invoice in the system');
    else    
begin
delete from supplier where supplier_id=d_supplier_id;
 DBMS_OUTPUT.PUT_LINE('Deleted '  || SQL%ROWCOUNT || ' Rows.'); 
commit;
  end;
end if;
    Exception
when others then
    dbms_output.put_line('Delete failed');          
end;
/

Эта процедура работает, но не проверяет,запись существует в supplier_product, я хочу убедиться, что поставщик не может быть удален, если у него есть открытый счет-фактура в таблице supplier_invoice.Я попытался с циклом в таблице supplier_invoice, но не смог заставить его работать.

1 Ответ

1 голос
/ 27 марта 2012

Небольшие изменения в вашем операторе удаления

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: ограничение целостности, которое вы можете соответствующим образом перехватить и обработать.

...