Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建触发器将使用新的insert触发_Sql_Oracle - Fatal编程技术网

Sql 创建触发器将使用新的insert触发

Sql 创建触发器将使用新的insert触发,sql,oracle,Sql,Oracle,我想在将新电影插入电影表时创建一个触发器 如果一部电影有特别的“预告片”,我想把租金提高10美分 如果一部电影有特别的“评论”,我想把租金提高20美分 如果一部电影有“删除场景”的特殊功能,我想把租金提高20美分 如果一部电影有“幕后”的特殊功能,我想把租金降低20美分 我所做的是 CREATE OR REPLACE TRIGGER RENTALRATE_TRIGGER BEFORE INSERT OR UPDATE ON FILM REFERENCING OLD AS OLD NE

我想在将新电影插入电影表时创建一个触发器

  • 如果一部电影有特别的“预告片”,我想把租金提高10美分
  • 如果一部电影有特别的“评论”,我想把租金提高20美分
  • 如果一部电影有“删除场景”的特殊功能,我想把租金提高20美分
  • 如果一部电影有“幕后”的特殊功能,我想把租金降低20美分
我所做的是

    CREATE OR REPLACE TRIGGER RENTALRATE_TRIGGER
BEFORE INSERT OR UPDATE ON FILM
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
    IF :NEW.SPECIAL_FEATURES LIKE '%Trailers%' THEN
        UPDATE FILM SET RENTAL_RATE = :NEW.RENTAL_RATE + .10;
    IF :NEW.SPECIAL_FEATURES LIKE '%Commentaries%' THEN
        UPDATE FILM SET RENTAL_RATE = :NEW.RENTAL_RATE + .50;
    IF :NEW.SPECIAL_FEATURES LIKE '%Deleted Scenes%' THEN
        UPDATE FILM SET RENTAL_RATE = :NEW.RENTAL_RATE + .20;
    IF :NEW.SPECIAL_FEATURES LIKE '%Behind the Scenes%' THEN
        UPDATE FILM SET RENTAL_RATE = :NEW.RENTAL_RATE - .20;
    END IF;
END RENTALRATE_TRIGGER;
/
我在创建触发器后收到此错误

LINE/COL ERROR
-------- -----------------------------------------------------------------
11/5     PLS-00103: Encountered the symbol "RENTALRATE_TRIGGER" when
         expecting one of the following:
         if
特写专栏可以是这样的,“预告片,幕后”


谢谢。

您不应该在触发器中更新同一个表:

    CREATE OR REPLACE TRIGGER RENTALRATE_TRIGGER
        BEFORE INSERT OR UPDATE
        ON FILM
        REFERENCING OLD AS OLD NEW AS NEW
        FOR EACH ROW
    BEGIN
        IF :NEW.SPECIAL_FEATURES LIKE '%Trailers%'
        THEN
            :NEW.RENTAL_RATE := :NEW.RENTAL_RATE + .10;
        ELSIF :NEW.SPECIAL_FEATURES LIKE '%Commentaries%'
        THEN
            :NEW.RENTAL_RATE := :NEW.RENTAL_RATE + .50;
        ELSIF :NEW.SPECIAL_FEATURES LIKE '%Deleted Scenes%'
        THEN
            :NEW.RENTAL_RATE := :NEW.RENTAL_RATE + .20;
        ELSIF :NEW.SPECIAL_FEATURES LIKE '%Behind the Scenes%'
        THEN
            :NEW.RENTAL_RATE := :NEW.RENTAL_RATE - .20;
        END IF;
    END RENTALRATE_TRIGGER;

首先,如果将逗号分隔的值列表存储在一列中,则违反了规范化的所有规则。看起来您对PL/SQL还很陌生,所以您不太可能希望从一个非常不正确的数据模型开始。你确定不想创建一个单独的表来将文件映射到它的特殊功能吗?嗨,贾斯汀,我知道你说的,我同意你的看法。这是一个大学作业,它是一个大表格,包含了我在问题中提到的所有内容。这是大学作业的一个可悲的特点,它们似乎是为了通过隐藏错误的实践来培养差劲的程序员。尽管我认为如果大学讲师擅长编程,他们可能不会是大学讲师:)请注意,这只适用于一个特殊特性比率。如果列表中有多个条目,则只应用一个速率差。