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

时间:2015-11-20 13:19:10

标签: oracle oracle11g triggers

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

CREATE TABLE TEST(
  ID       NUMBER, 
  CATEGORY VARCHAR2(19),
  CODE     VARCHAR2(20),
  URI      VARCHAR2(160));

现在我的目标是创建一个触发器,当URI中的行插入或更新时,每次使用以下计算的字符串更新TEST

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;
/

值只会插入不在ID, CATEGORY, CODE列中的URI列。

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

触发器不会更新URI表的TEST列(不知道原因)。即使通过DBMS_OUTPUT打印消息打印了值。

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

你能不能请任何人帮助我,并建议任何方式去做。

1 个答案:

答案 0 :(得分:5)

创建前行触发器。然后将URI值更改为

:NEW.URI := 'uri://'||upper(:NEW.CATEGORY)||'/'||upper(:NEW.CODE);

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