我正在尝试编写一个Trigger,当在另一个表上创建一个条目时,它基本上会更新一个表。
CREATE OR REPLACE TRIGGER "DTISCDB_OWNER"."REQUEST_CONTEXT_TR"
AFTER INSERT OR UPDATE ON REQUEST_CONTEXT
FOR EACH ROW
BEGIN
:NEW.REQUEST_DATETIME := SYSDATE;
:NEW.ID := TRUNC(DBMS_RANDOM.VALUE(100000000000000000000000000000000000,999999999999999999999999999999999999));
SELECT bre_conditions_seq.NEXTVAL INTO :OLD.seq_number FROM dual;
SELECT REQUEST_CONTEXT.CURRENT_STATE INTO :NEW.STATE FROM REQUEST_CONTEXT;
SELECT REQUEST_CONTEXT.REQUEST_ID INTO :NEW.REQUEST_ID FROM REQUEST_CONTEXT;
INSERT INTO REQUEST_LIFECYCLES(ID,SEQ_NUMBER,STATE,REQUEST_ID,REQUEST_DATETIME)
VALUES(:NEW.ID,:NEW.seq_number,:NEW.STATE,:NEW.REQUEST_ID,:NEW.REQUEST_DATETIME);
END;
答案 0 :(得分:0)
您似乎对correlation pseudorows的内容以及它们所拥有和可以做的事情感到困惑。看起来您正在处理:NEW
,就好像它与您在触发器中插入的REQUEST_LIFECYCLES
表相关,而:OLD
就好像它与{REQUEST_CONTEXT
相关1}}已插入或更新的行并导致触发器触发。
OLD
和NEW
都会引用触发器所针对的表REQUEST_CONTEXT
。如果更新触发了触发器,则OLD
具有受影响行的更新前值;如果它是由插入触发的那么它是空的,因为没有旧的状态。两种方式NEW
都具有当前状态,具有新插入或更新后的值。您无法更改OLD
值,更改“{1}}后的值NEW
是没有意义的。触发。您也不需要查询触发触发器的表,因为NEW
伪已经使该信息可用。
因此,如果您尝试使用REQUEST_CONTEXT
中的插入/更新值在REQUEST_LIFECYCLES
中创建行,则可以执行以下操作:
CREATE OR REPLACE TRIGGER "DTISCDB_OWNER"."REQUEST_CONTEXT_TR"
AFTER INSERT OR UPDATE ON REQUEST_CONTEXT
FOR EACH ROW
BEGIN
INSERT INTO REQUEST_LIFECYCLES(ID, SEQ_NUMBER, STATE, REQUEST_ID,
REQUEST_DATETIME)
VALUES(TRUNC(DBMS_RANDOM.VALUE(100000000000000000000000000000000000, 999999999999999999999999999999999999)),
bre_conditions_seq.NEXTVAL, :NEW.CURRENT_STATE, :NEW.REQUEST_ID,SYSDATE);
END;
/
我假设您想要设置生命周期'尽管您尝试设置SEQ_NUMBER
值,但来自触发器的:OLD
值 - 希望旧引用是错误的。如果您尝试在REQUEST_CONTEXT
和REQUEST_LIFECYCLES
中设置该值,则需要使用之前的插入/更新触发器,并设置:NEW.SEQ_NUMBER
而不是:OLD
值,在values
子句中使用它之前。
正如贾斯汀所说,使用ID的随机值是相当奇怪的,尤其是因为它不是唯一的,并且序列更常见。您实际上可能需要插入/更新的行中的ID,在这种情况下,您只需引用values子句中的:NEW.ID
而不是生成新值。 (您也可能尝试在REQUEST_CONTEXT
和REQUEST_LIFECYCLES
中设置该ID,但这会更加陌生,而且您也可以无论如何都需要一个before-insert / update触发器。)