使用LOOP的Db2多次插入

1tu0hz3e  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(269)

我尝试编写一个循环,基本上是为了对DB2 Z/OS执行批量插入。在引用了这个article之后,我尝试使用以下代码:

BEGIN
    DECLARE varcnt; 
    set varcnt int DEFAULT 0;
    WHILE varcnt <= 10 DO
    insert into HEROI.TESTD (PK,XML_TYPE) values(varcnt+1,'<test>Hello World</test>');  
    SET varcnt = varcnt + 1;
    END WHILE ;
END;

但上面给出了如下错误:

非法符号“VARCNT”。可能合法的符号包括:部分。SQL代码= -104,SQL状态=42601,驱动程序=4.28.11 SQL代码:-104,SQL状态:42601错误发生于:开始声明变量

我使用了DBeaver、TOAD和SQL Squirrel客户端,以为这可能是客户端的问题,但似乎不是。我使用的DB2 Z/OS版本是DSN 12015
如果能在这里获得一些关于如何多次运行此INSERT语句的帮助,我将非常高兴。

ma8fv8wu

ma8fv8wu1#

Db2 for z/OS中的Compound statements仅在例程和触发器中受支持。
您不能将它们作为独立语句使用。
您的DECLARESET语句是错误的-您没有在DECLARE中提供数据类型,而在SET中提供。它应该是:

DECLARE varcnt int DEFAULT 0;

至于你的情况,你可以用一句话来做同样的事情:

insert into HEROI.TESTD (PK,XML_TYPE)
WITH T (I) AS 
(
SELECT 0 FROM SYSIBM.SYSDUMMY1
    UNION ALL
SELECT I+1 FROM T WHERE I < 10
)
SELECT I, '<test>Hello World</test>'
FROM T
6qftjkof

6qftjkof2#

感谢Mark,您的解决方案和文档参考确实帮了大忙。
我想添加前面介绍的有关生成数据的存储过程:

CREATE PROCEDURE HEROI.SP_INSERT
LANGUAGE SQL
DISABLE DEBUG MODE
BEGIN
    DECLARE cnt int DEFAULT 0;
    WHILE cnt <= 1000000 DO
    insert into HEROI.TESTD (PK,SMALLINT_TYPE) VALUES (cnt, 'Hello World'); 
    COMMIT;
    SET cnt = cnt + 1;
    END WHILE ;
END

CALL HEROI.SP_INSERT;

相关问题