Syntax DB2forIBMiSeries:IF-EXISTS语句语法

Syntax DB2forIBMiSeries:IF-EXISTS语句语法,syntax,if-statement,db2,ibm-midrange,exists,Syntax,If Statement,Db2,Ibm Midrange,Exists,我熟悉Sybase,它允许使用以下格式进行查询:如果存在,则。。。其他的结束,如果或非常接近。这是一个强大的语句,允许:如果存在,则更新,否则插入 我正在IBM iSeries box上编写DB2查询。我已经看到了CASE关键字,但是我不能让它工作。我总是收到错误:关键字大小写不应出现 样本: IF EXISTS ( SELECT * FROM MYTABLE WHERE KEY = xxx ) THEN UPDATE MYTABLE SET VALUE = zzz WHERE KEY = xx

我熟悉Sybase,它允许使用以下格式进行查询:如果存在,则。。。其他的结束,如果或非常接近。这是一个强大的语句,允许:如果存在,则更新,否则插入

我正在IBM iSeries box上编写DB2查询。我已经看到了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
在IBMiSeries上有没有针对DB2的方法?目前,我运行两个查询。首先选择,然后我的Java代码决定更新/插入。我宁愿编写一个查询,因为我的服务器位于太平洋的另一端。

这个稍微过于复杂的SQL过程将解决您的问题:

如果您想从另一个表进行大规模更新,那么请查看MERGE语句,它是一个功能强大的语句,允许您根据另一个表中的值进行插入、更新或删除。
AS/400上的DB/2没有条件INSERT/UPDATE语句

可以通过直接执行INSERT删除SELECT语句,如果INSERT失败,则执行UPDATE语句。如果数据更新的可能性大于插入的可能性,请翻转语句的顺序


更快的选择是在QTEMP中创建一个临时表,将所有记录插入临时表,然后执行批量更新。。。存在的位置并插入。。。如果末尾不存在,则将所有记录合并到最终表中。这种方法的优点是可以将所有语句打包在一个批中,以最小化往返通信

您可以在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 );
+更新+

从7.1版开始,DB2fori现在有一个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-'     

请参阅参考页

不幸的是,AS/400上的DB2不支持MERGE语句。为了保持信息的更新,DB2forIAS/400自2010年年中起就已经进行了MERGE。需要当前版本的操作系统。谢谢,我将使用此解决方案。这是最简单的代码和调试