Запрос динамического обновления в Oracle - PullRequest
3 голосов
/ 23 февраля 2010

Я пытаюсь создать стандартный запрос UPDATE для таблицы. Однако, если определенные критерии выполнены, некоторые столбцы должны быть включены / исключены из оператора UPDATE.

Например:

 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, в котором весь запрос почти дублируется в каждом блоке.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2010

Вы можете написать один 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.

2 голосов
/ 23 февраля 2010

Пример дела:

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
...