我已經創建了包含一個電影表,用於存放電影+副本可用信息一個DVD商店數據庫和銷售表。我爲Film和Sale表創建序列,使用以下代碼分別自動遞增主鍵FILM_ID和SALE_TRANSACTION_REF。SQL觸發遞減另一個表
CREATE SEQUENCE Film_Seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
NOCACHE;
CREATE OR REPLACE TRIGGER New_Film
BEFORE INSERT ON FILM
FOR EACH ROW
BEGIN
SELECT Film_Seq.NEXTVAL
INTO :new.FILM_ID
FROM dual;
END;
/
這似乎是工作不夠方便,但是當我嘗試使用觸發器與下面的代碼售後遞減電影膠片的COPIES_AVAILABLE屬性,我得到一個錯誤:
CREATE OR REPLACE TRIGGER After_Sale
AFTER INSERT ON SALE
DECLARE
ID NUMBER(38) := Sale_Seq.CURRVAL;
BEGIN
UPDATE FILM
SET COPIES_AVAILABLE = COPIES_AVAILABLE - 1
FROM FILM, SALE
WHERE FILM.FILM_ID = SALE.FILM_ID
AND (SALE.SALE_TRANSACTION_REF = ID);
END;
/
其實我得到兩個錯誤,第一個涉及聲明語句,這是
4/2 PL/SQL: SQL Statement ignored
,第二個與UPDATE語句做的,這是
6/2 PL/SQL: ORA-00933: SQL command not properly ended
我破壞了我的大腦,試圖以不同的方式構造這個聲明,並且搜索了文檔,但似乎無法找到答案,並且將不勝感激。
而且,看在我的問題可能不是很明顯,但我已經創造了一個sale_seq。
對不起,它可能不明顯什麼,我想在這裏實現。無論何時將電影出售並添加到銷售表中,我都希望自動減少電影表中相應電影的Copie_Available,因此,如果我忽略了AND AND (SALE.SALE_TRANSACTION_REF = Sale_Seq.CURRVAL)
子句,則觸發器將放大,但會將所有可用副本遞減爲電影表中的所有電影,這是不正確的。
嘿感謝您的答覆,其實這是非常接近我原來的嘗試,但遺憾的是這會導致SALE.SALE_TRANSACTION_REF被標記爲無效的標識,這是我假設,因爲我們沒有指定,我們正在使用的銷售表在這個觸發器?當我刪除AND子句時,它會將sale.film_id作爲無效標識符?? – Dobhaweim
我更新我的答案,在'SALE.FILM_ID'處使用'NEW.FILM_ID'。但我不明白你爲什麼需要這樣的:'AND(SALE.SALE_TRANSACTION_REF =(SELECT Sale_Seq.CURRVAL FROM DUAL));'沒有意義,或者說我不理解@Dobhaweim – CodeBird
我已經更新了問題來澄清代碼的所需功能。對不起,它不明確。 – Dobhaweim