2015-10-06 62 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觸發器來做到這一點)。