Ada beberapa masalah dengan pemicu Anda. Mari kita mulai dengan 'hubungan' antara pernyataan pilih dan kode yang tersisa. Dalam kasus khusus ini select..
dan if...end_if
(untuk saat ini anggap pilihan Anda benar-benar berfungsi, itu tidak tetapi hanya berasumsi). Sekarang berkonsentrasilah pada klausa WHERE.
SELECT SUPPLIER.TRUSTED_SUPPLIER
INTO TRUST
...
WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';
IF TRUST = 'NO' THEN ...
Karena pilihan Anda HANYA mengembalikan YA, pernyataan if tidak akan pernah Benar. Oleh karena itu pengecualian aplikasi tidak pernah dapat dimunculkan. Sekarang, apa masalah dengan select
.
Pertama-tama Anda mengakses tabel yang memicu pemicu. Meskipun dalam beberapa kasus Anda dapat lolos begitu saja tetapi biasanya menghasilkan ORA -04091:tabel
Namun klausa INTO mengharuskan pernyataan untuk mengembalikan tepat 1 baris . Lebih dari 1 baris menghasilkan pengecualian, dan 0 baris menghasilkan no data found
pengecualian.
Akhirnya ada masalah dengan raise_application_error statement
. Jika dieksekusi akan memunculkan argumen angka...di luar jangkauan pengecualian. Parameter pertama harus antara -20999 hingga -20000 (Bilangan negatif). Jadi seperti apa hasilnya:
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;
/
CATATAN:
JANGAN gunakan tipe data VARCHAR. Itu diperbolehkan tetapi Oracle merekomendasikan untuk tidak melakukannya. Berarti mereka berhak untuk mengubah apa yang dilakukannya setiap saat. Gunakan VARCHAR2 yang direkomendasikan sebagai gantinya.
Saya mengubah pemicu untuk diaktifkan pada Sisipkan atau Perbarui. Jika diaktifkan di Sisipkan, hanya seseorang yang BISA mengubah nama_pemasok menjadi referensi pemasok yang tidak tepercaya dan semuanya akan baik-baik saja.