Có một số vấn đề với trình kích hoạt của bạn. Hãy bắt đầu với 'mối quan hệ' giữa một câu lệnh chọn và mã còn lại. Trong trường hợp cụ thể này, select..
và if...end_if
(hiện tại giả sử lựa chọn của bạn thực sự hoạt động, nó không hoạt động nhưng chỉ giả sử). Bây giờ tập trung vào mệnh đề WHERE.
SELECT SUPPLIER.TRUSTED_SUPPLIER
INTO TRUST
...
WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';
IF TRUST = 'NO' THEN ...
Vì lựa chọn của bạn chỉ trả về CÓ nên câu lệnh if sẽ không bao giờ đúng. Do đó, ngoại lệ ứng dụng không bao giờ có thể được nâng lên. Bây giờ, vấn đề với select
là gì .
Trước tiên, bạn đang truy cập vào bảng mà trình kích hoạt được kích hoạt. Mặc dù trong một số trường hợp, bạn có thể thoát khỏi nó nhưng thường thì nó dẫn đến ORA -04091:bảng
Tuy nhiên, mệnh đề INTO yêu cầu câu lệnh trả về chính xác 1 hàng . Thêm vào đó, 1 hàng dẫn đến ngoại lệ và 0 hàng dẫn đến no data found
ngoại lệ.
Cuối cùng, có một vấn đề với câu lệnh raise_application_error statement
. Nếu nó được thực thi, nó sẽ đưa ra một đối số number ... nằm ngoài phạm vi ngoại lệ. Tham số đầu tiên phải nằm trong khoảng từ -20999 đến -20000 (Số âm). Vì vậy, kết quả trông như thế nào:
create or replace trigger verify_supplier_trust
before insert or update on product
for each row
declare
trust varchar2(3);
begin
select supplier.trusted_supplier
into trust
from supplier
where supplier.company_name = :new.supplier_name
and supplier.trusted_supplier = 'YES';
exception
when no_data_found then
raise_application_error(-20001, 'supplier not trusted');
end;
/
LƯU Ý:
KHÔNG sử dụng kiểu dữ liệu VARCHAR. Nó được phép nhưng Oracle khuyến cáo không nên. Có nghĩa là họ bảo lưu quyền thay đổi những gì nó làm bất cứ lúc nào. Sử dụng VARCHAR2 được đề xuất thay thế.
Tôi thay đổi trình kích hoạt để kích hoạt trên Chèn hoặc Cập nhật. Nếu được kích hoạt trên Chèn chỉ ai đó CÓ THỂ thay đổi tên nhà cung cấp để tham chiếu đến một nhà cung cấp không đáng tin cậy và tất cả đều ổn.