【问题标题】:oracle trigger to update a new row of view while inserting new row in a tableoracle 触发器在向表中插入新行时更新视图的新行
【发布时间】:2018-09-07 00:05:55
【问题描述】:

有人可以帮我在 oracle 表达式视图 x 上编写触发器,该视图 x 通过选择查询从另一个表 y 填充数据。

逻辑: 在表 y 中插入新行后;当表 y 中插入行上的新列的值为“xyz”时,我想根据插入到表 y 的新行上的条件“xyz”更新表达式视图 x 的某些列。

有人可以帮忙吗?

钱德拉

【问题讨论】:

  • “表达式视图”是什么意思?如果您有一个视图,其查询引用您正在更新的表,它无论如何都会看到新值 - 您不需要触发器。如果它没有引用该表,那么您可以使用触发器来更新它正在引用的表,尽管这意味着数据没有被规范化。目前尚不清楚您真正想要做什么。
  • 嗨,Alex,感谢您的更新,我想编写一个触发器,它将更新同一张表上新插入行的 2 列,if 条件将检查新插入行的另一列值.
  • 那么视图是从哪里进入的呢?您现在似乎指的是一个表中的多行,而不是两个表。编辑您的问题以阐明您真正需要实现的目标;显示表定义、视图定义(如果有且相关)、示例起始数据、您将运行的插入语句和预期结果。它可能仍然太宽泛,但目前无法判断。
  • 嗨,Alex,我指的不是表格中的多行。我只有一张桌子假设“测试”。有 4 列 A、B、C、D。何时将新行插入“测试”; A 列的值将位于比较块中(如果条件)。如果条件为真,那么我需要更新行的 C、D 列而不影响 B 列的值。所有事务都将在新的单行和单表“测试”上。这有什么意义吗?我想要一个触发器在为单个表插入时在新行上执行此任务。

标签: database oracle triggers oracle12c


【解决方案1】:

这就是我理解问题的方式(不过,更多的是通过阅读 cmets 而不是“表达视图”让我感到困惑的问题)。

这将是一个基于触发器的解决方案;它检查输入 A 列的值是否大于 100(这是您的“如果条件”);如果是这样,它会同时修改 C 和 D 列。如果没有,它什么也做不了。

SQL> create table test (a number, b number, c number, d number);

Table created.

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4    when (new.a > 100)
  5  begin
  6    :new.c := 3;
  7    :new.d := 4;
  8  end;
  9  /

Trigger created.

SQL> insert into test (a) values (50);

1 row created.

SQL> insert into test (a) values (200);

1 row created.

SQL> select * from test;

         A          B          C          D
---------- ---------- ---------- ----------
        50
       200                     3          4

SQL>

【讨论】:

  • 谢谢小脚。我会试试这个。此触发器是否适用于新表的行或已存在的具有行的表?如果我有更多 when 条件怎么办?
  • 触发器仅适用于新添加的行;现有的不受影响 - 您必须编写另一段代码来更新它们。如果有更多条件,请将它们添加到 WHEN 子句中。如果你不能,还有旧的 IF-THEN-ELSE,在 PL/SQL 中可用(触发 is)。
  • 嗨,小脚,我按照你说的方法做了,但是触发器不能按照我的要求工作。如果我详细说明您的要求可以吗?
  • 当然;编辑您的问题并发布新信息(只是不要在评论中全部输入)。
  • 嗨小脚;我以不同的可能方式完成了需求实现。感谢您的宝贵帮助。
猜你喜欢
  • 2017-06-26
  • 2010-12-22
  • 2021-10-13
  • 2019-03-23
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
相关资源
最近更新 更多