gpt4 book ai didi

oracle - PL/SQL 触发器无法正常工作

转载 作者:行者123 更新时间:2023-12-02 06:46:06 25 4
gpt4 key购买 nike

我的触发器有问题。创建触发器后,它给我消息

BD1.UTILIZADOR is in mutation, trigger cant read or execute

我有这张 table

    create table UTILIZADOR 
(
U_ID NUMBER(6) not null,
U_NOME VARCHAR2(60) not null,
U_SEXO VARCHAR2(10) not null,
U_IDADE NUMBER(3) not null,
U_ALTURA NUMBER(3) not null,
U_PESO NUMBER(6) not null,
U_IMC NUMBER(2,2),
U_PRIVILEGIOS NUMBER(1) not null,
U_PASSWORD VARCHAR2(10) not null,
constraint PK_UTILIZADOR primary key (U_ID)
);

如果我这样做:

INSERT INTO UTILIZADOR (U_ID,U_NOME,U_SEXO,U_IDADE,U_ALTURA,U_PESO,U_PRIVILEGIOS,U_PASSWORD) VALUES (1,'my name','Male',32,174,74000,0,'password');

然后

SELECT * FROM UTILIZADOR;

我可以看到一切都如预期。

我想要做的是,在插入或更新 U_ALTURA 或 U_PESO 时,字段 U_IMC 会自动更新/插入。

如果这样做的话会发生什么:

CREATE OR REPLACE TRIGGER CALCULA_IMC
AFTER INSERT OR UPDATE OF U_ALTURA, U_PESO ON UTILIZADOR
FOR EACH ROW
BEGIN
UPDATE UTILIZADOR
SET U_IMC = (U_PESO / 1000) / (POWER(U_ALTURA / 100,2));
END;
/

有人可以告诉我我做错了什么吗?

最佳答案

您的触发器代码正在更新 UTILIZADOR 表中的每条记录,这将包括您的 INSERT 语句刚刚插入的记录,我假设您不希望每条记录每当您向表中插入新记录时,表中的记录都会更新。

当您在插入或更新后触发火灾时,它实际上会无限递归地调用自身,而您确实不希望这样。

您需要更多地了解触发器,然后才能有效地执行您想做的操作。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm

http://www.techonthenet.com/oracle/triggers/

这是一篇关于改变表和触发器的精彩文章,并提供了一些解决该问题的建议:

http://www.oracle-base.com/articles/9i/MutatingTableExceptions.php

很可能有更好的方法来实现您的目标,例如您可以使用 BEFORE INSERT OR UPDATE 触发器并将更新分配给 :NEW 值在触发器主体等中发出新的UPDATE

行级触发器无法读取或写入触发它的表。但是,语句级触发器可以。

希望对你有帮助...

关于oracle - PL/SQL 触发器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8244249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com