2015-10-06 60 views
0

我想写一个触发器,它基本上在另一个表上创建一个表时更新一个表。PLS-00049:坏绑定变量'NEW.REQUEST_DATETIME'问题

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

该错误似乎暗示'request_context'中没有'request_datetime'。在那儿?一旦你解决了这个问题,你就不能改变':old.seq_number',所以没有任何意义。你不能从'request_context'中选择。为什么你会生成一个随机数而不是仅仅使用一个序列来生成':new.id'? –

+0

您是否试图使用':NEW'来引用您要插入的表格中的列,而不是触发器所针对的表格?你可以直接在'values'子句中使用'sysdate'。然而':OLD'参考仍然令人困惑。你似乎对什么新旧代表感到困惑。 –

回答

0

你似乎对correlation pseudorows是什么以及他们持有和可以做什么感到困惑。看起来您正在处理:NEW,就好像它与您在插入到触发器内的REQUEST_LIFECYCLES表相关,而:OLD就好像它与已插入或更新并导致触发器触发的REQUEST_CONTEXT行相关。

OLDNEW参照触发器违反的表REQUEST_CONTEXT。如果触发器被更新触发,则OLD具有受影响行的更新前值;如果它是由插入引发的,那么它是空的,因为没有旧状态。无论哪种方式,NEW都具有当前状态,具有新插入的值或更新后的值。您无法更改OLD值,并且在'after'触发器中更改NEW值没有任何意义。您也不需要查询触发器触发的表,因为NEW pseudorow已经使该信息可用。

所以,如果你想使用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; 
/

我假设你想设置的“生命周期”尽管你试图设置:OLD的值 - 希望旧的参考是一个错误。如果您尝试在REQUEST_CONTEXTREQUEST_LIFECYCLES中设置该值,则需要在插入/更新触发器之前设置该值,并在将values子句中的值用于而不是:OLD之前。

正如贾斯汀所说的那样,使用一个随机值作为ID是相当奇怪的,并非最不重要,因为它不会是唯一的,而且序列更常见。您实际上可能需要插入/更新行中的ID,在这种情况下,您可以在值子句中引用:NEW.ID而不是生成新值。 (也有可能你试图设置这个ID也在REQUEST_CONTEXTREQUEST_LIFECYCLES之间,但是那会更奇怪,而且你需要一个before-insert/update触发器来做到这一点)。