PLS-00049:错误的绑定变量'NEW.REQUEST_DATETIME'问题

时间:2015-10-06 18:44:31

标签: sql oracle11g triggers

我正在尝试编写一个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;

1 个答案:

答案 0 :(得分:0)

您似乎对correlation pseudorows的内容以及它们所拥有和可以做的事情感到困惑。看起来您正在处理:NEW,就好像它与您在触发器中插入的REQUEST_LIFECYCLES表相关,而:OLD就好像它与{REQUEST_CONTEXT相关1}}已插入或更新的行并导致触发器触发。

OLDNEW都会引用触发器所针对的表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_CONTEXTREQUEST_LIFECYCLES中设置该值,则需要使用之前的插入/更新触发器,并设置:NEW.SEQ_NUMBER而不是:OLD值,在values子句中使用它之前。

正如贾斯汀所说,使用ID的随机值是相当奇怪的,尤其是因为它不是唯一的,并且序列更常见。您实际上可能需要插入/更新的行中的ID,在这种情况下,您只需引用values子句中的:NEW.ID而不是生成新值。 (您也可能尝试在REQUEST_CONTEXTREQUEST_LIFECYCLES设置该ID,但这会更加陌生,而且您也可以无论如何都需要一个before-insert / update触发器。)