使用 LOOP 的 Db2 多插入

Db2 Multi Insert using LOOP

我正在尝试编写一个循环,主要是为 DB2 Z/OS 执行批量插入。 参考这个后,我尝试使用这个:

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”。一些可能合法的符号是: SECTION。 SQLCODE=-104,SQLSTATE=42601,DRIVER=4.28.11 SQL代码:-104,SQL州:42601 错误发生在: 开始 声明 varcnt

我使用了 DBeaver、TOAD 和 SQL Squirrel 客户端,认为这可能是客户端问题,但似乎并非如此。我的 DB2 Z/OS 版本是 DSN12015.

如果能在这里得到一些关于我如何多次 运行 这条 INSERT 语句的帮助,那就太好了。

Compound statements 在 Db2 for z/OS 中仅在例程和触发器中受支持。
您不能将它们用作独立语句。
您的 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

谢谢马克,您的解决方案和文档参考真的很有帮助。

我想添加关于生成数据的存储过程:

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;