2010-02-23 85 views
3

我正在嘗試爲表創建標準的UPDATE查詢。但是,如果滿足某些條件,則應該在UPDATE語句中包含/排除某些列。在Oracle中的動態更新查詢

例如:

UPDATE TBL_PROJECT SET 
    REVISION_COUNT = V_REVISION_COUNT 
    ,PRIMARY_BRANCH = IN_PRIMARY_BRANCH 
    ,PROJECT_STATUS = IN_PROJECT_STATUS 
    ... 
    WHERE PROJECT_ID = IO_PROJECT_ID 
    AND REVISION_COUNT = IO_REVISION_COUNT 
    RETURNING REVISION_COUNT INTO IO_REVISION_COUNT'; 

然而,表中有兩列用於提交併獲得批准。所以如果狀態設置爲提交或批准,我希望這些列進行更新。例如。

IF IN_PROJECT_STATUS = 'SUB' 
    UPDATE TBL_PROJECT SET 
    SUBMITTED_DATE = SYSDATE 
ELSIF IN_PROJECT_STATUS = 'APP' 
    UPDATE TBL_PROJECT SET 
    APPROVED_DATE = SYSDATE 
END; 

我還需要返回受影響(行數)行REVISION_COUNT和數量,以檢查是否更新成功與否。

寫這個查詢的最好方法是什麼?我假設動態查詢比使用if-elsif-else語句更好,整個查詢幾乎都在每個塊中重複。

回答

5

你可以寫一個UPDATE,並使用DECODE(或CASE)只更新日期時in_project_status比賽:

... 
, submitted_date = DECODE(in_project_status, 'SUB', SYSDATE, submitted_date) 
, approved_date = DECODE(in_project_status, 'APP', SYSDATE, approved_date) 
... 

這將避免重複UPDATE

+0

啊,當然。這個想法簡單得多。 – 2010-02-23 17:40:36

+1

@Matt McCormick:它在10g上,使用'CASE'而不是'DECODE' – 2010-02-23 18:40:32

2

案例:

UPDATE TBL_PROJECT 
    SET REVISION_COUNT = v_revision_count, 
     PRIMARY_BRANCH = IN_PRIMARY_BRANCH, 
     PROJECT_STATUS = IN_PROJECT_STATUS 
     ... 
     SUBMITTED_DATE = CASE WHEN IN_PROJECT_STATUS = 'APP' THEN SYSDATE ELSE SUBMITTED_DATE END, 
     APPROVED_DATE = CASE WHEN IN_PROJECT_STATUS = 'SUB' THEN SYSDATE ELSE APPROVED_DATE END, 
WHERE PROJECT_ID = IO_PROJECT_ID 
    AND REVISION_COUNT = IO_REVISION_COUNT 
RETURNING REVISION_COUNT INTO IO_REVISION_COUNT