我正在使用 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
列值,这是不可能的。
你能不能请任何人帮助我,并建议任何方式去做。
答案 0 :(得分:5)
创建前行触发器。然后将URI值更改为
:NEW.URI := 'uri://'||upper(:NEW.CATEGORY)||'/'||upper(:NEW.CODE);
无需选择或更新。可以使用以下内容获取这些值:NEW伪列