我有一张桌子电影。
create table Movie
(
mv_id number(5),
mv_name varchar2(30),
startdate date
)
insert into Movie values(1,'AVATAR','8-MAR-2012');
insert into Movie values(2,'MI3','20-MAR-2012');
insert into Movie values(3,'BAD BOYS','10-Feb-2012');
我想创建一个触发器,以确保如果satrt date早于当前日期则不会删除任何记录。 我的触发器代码是 -
create or replace trigger trg_1
before delete
on Movie
for each row
when(old.startdate < sysdate)
begin
raise_application_error(-20001, 'Records can not be deleted');
end;
触发器已创建。当我执行此代码以删除数据时 -
delete from Movie where mv_id=1;
然后触发器触发但有错误,我不知道为什么我会收到这样的错误。 我不想要任何错误,我只想要消息。 这是错误 -
delete from Movie where mv_id=1
*
ERROR at line 1:
ORA-20010: Records can not be deleted
ORA-06512: at "OPS$0924769.TRG_1", line 3
ORA-04088: error during execution of trigger 'OPS$0924769.TRG_1'
我想摆脱这个错误。
答案 0 :(得分:5)
表上的触发器阻止任何操作的唯一方法是抛出异常。您不能拥有阻止DELETE
并打印消息的触发器。
您可以编写一个触发器,尝试显示消息并允许删除发生
create or replace trigger trg_1
before delete
on Movie
for each row
when(old.startdate < sysdate)
begin
dbms_output.put_line( 'Records can not be deleted');
end;
如果客户端恰好配置为显示写入DBMS_OUTPUT
缓冲区的数据(大多数客户端不会),则会显示一条消息。但它也会让删除成功,这听起来不像你想要的那样。
答案 1 :(得分:1)
在删除语句中添加异常处理。
您需要做的就是在其自己的BEGIN和END块中编写delete语句,并处理从触发器抛出的异常。如果符合条件,则不会删除任何行;但是,将使用DBMS_OUTPUT命令显示拒绝删除记录的消息。
以下代码可以满足您的需求:
BEGIN
DELETE FROM MOVIE WHERE MV_ID = 1;
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE('Records can not be deleted.');
END;
您可以在“输出”窗口中查看消息。下面是执行上面的查询块后我在PL / SQL开发人员中得到的输出。
无法删除记录。
我希望它有所帮助。