2014-03-19 81 views
0

我已經創建了包含一個電影表,用於存放電影+副本可用信息一個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)子句,則觸發器將放大,但會將所有可用副本遞減爲電影表中的所有電影,這是不正確的。

回答

1

嘗試這樣的:

CREATE OR REPLACE TRIGGER After_Sale 
AFTER INSERT ON SALE 
FOR EACH ROW 
BEGIN 
    UPDATE FILM 
    SET COPIES_AVAILABLE = COPIES_AVAILABLE - 1 
    WHERE FILM.FILM_ID = :NEW.FILM_ID 
END; 
+0

嘿感謝您的答覆,其實這是非常接近我原來的嘗試,但遺憾的是這會導致SALE.SALE_TRANSACTION_REF被標記爲無效的標識,這是我假設,因爲我們沒有指定,我們正在使用的銷售表在這個觸發器?當我刪除AND子句時,它會將sale.film_id作爲無效標識符?? – Dobhaweim

+0

我更新我的答案,在'SALE.FILM_ID'處使用'NEW.FILM_ID'。但我不明白你爲什麼需要這樣的:'AND(SALE.SALE_TRANSACTION_REF =(SELECT Sale_Seq.CURRVAL FROM DUAL));'沒有意義,或者說我不理解@Dobhaweim – CodeBird

+0

我已經更新了問題來澄清代碼的所需功能。對不起,它不明確。 – Dobhaweim

0

爲什麼保存COPIES_AVAILABLE到數據庫。如果你想知道可用的副本,你爲什麼不減少[所有的副本] - [所有出售的副本]。

相關問題