oracle中的表发生变化

拉吉·达迪亚

我有一个表,participated它有一个触发器,当新记录插入表中时,它返回驱动程序 ID 的总损坏量。

create or replace trigger display  
  after insert on participated 
  for each row 
declare 
  t_id integer; 
  total integer;
begin
  select driver_id, sum(damage_amount) 
    into t_id, total 
    from participated  
    where :new.driver_id = driver_id 
    group by driver_id; 

  dbms_output.put_line(' total amount  ' || total' driver id' || t_id); 
end;
/

触发器已创建,但返回此错误:

ORA-04091: table SQL_HSATRWHKNJHKDFMGWCUISUEEE.PARTICIPATED is mutating, 
trigger/function may not see it ORA-06512: at 
"SQL_HSATRWHKNJHKDFMGWCUISUEEE.DISPLAY", line 5
ORA-06512: at "SYS.DBMS_SQL", line 1721

请帮忙解决这个触发器。

吉比

如上所述,这感觉就像代码的味道。行级触发器不能更改正在更改的表,因为这会触发另一个触发器,这将导致调用触发器的无限循环。

将其更改为语句级触发器并不是在做同样的事情。

首选解决方案:1)将其放入应用程序逻辑,并在插入行后进行计算 - 正如@kfinity 提到的那样,这很简单。

2) 指定新插入的行并使用语句级触发器。例如,有一个额外的列,比如 is_new 默认 1 - 因此所有新插入的行都将具有此标志。然后使用@hbourchi 建议的语句级触发器计算并更新 is_new 为 1 的所有驱动程序,然后将此标志设置回零

3) 2) 中的逻辑可以使用 pl/sql 和内存中的 pl/sql 表来实现。pl/sql 表使用行级触发器收集受影响的驱动程序 ID,然后更新所选驱动程序的总数。Tom Kyte 在这方面有很多例子,这不是火箭科学,但是如果你缺乏 PL/SQL 知识,那么这可能不是你的方式。(对于注:PL / SQL使用Oracle时超重要-不,甲骨文只是一个昂贵的Excel工作表像任何其他数据库使用它的价值。)

4)可能,您应该修改您的数据模型 - 问题会自行解决。参加每个驱动器种类表显示多行。您想计算每个驱动程序 ID 的总行数 - 为什么要将汇总放在同一张表中?只需添加一个新表,parted_total,其中包含 driver_id 和 damage_amount 字段。然后按照您最初的计划随意从触发器插入或更新它!

5) 事实上,您可以通过在查询时简单地制作正确的 SQL 来即时计算这些总数(取决于行数和您的性能预期) - 这样就无需存储预先计算的总数。

6) 但如果您希望 Oracle 为您存储这些总计,您可以执行 5) 并使用物化视图。这些是实际表,由 Oracle 自动更新和维护,因此您在 5) 处的实际查询不需要即时计算任何内容,但可以从物化视图中获取自动预先计算的数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SCD2中事实表中的重复行尺寸发生变化

来自分类Dev

Oracle SQL - 触发器正在发生变化

来自分类Dev

在MATLAB中写入后像素值发生变化

来自分类Dev

表格中的输入导致表格宽度发生变化

来自分类Dev

为什么数组元素中的值发生变化?

来自分类Dev

python中的函数调用后变量发生变化

来自分类Dev

为什么/ proc / meminfo中的MemTotal发生变化?

来自分类Dev

堆栈中的代码本身会发生变化

来自分类Dev

查找 SQL Server 中的值何时发生变化

来自分类Dev

DataFrame 中相同的字典同时发生变化

来自分类Dev

iBeacon在后台发生变化?

来自分类Dev

Android片段发生变化

来自分类Dev

Grep行的列发生变化

来自分类Dev

如何使布局发生变化?

来自分类Dev

$watch 服务发生变化时

来自分类Dev

继承:被继承的值发生变化

来自分类Dev

每当另一个表发生变化时更新 MySQL 表

来自分类Dev

当函数中的值发生变化时,指针不反映变化

来自分类Dev

切换行时,列宽会发生变化(在宽度为100%的表上)

来自分类Dev

添加样式表后,QPushButton的尺寸会发生变化

来自分类Dev

容器道具在儿童状态变化后发生变化

来自分类Dev

当工作表中的单元格发生变化时,如何防止Google工作表中的NOW()函数每次更新?

来自分类Dev

在 Android 中滚动时,ListView 中的图像正在发生变化

来自分类Dev

当 Store 中对象中的数据发生变化时更新 React

来自分类Dev

在MIT App Inventor 2中处于横向模式时背景图像发生变化

来自分类Dev

为什么HashSet的keySet中的元素顺序在运行之间会发生变化?

来自分类Dev

存储在通用集合中后,重载和多态行为发生变化

来自分类Dev

Matlab中的Geoshow-打印到TIFF文件时,面色发生变化

来自分类Dev

Lucene 3.0.3中的地理空间搜索-API是否会发生变化?

Related 相关文章

  1. 1

    SCD2中事实表中的重复行尺寸发生变化

  2. 2

    Oracle SQL - 触发器正在发生变化

  3. 3

    在MATLAB中写入后像素值发生变化

  4. 4

    表格中的输入导致表格宽度发生变化

  5. 5

    为什么数组元素中的值发生变化?

  6. 6

    python中的函数调用后变量发生变化

  7. 7

    为什么/ proc / meminfo中的MemTotal发生变化?

  8. 8

    堆栈中的代码本身会发生变化

  9. 9

    查找 SQL Server 中的值何时发生变化

  10. 10

    DataFrame 中相同的字典同时发生变化

  11. 11

    iBeacon在后台发生变化?

  12. 12

    Android片段发生变化

  13. 13

    Grep行的列发生变化

  14. 14

    如何使布局发生变化?

  15. 15

    $watch 服务发生变化时

  16. 16

    继承:被继承的值发生变化

  17. 17

    每当另一个表发生变化时更新 MySQL 表

  18. 18

    当函数中的值发生变化时,指针不反映变化

  19. 19

    切换行时,列宽会发生变化(在宽度为100%的表上)

  20. 20

    添加样式表后,QPushButton的尺寸会发生变化

  21. 21

    容器道具在儿童状态变化后发生变化

  22. 22

    当工作表中的单元格发生变化时,如何防止Google工作表中的NOW()函数每次更新?

  23. 23

    在 Android 中滚动时,ListView 中的图像正在发生变化

  24. 24

    当 Store 中对象中的数据发生变化时更新 React

  25. 25

    在MIT App Inventor 2中处于横向模式时背景图像发生变化

  26. 26

    为什么HashSet的keySet中的元素顺序在运行之间会发生变化?

  27. 27

    存储在通用集合中后,重载和多态行为发生变化

  28. 28

    Matlab中的Geoshow-打印到TIFF文件时,面色发生变化

  29. 29

    Lucene 3.0.3中的地理空间搜索-API是否会发生变化?

热门标签

归档