【问题标题】:problem in instead of delete views in oracleoracle中的问题而不是删除视图
【发布时间】:2020-02-08 12:10:30
【问题描述】:

我的看法是:

select * from ot.vw_rebellionrid;

这是给我看的:

full_name 是trainer 表的列 subject_name 是 subject 表的列

视图有查询:

SELECT full_name, subject_name
     FROM ot.trainer, ot.subject;

所以,我正在学习instead of delete tigger,所以instead of trigger的代码是:

CREATE OR REPLACE TRIGGER ot.io_delete
INSTEAD OF DELETE ON ot.vw_RebellionRid
FOR EACH ROW
BEGIN
  DELETE FROM ot.trainer WHERE FULL_NAME = :old.FULL_NAME;
  DELETE FROM ot.subject WHERE SUBJECT_NAME= :old.SUBJECT_NAME;
END;
/

所以,要执行这个触发器,我执行以下语句:

delete from ot.vw_RebellionRid where subject_name='java';

当它被执行时,那么:

2 rows deleted.

根据我的理解,由于这两行有subject_name作为java剩下的输出,我想会在删除之后:

--------------------------
full_name | subject_ name |
---------------------------
Manish Sharma Oracle      |
ashwin        Oracle      |
---------------------------

但是当我执行时

select * from ot.vw_RebellionRid ;

然后,我得到了 EMPTY TABLE 的输出;

因为,有 4 行,2 行被删除,但是当我再次选择视图时,我如何得到空表?我应该得到剩下的两行。

【问题讨论】:

    标签: database oracle plsql oracle11g


    【解决方案1】:

    我认为您的触发器工作正常。

    DELETE FROM ot.trainer WHERE FULL_NAME = :old.FULL_NAME;
    

    它将删除名称为 manish 和 ashwin 的 2 行,因为它们都被标记为 java。

    同理,

    DELETE FROM ot.subject WHERE SUBJECT_NAME= :old.SUBJECT_NAME;
    

    它将从表主题中删除主题 java,因此现在表 subject 将剩余 1 条记录,即Oracle

    现在,您的视图查询将连接 2 个表(trainer 0 行表和 subject 1 行表),因此它不会产生任何结果。

    你需要明白这一点,

    delete from ot.vw_RebellionRid where subject_name='java';
    

    正在删除总共 3 条记录。

    干杯!!

    【讨论】:

    • 我是新手而不是触发器。当触发触发器时,如果 subject_name='java';匹配,然后触发 Delete 语句或仅触发 DELETE FROM 主题?我对此感到困惑
    • 如果您想知道语句将删除哪些所有记录:delete from ot.vw_RebellionRid where subject_name='java';,然后执行以下选择,将从该选择中获取的记录将被删除:select * from ot.vw_RebellionRid where subject_name='java';
    • 好的,非常感谢。在实际情况下真的使用这个而不是触发器吗?
    • 是的,它被使用了,它让我的事情变得简单(它隐藏了复杂性)
    【解决方案2】:

    问题是在调试您的问题时,您没有完成。您的INSTEAD OF DELETE 触发器肯定删除了某些内容,但要确定删除了什么,您需要查看视图下的表。如果您执行 DELETE 语句,然后检查 TRAINER 和 SUBJECT 的内容,您会发现唯一剩下的就是 SUBJECT 中的 Oracle 行。如果您查看您的触发器并想想您告诉它做什么,您会意识到它完全按照您告诉它做的事情去做,即使那可能不是您想要的。 p>

    dbfiddle here

    【讨论】:

    • 我是新手而不是触发器。当触发触发器时,如果 subject_name='java';匹配,然后触发 Delete 语句或仅触发 DELETE FROM 主题?我对此感到困惑-
    • 所有触发器中的代码都被执行了,这意味着DELETE FROM TRAINER和DELETE FROM SUBJECT语句都被执行了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多