我已经创建了包含一个电影表,用于存放电影+副本可用信息一个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