在 DB2 数据库中插入多行

Posted

技术标签:

【中文标题】在 DB2 数据库中插入多行【英文标题】:insert multiple rows into DB2 database 【发布时间】:2012-07-29 09:44:19 【问题描述】:

我想在 DB2 表中插入多行。 我有一个看起来像这样的查询

insert into tableName 
(col1, col2, col3, col4, col5) 
values 
(val1, val2, val3, val4, val5),
(val1, val2, val3, val4, val5),
(val1, val2, val3, val4, val5),
(val1, val2, val3, val4, val5);

此查询无效。我不知道在 DB2 中是否有语法上更正确的方法来执行此操作。但是插入我的测试数据会很有用。

【问题讨论】:

【参考方案1】:

我假设您正在使用 DB2 for z/OS,不幸的是(无论出于何种原因,我从来没有真正理解为什么)不支持在适合全选的情况下使用值列表。

您可以使用如下选择。这有点笨拙,但它有效:

INSERT INTO tableName (col1, col2, col3, col4, col5) 
SELECT val1, val2, val3, val4, val5 FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT val1, val2, val3, val4, val5 FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT val1, val2, val3, val4, val5 FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT val1, val2, val3, val4, val5 FROM SYSIBM.SYSDUMMY1

您的语句可以在 DB2 for Linux/Unix/Windows (LUW) 上运行,至少当我在我的 LUW 9.7 上测试它时。

【讨论】:

我认为您不需要输入任何指标(NULL 关键字除外,如果适用)。你得到的错误代码是什么? Column NULL is not in any table named in the query. 我插入 NULL 的字段确实允许这样做。也有 SQLCODE=-206 和 -104 您似乎无法从SYSIBM.SYSDUMMY1 中直接选择NULL,其唯一列定义为NOT NULL。您可以通过两种方式解决...SELECT NULLIF(0,0)SELECT CAST(NULL AS INTEGER)。我猜 DB2 希望知道数据类型是什么。希望对您有所帮助。 所以用NULL 代替SELECT NULLIF(0,0) ? - 不管什么原因,我从来没有真正理解为什么 - 因为恐龙不了解你的需求。【参考方案2】:

更新 - 更简洁的版本

INSERT INTO tableName (col1, col2, col3, col4, col5) 
VALUES ('val1', 'val2', 'val3', 'val4', 'val5'),
       ('val1', 'val2', 'val3', 'val4', 'val5'),
       ('val1', 'val2', 'val3', 'val4', 'val5'),
       ('val1', 'val2', 'val3', 'val4', 'val5')

以下内容也适用于 DB2,并且略显冗长

INSERT INTO tableName (col1, col2, col3, col4, col5) 
VALUES ('val1', 'val2', 'val3', 'val4', 'val5') UNION ALL
VALUES ('val1', 'val2', 'val3', 'val4', 'val5') UNION ALL
VALUES ('val1', 'val2', 'val3', 'val4', 'val5') UNION ALL
VALUES ('val1', 'val2', 'val3', 'val4', 'val5')

【讨论】:

【参考方案3】:

其他方法

INSERT INTO tableName (col1, col2, col3, col4, col5)
select * from table(                        
                    values                                      
                    (val1, val2, val3, val4, val5),   
                    (val1, val2, val3, val4, val5),   
                    (val1, val2, val3, val4, val5),   
                    (val1, val2, val3, val4, val5)    
                    ) tmp

【讨论】:

【参考方案4】:

我不同意霍根发表的评论。 这些说明适用于 IBM DB2 Mini,但不适用于 DB2 Z/OS。

这是一个例子:

Exception data: org.apache.ibatis.exceptions.PersistenceException:
The error occurred while setting parameters

SQL: INSERT INTO TABLENAME(ID_, F1_, F2_, F3_, F4_, F5_) VALUES
 (?,          1,          ?,          ?,          ?,          ?),          
 (?,          1,          ?,          ?,          ?,          ?)


Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: 
ILLEGAL SYMBOL ",". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: FOR <END-OF-STATEMENT> NOT ATOMIC. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.25.17

所以我可以确认内联逗号分隔的批量插入在 DB2 Z/OS 上不起作用(也许你可以给它一些道具来让它工作......)

【讨论】:

【参考方案5】:

以上都不适合我,唯一的工作是

insert into tableName  
select 11, 'BALOO' from sysibm.sysdummy1 union all
select 22, nullif('','') AS nullColumn from sysibm.sysdummy1

使用 nullif 是因为否则无法在 select 语句中传递 null。

【讨论】:

以上是关于在 DB2 数据库中插入多行的主要内容,如果未能解决你的问题,请参考以下文章

DB2 上copy表结构及数据

taradatainsertinto多行数据报错

在 PLI/COBOL 程序中可以维护多少个(最大)DB2 多行提取游标?

尝试在表中插入不存在的记录时出现 DB2 -803 错误

DB2 是不是有“插入或更新”语句?

使用 Java 为 DB2 和 Oracle 插入 BLOB