Syntax DB2forIBMiSeries:IF-EXISTS语句语法
我熟悉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 IFSyntax 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
在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。需要当前版本的操作系统。谢谢,我将使用此解决方案。这是最简单的代码和调试