【问题标题】:I get an error about if part in trigger - Oracle我收到关于 if part in trigger 的错误 - Oracle
【发布时间】:2021-03-19 03:57:53
【问题描述】:

我有触发器,在添加或删除时改变总数;

CREATE OR REPLACE TRIGGER branch_number_change
AFTER UPDATE ON Branch
FOR EACH ROW
BEGIN
   IF Staff.inserting 
   THEN
     UPDATE branchTotalStaffNumber
     SET branchTotalStaffNumber = branchTotalStaffNumber + 1
     WHERE branchNo = old.branchNo;
   END IF;
   IF Staff.deleting
   THEN 
     UPDATE branchTotalStaffNumber
     SET branchTotalStaffNumber = branchTotalStaffNumber - 1
    WHERE branchNo = old.branchNo;
   END IF;
END;

当我运行 sql 命令时,它会给出很多错误,并且不会将第二个 end if 部分添加到触发器中。问题出在哪里?

这是错误;

从第 65 行开始的错误命令 -
更新 branchTotalStaffNumber
SET branchTotalStaffNumber = branchTotalStaffNumber - 1
WHERE branchNo = old.branchNo
命令行错误:65 列:13
错误报告 - SQL 错误:ORA-00942: tablo veya görüntü mevcut 德吉尔
00000 - “表或视图不存在”
*原因:
*行动:
从第 68 行开始的错误命令 - END IF 错误报告 -
未知命令

如果你能帮忙,我会很高兴!

【问题讨论】:

  • 欢迎来到 SO! “很多错误”对我们没有多大帮助,请发布实际的错误消息。
  • 我添加了实际错误
  • 这看起来很像“zeynep”刚刚在stackoverflow.com/questions/65187312/… 发布的问题。你在同一门课上,做同样的作业吗?我会回应他得到的回应(mathguy在那里打败了我)。您根本不应该存储“totalstaffnumber”。基本规则,不要存储在运行时容易计算的内容。我从事这项业务将近 40 年,可以向您保证,如果您这样做,储值与现实不同步。
  • @EdStevens 显然我们可能在同一门课程中。谢谢你的回答!
  • 每当我看到两个关于同一个查询的帖子时,我的第一个想法是“这两个家伙在同一个班级做同一个作业问题,我的第二个想法是”他们为什么不说话互相帮助/互相帮助?”

标签: sql oracle plsql triggers


【解决方案1】:

请参阅我关于此练习的智慧的评论。至于实际的错误代码,要么:

  1. 鉴于您没有使用它们的所有者来限定表名(即:'UPDATE branchTotalStaffNumber' 与 'UPDATE owner.branchTotalStaffNumber'),我的猜测是发出命令的用户不是表的所有者。或

  2. 指定的表不存在(如错误所示)或

  3. 发出命令的用户没有必要的权限。

【讨论】:

    【解决方案2】:

    您的代码包含基本语法错误。

    1. 条件谓词独立,没有前缀:INSERTING、DELETING
    2. 命名空间采用冒号::OLD, :NEW
    3. 当操作是插入时,没有 :OLD 命名空间
    4. 您的触发器会检查 INSERTING 或 DELETING,但仅在 UPDATE 时触发

    您的触发器应如下所示:

    CREATE OR REPLACE TRIGGER branch_number_change
    AFTER INSERT OR UPDATE OR DELETE ON Branch
    FOR EACH ROW
    BEGIN
       IF inserting 
       THEN
         UPDATE branchTotalStaffNumber
         SET branchTotalStaffNumber = branchTotalStaffNumber + 1
         WHERE branchNo = :new.branchNo;
       END IF;
       IF deleting
       THEN 
         UPDATE branchTotalStaffNumber
         SET branchTotalStaffNumber = branchTotalStaffNumber - 1
         WHERE branchNo = :old.branchNo;
       END IF;
    END;
    

    Oracle PL/SQL 参考中有大量正确语法的示例。通过将代码与文档中的内容进行比较,您可以轻松回答未来的问题。我建议你bookmark it for future reference


    您的触发器的逻辑似乎确实存在问题。它正在增加一个总数,其名称表明它正在维护 员工成员 的计数。但触发器位于 BRANCH 表而不是 STAFF 或 EMPLOYEE 表上。此外,您正在更新与表同名的列branchTotalStaffNumber:对吗?这可以解释为什么您会收到 ORA-00942 错误吗?

    鉴于此,也许您的触发器应该像这样在 STAFF 上:

    CREATE OR REPLACE TRIGGER staff_number_change
    AFTER INSERT OR UPDATE OR DELETE ON Staff
    FOR EACH ROW
    BEGIN
       IF inserting 
       THEN
         UPDATE branch
         SET branchTotalStaffNumber = branchTotalStaffNumber + 1
         WHERE branchNo = :new.branchNo;
       END IF;
       IF deleting
       THEN 
         UPDATE branch
         SET branchTotalStaffNumber = branchTotalStaffNumber - 1
         WHERE branchNo = :old.branchNo;
       END IF;
    
       IF updating 
       and :new.branchNo != :old.branchNo
       THEN
         UPDATE branch
         SET branchTotalStaffNumber = branchTotalStaffNumber + 1
         WHERE branchNo = :new.branchNo;
         UPDATE branch
         SET branchTotalStaffNumber = branchTotalStaffNumber - 1
         WHERE branchNo = :old.branchNo;
       END IF;
    END;
    

    【讨论】:

    • 哇,我明白了,非常感谢!! :)
    • 顺便说一句,我得到了ORA-00942错误,因为你说的原因,我明白你说的。
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多