2014-02-13 80 views
0

如何更新舊行值。我已經使用:舊變量,但它不適合我。在我的代碼中,如果PID已經存在於項目表中,即(varProjectExists = 1),那麼我更新付款期限。現在,如果付款條件是空的,我想是飛行SQL更新語句中的新舊變量

CREATE OR REPLACE TRIGGER TRIG_PROJECT_INSERT AFTER 
    INSERT ON TEST_SYN_EAI_PROJECT_IN FOR EACH row DECLARE varError_Msg NVARCHAR2(100); 
    varSucceeded NVARCHAR2(1); 
    varActive_YN NVARCHAR2(50); 
    varProject_Id INT; 
    varPid   INT ; 
    varPay_Term  VARCHAR2(200); 
    varPay_Term1  VARCHAR2(200); 
    varError_id  INT; 
    varCurr_activeyn INT; 
    varProjectExists NUMBER; 
    BEGIN 
    varError_Msg   := 'No error'; 
    varSucceeded   := 'Y'; 
    varError_id    := 0; 
    varProjectExists  := 0; 
    varPID     := :new.pid; 
    varPay_Term    := :new.ATTRIBUTE1; 
    varPay_Term1   := :old.ATTRIBUTE1; 
    varActive_YN   := :new.active_yn; 
    varProject_ID   := :new.project_id; 
    IF (NVL(varProject_Id,0) = 0) THEN 
     varError_Msg   := 'project ID can not be null'; 
     varSucceeded   := 'N'; 
     varError_id   := 1; 
    END IF; 
    SELECT 
     CASE 
     WHEN (UPPER(varActive_YN) = 'ACTIVE' 
     OR UPPER(varActive_YN) = 'Y') 
     THEN 1 
     WHEN (UPPER(varActive_YN) = 'INACTIVE' 
     OR UPPER(varActive_YN) = 'N') 
     THEN 0 
     ELSE varcurr_activeyn 
     END 
    INTO varActive_YN 
    FROM Dual; 
    SELECT COUNT(1) 
    INTO varProjectExists 
    FROM project 
    WHERE ProjectUniversalID = varProject_ID; 
    IF (varProjectExists  = 1) THEN 
     UPDATE project 
     SET PID  = varPID, 
     PAYMENTTERM = 
     CASE 
      WHEN varPay_Term = 'NULL' 
      THEN varPay_Term1 
      WHEN varPay_Term IS NULL 
      THEN varPay_Term1 
      ELSE varPay_Term 
     END 
    ELSE ..... 
+0

您無法更改「舊」值。你想達到什麼目的? –

+0

無論如何,沒有'insert'觸發器的'OLD'記錄。 (好吧,但是一切都是空的)。 'OLD'和'NEW'只對'update'有意義。你期望什麼? - 你期望'varPay_Term1'被設置爲什麼,來自不同記錄的值?事實上,問題標題是指更新,但是你正在創建一個'插入後觸發器 - 你真的這是什麼意思? –

+0

如果付款期限爲空,我想更新PROJECT表中已有的以前付款期限值,否則我需要新的付款期限來自TEST_SYN_EAI_PROJECT_IN表。我希望它澄清。 –

回答

1

OLD僞記錄是指當前行的更新前的狀態,所以以前的paymnent長期價值還有新的付款條款更新僅在updatedelete操作期間纔有意義。如果您要插入新記錄,則不會指向「舊」狀態。

根據您的評論,您希望使用PROJECT表中已有的以前的付款期限值。無論如何,這不會在OLD中可用,因爲它不是觸發器所針對的表格。如果是這種情況,那麼你需要在檢查它存在的同時檢索它。

CREATE OR REPLACE TRIGGER TRIG_PROJECT_INSERT 
AFTER INSERT ON TEST_SYN_EAI_PROJECT_IN 
FOR EACH ROW 
DECLARE 
    ... 
BEGIN 
    ... 
    varPay_Term    := :new.ATTRIBUTE1; 
    -- varPay_Term1   := :old.ATTRIBUTE1; -- not valid 
    varActive_YN   := :new.active_yn; 
    ... 

    -- this doesn't need to select from dual, you can assign directly 
    varCurr_activeyn := CASE 
    WHEN (UPPER(varActive_YN) = 'ACTIVE' 
     OR UPPER(varActive_YN) = 'Y') 
     THEN 1 
    WHEN (UPPER(varActive_YN) = 'INACTIVE' 
     OR UPPER(varActive_YN) = 'N') 
     THEN 0 
    ELSE varCurr_activeyn 
    END CASE; 

    -- get the current term as you check if a record exists 
    SELECT COUNT(1), MAX(PAYMENTTERM) 
    INTO varProjectExists, varPay_Term1 
    FROM project 
    WHERE ProjectUniversalID = varProject_ID; 

    IF (varProjectExists = 1) THEN 
    UPDATE project 
    SET PID  = varPID, 
     PAYMENTTERM = 
     CASE 
     WHEN varPay_Term = 'NULL' 
     THEN varPay_Term1 
     WHEN varPay_Term IS NULL 
     THEN varPay_Term1 
     ELSE varPay_Term 
     END 
... 

,是因爲你已經在使用聚合COUNT(),以避免無數據發現錯誤,如果ID不存在所需要的MAX():喜歡的東西。假設ID是唯一的,那麼使用MAXMIN就沒有關係,結果是相同的。 (如果它不是唯一的,那麼你必須決定使用哪個術語值,所以這可能是一個安全的假設)。

+0

謝謝亞歷克斯。你很好地理解和澄清了情況 –