2014-03-19 42 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到数据库。如果你想知道可用的副本,你为什么不减少[所有的副本] - [所有出售的副本]。

相关问题