为什么触发器不更新Oracle数据库中的列值?

Kri*_*hna 1 oracle triggers oracle11g

我正在使用oracle 11gR1数据库.问题是,我有一个表格,下面给出了一个脚本: -

CREATE TABLE TEST(
  ID       NUMBER, 
  CATEGORY VARCHAR2(19),
  CODE     VARCHAR2(20),
  URI      VARCHAR2(160));
Run Code Online (Sandbox Code Playgroud)

现在我的目标是创建一个触发器,URITEST表中的行插入或更新时,每次使用下面计算的字符串更新列.

URI列将使用'uri://cateogry/code'.所以我创建了一个触发器:

CREATE OR REPLACE TRIGGER TEST_URI_UPDATE_TRIG
AFTER INSERT OR UPDATE OF CATEGORY, CODE ON TEST
FOR EACH ROW
  DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION; --added later after getting error(mutating, trigger/function may not see it error) during insertion
  BEGIN
    DBMS_OUTPUT.PUT_LINE('-------------EXECUTING TRIGGER----------');

    UPDATE TEST
       SET URI = 'uri://' || upper(:NEW.CATEGORY) || '/' || upper(:NEW.CODE)
     WHERE ID = :NEW.id;

    --Just to print the output
    DBMS_OUTPUT.PUT_LINE('OLD VALUE IS : ' || :OLD.ID || '   EXECUTING TRIGGER ID IS : ' || :NEW.ID);
    DBMS_OUTPUT.PUT_LINE('OLD VALUE IS : ' || UPPER(:OLD.CATEGORY) || '   EXECUTING TRIGGER ID IS : ' || upper(:NEW.CATEGORY));
    DBMS_OUTPUT.PUT_LINE('OLD VALUE IS : ' || UPPER(:OLD.CODE) || '   EXECUTING TRIGGER ID IS : ' || upper(:NEW.CODE));
    COMMIT; --added later after getting error(mutating, trigger/function may not see it error) during insertion
  END;
/
Run Code Online (Sandbox Code Playgroud)

值将仅插入ID, CATEGORY, CODE不在列中的URI列中.

现在,如果我在TEST表中插入或更新值.

触发器不更新表的URITEST(不知道为什么).即使通过DBMS_OUTPUT打印消息打印值.

我尝试VIRTUAL COLUMN在Oracle中使用,但这不符合我的要求,因为我希望URI列值必须存在于数据库中,这是不可能的.

所以,请你帮助我,并建议任何方式来做到这一点.

Ren*_*ene 5

创建前行触发器.然后更改URI值,如下所示

:NEW.URI := 'uri://'||upper(:NEW.CATEGORY)||'/'||upper(:NEW.CODE);
Run Code Online (Sandbox Code Playgroud)

无需选择或更新.使用以下内容可以获得这些值:NEW伪列,