IBM iSeries的DB2:IF EXISTS语句语法

3
我熟悉 Sybase,它允许使用以下格式的查询语句:IF EXISTS () THEN ... ELSE ... END IF(或非常接近)。这是一个强大的语句,可以实现“如果存在,则更新,否则插入”的功能。
我正在为 IBM iSeries 上的 DB2 编写查询语句。我看到了 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
有没有办法在 IBM iSeries 上的 DB2 中实现这个功能?目前,我运行两个查询。首先是 select,然后我的 Java 代码决定更新/插入。我更愿意编写一个单一的查询语句,因为我的服务器位于遥远的地方(跨越太平洋)。

1
请查看 https://dev59.com/5XRC5IYBdhLWcg3wVvct - Thomas Gak-Deluen
4个回答

5

+更新+

从7.1版本开始,DB2 for i现在拥有一个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 InfoCenter DB2 MERGE statement 参考页面


2

AS/400上的DB/2没有条件INSERT / UPDATE语句。

您可以通过直接执行INSERT语句来删除SELECT语句,如果失败,则执行UPDATE语句。如果您的数据更可能UPDATE而不是INSERT,请调换语句的顺序。

更快的选项是在QTEMP中创建一个临时表,在临时表中INSERT所有记录,然后执行批量UPDATE ... WHERE EXISTSINSERT ... WHERE NOT EXISTS将所有记录合并到最终表中。这种方法的优点是可以将所有语句包装在批处理中,以最小化往返通信。


谢谢,我会使用这个解决方案。它是最简单的编码和调试方式。 - kevinarpe

1

您可以在SQL存储过程中执行控制流逻辑(IF...THEN...ELSE)。以下是示例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;

一旦您创建了存储过程,您可以像在此平台上调用任何其他存储过程一样进行调用:

CALL UPSERT_MYTABLE( xxx, zzz );

0
这个稍微有些复杂的SQL过程将会解决你的问题: IBM Technote 如果你想要从另一个表进行批量更新,那么可以看一下MERGE语句,它是一种非常强大的语句,可以根据另一个表中的值进行插入、更新或删除。 IBM DB2 Syntax

2
不幸的是,AS/400上的DB2不支持MERGE语句。 - James Allman
为了保持信息的更新,DB2 for i (AS/400)自2010年中期以来就拥有了MERGE功能。需要使用当前版本的操作系统。 - user2338816

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接