2017-01-15 79 views
0
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:在展位OLD變量上的壞綁定變量。我用sql還不是很好,不知道爲什麼會發生這種情況,以及如何糾正它,我查看了其他這種情況,但這並沒有真正幫助我解決這個問題。基本上我想要做的是如果父元素被刪除我也想刪除他的孩子。錯誤PLS-00049:觸發器中的綁定變量錯誤,找不到原因?

回答

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是瞭解級聯刪除的資源。

0

最有可能的是,在表Pictures(不是ID_PICTURE的大寫拼寫)中沒有稱爲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; 

但它會更容易在第一時間沒有使用小寫的名字和雙引號。