错误PLS-00049:触发器中的绑定变量错误,无法找出原因?

时间:2017-01-15 13:15:54

标签: sql plsql oracle10g

CREATE OR REPLACE TRIGGER delete_pictures
AFTER DELETE ON "Pictures"
FOR EACH ROW
BEGIN
  DELETE FROM "Photograph"
  WHERE Photograph.ID_Picture=:old.ID_Picture;
  DELETE FROM "Painting"
  WHERE Painting.ID_Picture=:old.ID_Picture;
END;

我有这个sql触发器,当我尝试将它添加到我的数据库时,我得到一个PLS-00049:在booth OLD变量的错误绑定变量。我对sql还不是很好,并且不知道为什么会发生这种情况以及如何纠正它我看了其他的情况,但它并没有真正帮助我解决这个问题。基本上我要做的是如果父元素被删除我也想删除他的孩子。

2 个答案:

答案 0 :(得分:0)

这是做你想做的错误的方法。您正在寻找on delete cascade外键触发器。

alter table photograph
    add constraint fk_photograph_picture
        foreign key (picture) references picture(id_picture) on delete cascade;

alter table painting
    add constraint fk_painting_picture
        foreign key (picture) references picture(id_picture) on delete cascade;

Here是了解级联删除的资源。

答案 1 :(得分:0)

最有可能的是,表ID_PICTURE中没有名为Pictures的列(不是ID_PICTURE的大写拼写)。

在Oracle中使用小写名称是一种不好的做法。 Oracle区分大小写。但SQL语句中的未加引号的名称会自动转换为大写。因此,如果您真的在表名和列名中使用小写字母,则必须始终将它们用双引号括起来。

你的触发器应该是:

CREATE OR REPLACE TRIGGER delete_pictures
AFTER DELETE ON "Pictures"
FOR EACH ROW
BEGIN
  DELETE FROM "Photograph"
  WHERE "Photograph"."ID_Picture" = :old."ID_Picture";
  DELETE FROM "Painting"
  WHERE "Painting"."ID_Picture" = :old."ID_Picture";
END;

但首先不要使用小写名称和双引号会更容易。