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

Fav*_*las 2 oracle triggers plsql

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

BD1.UTILIZADOR处于变异状态,触发器无法读取或执行

我有这张桌子

    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)
    );
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

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');
Run Code Online (Sandbox Code Playgroud)

然后

SELECT * FROM UTILIZADOR;
Run Code Online (Sandbox Code Playgroud)

我可以看到一切都如预期的那样.

我想做的是,当插入或更新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;
/
Run Code Online (Sandbox Code Playgroud)

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

Oll*_*lie 5

您的触发器代码正在更新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在触发器主体中发出新内容等.

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

希望能帮助到你...