2010-02-23 3 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 и количество затронутых строк (ROWCOUNT), чтобы проверить, если обновление было успешным или нет.

Каков наилучший способ написать этот запрос? Я предполагаю, что динамический запрос лучше, чем наличие инструкции 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

Ах, конечно. Эта идея намного проще. –

+1

@Matt McCormick: он на 10g, используйте 'CASE' вместо' DECODE' –

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 
Смежные вопросы