标签: mutating-table

Oracle触发器 - 变异表的问题

我的桌子:

TableA (id number, state number)
TableB (id number, tableAId number, state number)
TableC (id number, tableBId number, state number)
Run Code Online (Sandbox Code Playgroud)

因此TableC中的项是TableB的子项,TableB中的项是TableA的子项.反之亦然 - TableA中的项是TableB的父项,TableB中的项是TableC的父项.

我想控制父项的状态......比方说,我们有这些数据:

TableA (id, state): 
1, 40

TableB (id, tableAId, state): 
1, 1, 40
2, 1, 60

TableC (id, tableBId, state): 
1, 1, 40
2, 1, 50
3, 2, 60
4, 2, 70
Run Code Online (Sandbox Code Playgroud)

父母国家应该始终保持他孩子最小的状态.所以如果我们现在像这样更新TableC:

update TableC set state = 50 where Id = 1;
Run Code Online (Sandbox Code Playgroud)

我的触发器应该自动更新TableB(设置状态= 50,其中id = 1),然后更新TableA(设置状态= 50,其中id = 1)

我想用触发器(在表A,表B,表C上进行更新,插入,删除之后)执行此操作,以便在执行每个操作后执行以下步骤:

  1. 得到父ID
  2. 从当前父母的所有孩子中找到最小的状态
  3. 如果所有子项的最小状态大于父项的状态,则更新父项

如何避免"改变表错误"?在此示例中是否可以节省使用自治事务?我看到一些意见,变异表错误表明应用程序的逻辑存在缺陷 - 这是真的吗?如何更改我的逻辑以防止此错误? …

oracle triggers ora-04091 mutating-table

6
推荐指数
2
解决办法
5129
查看次数

如何从一个触发器的过程中修复此Mutating表

此触发器将插入的值传递给过程,该过程将这些值插入另一个表中.我收到了一个变异表错误.我怎样才能解决这个问题?

CREATE OR REPLACE TRIGGER ADD_INVOICE
BEFORE INSERT OR UPDATE OF APP_NO,C_NO ON APPOINTMENT
FOR EACH ROW
DECLARE
BEGIN

POP_INVOICE(:NEW.APP_NO,:NEW.C_NO,:NEW.APP_DATE);

END;
/

CREATE OR REPLACE PROCEDURE POP_INVOICE(
I_APP_NO IN INVOICE.APP_NO%TYPE,
I_C_NO IN INVOICE.C_NO%TYPE,
I_INV_DATE IN INVOICE.INV_DATE%TYPE)
AS
CURSOR C_POP IS SELECT PRICE FROM TREATMENT T,APPOINTMENT A 
WHERE T.TRT_NO=A.TRT_NO
AND A.APP_NO=I_APP_NO;

V_BILL INVOICE.BILL%TYPE;
BEGIN

OPEN C_POP; 
FETCH C_POP INTO V_BILL;

UPDATE INVOICE
SET INV_NO=INV_IDSEQ.NEXTVAL,
APP_NO=I_APP_NO,
C_NO=I_C_NO,
BILL=V_BILL,
INV_DATE=I_INV_DATE;

END;
/
Run Code Online (Sandbox Code Playgroud)

oracle triggers plsql mutating-table

4
推荐指数
1
解决办法
452
查看次数

ORACLE更新后触发:解决ORA-04091变异表错误

我正在尝试创建一个触发器:

  create or replace trigger NAME_OF_TRIGGER
  after insert or update on table1
  REFERENCING OLD AS OLD NEW AS NEW
  for each row
Run Code Online (Sandbox Code Playgroud)

在更新/插入表格时自动填写几个非强制字段.

这需要我使用从table2和table1(触发器的主题)中选择的游标.

有没有办法避免变异表错误而不使用临时表值或自治事务?

sql oracle triggers plsql mutating-table

3
推荐指数
1
解决办法
1万
查看次数

INSERT触发器,用于在同一个表中插入记录

我有一个触发器,因为我想在同一个表中插入新记录,因此在表中插入新记录时会触发.
我的触发器是:

create or replace trigger inst_table
after insert on test_table referencing new as new old as old  
for each row
declare 
      df_name varchar2(500);
      df_desc varchar2(2000);

begin
      df_name := :new.name;
      df_desc := :new.description;

     if inserting then
          FOR item IN (SELECT pid FROM tbl2 where pid not in(1))
             LOOP
                 insert into test_table (name,description,pid) values(df_name,df_desc,item.pid); 
             END LOOP;    
     end if; 
end;
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误

ORA-04091: table TEST_TABLE is mutating, trigger/function may not see it

我认为它阻止我插入到同一个表中.
那我怎么能把这个新记录插入到同一个表中.

注意: - 我使用Oracle作为数据库

oracle triggers insert mutating-table

2
推荐指数
1
解决办法
2万
查看次数

简单的oracle触发器

简单的一个.我有点像PLSql的新手,oracle的错误信息永远不会太有帮助.

我想做一个简单的触发器来更新具有当前日期的列,即表的"修改日期"列.虽然得到一个奇怪的错误.

这个想法很简单

create table test1 (tcol varchar2(255), tcol2 varchar2(255))

CREATE OR REPLACE TRIGGER testTRG
AFTER INSERT OR UPDATE ON test1
FOR EACH ROW
BEGIN 
     update test1
     set tcol2 =  to_char(sysdate)
     where tcol = :OLD.tcol;
END;

insert into test1 (tcol) values ('test1');
Run Code Online (Sandbox Code Playgroud)

这会弹出错误:

ORA-04091: table RAIDBIDAT_OWN.TEST1 is mutating, trigger/function may not see it
ORA-06512: at "RAIDBIDAT_OWN.TESTTRG", line 2
ORA-04088: error during execution of trigger 'RAIDBIDAT_OWN.TESTTRG'
Run Code Online (Sandbox Code Playgroud)

有人可以快速解决这个问题吗?

干杯,

F.

oracle triggers plsql ora-04091 mutating-table

0
推荐指数
1
解决办法
5812
查看次数

标签 统计

mutating-table ×5

oracle ×5

triggers ×5

plsql ×3

ora-04091 ×2

insert ×1

sql ×1