DB2 for IBM iSeries: синтаксис оператора IF EXISTS - PullRequest
3 голосов
/ 03 августа 2011

Я знаком с Sybase, который разрешает запросы с форматом: ЕСЛИ СУЩЕСТВУЕТ (), ТО, ... ИЛИ ..., КОНЕ, ЕСЛИ (или очень близко) Это мощное утверждение, которое позволяет: «если существует, то обновить, иначе вставить».

Я пишу запросы для DB2 на коробке IBM iSeries. Я видел ключевое слово CASE, но не могу заставить его работать. Я всегда получаю сообщение об ошибке: «Ключевое слово CASE не ожидается».

Пример:

IF EXISTS ( SELECT * FROM MYTABLE WHERE KEY = xxx )
THEN UPDATE MYTABLE SET VALUE = zzz WHERE KEY = xxx
ELSE INSERT INTO MYTABLE (KEY, VALUE) VALUES (xxx, zzz)
END IF

Есть ли способ сделать это против DB2 в IBM iSeries? В настоящее время я запускаю два запроса. Сначала выбор, затем мой код Java решает обновить / вставить. Я бы предпочел написать один запрос, так как мой сервер расположен далеко (через Тихий океан).

Ответы [ 4 ]

3 голосов
/ 12 ноября 2012

+ UPDATE +

DB2 для i, начиная с версии 7.1, теперь имеет оператор MERGE, который делает то, что вы ищете.

>>-MERGE INTO--+-table-name-+--+--------------------+----------->
               '-view-name--'  '-correlation-clause-'   

  >--USING--table-reference--ON--search-condition----------------->

     .------------------------------------------------------------------------.   
     V                                                                        |   
  >----WHEN--+-----+--MATCHED--+----------------+--THEN--+-update-operation-+-+----->
             '-NOT-'           '-AND--condition-'        +-delete-operation-+     
                                                         +-insert-operation-+     
                                                         '-signal-statement-'     

См. Информационный центр IBM i 7.1. Оператор DB2 MERGE Справочная страница

2 голосов
/ 03 августа 2011

DB / 2 в AS / 400 не имеет условного оператора INSERT / UPDATE.

Вы можете удалить оператор SELECT, выполнив INSERT напрямую, а в случае неудачи выполнить оператор UPDATE. Переверните порядок выписок, если ваши данные с большей вероятностью UPDATE, чем INSERT.

Более быстрый вариант - создать временную таблицу в QTEMP, INSERT всех записей во временной таблице, а затем выполнить массив UPDATE ... WHERE EXISTS и INSERT ... WHERE NOT EXISTS в конце для объединения всех записей. в финальный стол. Преимущество этого метода заключается в том, что вы можете обернуть все операторы в пакет для минимизации двусторонней связи.

1 голос
/ 04 августа 2011

Вы можете выполнять логику потока управления (IF ... THEN ... ELSE) в хранимой процедуре SQL.Вот пример исходного кода SQL:

-- Warning!  Untested code ahead.
CREATE PROCEDURE libname.UPSERT_MYTABLE (
    IN THEKEY DECIMAL(9,0),
    IN NEWVALUE CHAR(10) )
LANGUAGE SQL
MODIFIES SQL DATA

BEGIN

    DECLARE FOUND CHAR(1);

    -- Set FOUND to 'Y' if the key is found, 'N' if not.
    -- (Perhaps there's a more direct way to do it.)
    SET FOUND = 'N';
    SELECT 'Y' INTO FOUND
    FROM SYSIBM.SYSDUMMY1
    WHERE EXISTS
      (SELECT * FROM MYTABLE WHERE KEY = THEKEY);

    IF FOUND = 'Y' THEN

        UPDATE MYTABLE
        SET VALUE = NEWVALUE
        WHERE KEY = THEKEY;

    ELSE

        INSERT INTO MYTABLE
          (KEY, VALUE)
        VALUES
          (THEKEY, NEWVALUE);

    END IF;

END;

После создания хранимой процедуры вы вызываете ее так же, как и любую другую хранимую процедуру на этой платформе:

0 голосов
/ 03 августа 2011

Эта слегка сложная часть SQL-процедуры решит вашу проблему:

IBM Technote

Если вы хотите выполнить массовое обновление из другой таблицы, тогда получитепосмотрите на оператор MERGE, который является невероятно мощным оператором, который позволяет вставлять, обновлять или удалять в зависимости от значений из другой таблицы. Синтаксис IBM DB2

...