Bạn đã gần tới; bạn cần một khối DECLARE trong trình kích hoạt nếu bạn muốn khai báo bất cứ điều gì; điều này có nghĩa là mệnh đề WHEN của bạn không đúng chỗ.
create or replace trigger trig1
before update
of sal
on emp
for each row
when (new.sal < old.sal)
declare
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
begin
raise user_xcep;
end;
SQL Fiddle
Một vài điểm:
- Không bao giờ bắt một ngoại lệ và sau đó gọi DBMS_OUTPUT.PUT_LINE; nó là vô nghĩa. Một người nào đó phải ở đó để xem kết quả cho mỗi và mọi bản ghi. Nếu bạn không muốn điều gì đó xảy ra, hãy nâng cao ngoại lệ và sau đó nắm bắt nó. Tôi đã thêm mã lỗi vào ngoại lệ của bạn để bạn có thể bắt mã này bên ngoài trình kích hoạt và xử lý nó theo cách bạn muốn (không in bất kỳ thứ gì ra stdout).
- Đó là một điểm nhỏ nhưng tôi đã thêm một chút khoảng trắng; không nhiều. Ban đầu, tôi không thể biết vấn đề với mã của bạn là do đâu vì bạn không có bất kỳ mã nào.
- Bạn đã thiếu dấu chấm phẩy sau khai báo ngoại lệ và RAISE.
Đọc thêm về các trường hợp ngoại lệ được xác định nội bộ trong tài liệu