IBM DB2控制循环

IBM DB2控制循环,db2,db2-luw,db2-connect,Db2,Db2 Luw,Db2 Connect,我正在从MS SQL Server迁移到IBM DB2(版本9.7)。尝试使用局部变量(不是存储过程的一部分)编写复合SQL While循环,类似- BEGIN ATOMIC DECLARE i INT DEFAULT 12; WHILE i > 0 "DO ...."; SET COUNT = COUNT - 1; END WHILE; END 但我在声明变量的第一行就出现了一个错误- SQL0104N An unexpected t

我正在从MS SQL Server迁移到IBM DB2(版本9.7)。尝试使用局部变量(不是存储过程的一部分)编写复合SQL While循环,类似-

BEGIN ATOMIC
   DECLARE i INT DEFAULT 12;
     WHILE i > 0 
     "DO ....";
     SET COUNT = COUNT - 1;
     END WHILE;
 END
但我在声明变量的第一行就出现了一个错误-

SQL0104N  An unexpected token "12" was found following "ECLARE I INT DEFAULT". Expected tokens may include:  "END-OF-STATEMENT"

非常感谢您的帮助。

我认为您的问题与语句终止符有关(如果您提供了实际的错误,则更容易看出)。我测试了以下各项,结果成功了:

[ ... ]$ cat aa.sql 

CREATE TABLE TEMP_ITERATIONS ( X VARCHAR(50) ) @

BEGIN ATOMIC 
    DECLARE i INT DEFAULT 12; 
    WHILE i > 0 DO 
        INSERT INTO TEMP_ITERATIONS VALUES ('IT'|| RTRIM(CHAR(i))); 
        SET i = i - 1; 
    END WHILE; 
END @

[ ... ]$ db2 -td@ -f aa.sql

DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.

[ ... ]$ db2 "select * from TEMP_ITERATIONS"

X                                                 
--------------------------------------------------
IT12                                              
IT11                                              
IT10
[...]
12 record(s) selected.
在这里,我使用@作为语句终止符,因为;有着特殊的意义。如果您不想更改语句终止符,一个技巧是“隐藏”语句终止符;在复合语句中,在行的末尾添加注释:

[ ... ]$ cat aa.sql 

CREATE TABLE TEMP_ITERATIONS ( X VARCHAR(50) ) ;

BEGIN ATOMIC 
    DECLARE i INT DEFAULT 12; --
    WHILE i > 0 DO 
        INSERT INTO TEMP_ITERATIONS VALUES ('IT'|| RTRIM(CHAR(i))); --
        SET i = i - 1; --
    END WHILE; --
END ;

[ ... ] db2 -tf aa.sql
DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.

[ ... ]$ db2 "select * from TEMP_ITERATIONS"

X                                                 
--------------------------------------------------
IT12                                              
IT11                                              
IT10
[...]
12 record(s) selected.

您的代码有一些语法错误和未声明的变量。如果您显示的是实际代码而不是类似的代码,那么可能有人会提供帮助之类的帮助;当i>0时,在TEMP_迭代中插入值“IT”| | RTRIM(CHAR(COUNT));设置计数=计数-1;结束时;ENDWell,您声明了
i INT
,但随后在循环中递减
COUNT
——不确定我是否理解这里的逻辑。
INSERT
中的
VALUES
子句需要括号。我建议您查看手册中的语法图。感谢您指出语法错误。我粘贴了错误的版本。问题是我在声明I时在第二个位置得到了错误,就像它本身一样。看来事情并不是这样的。正确版本开始原子声明i INT DEFAULT 12;当i>0时,插入TEMP|u迭代值('IT'| | RTRIM(CHAR(i));设置i=i-1;结束时;非常感谢。这是终结者,我可以让它与你的建议解决方案!谢谢你!AFAIK第二个是未记录的特性。Serge Rielau(当时是DB2的架构师之一)在2004年的usenet帖子中提到了这一点:@Lennart——他说他们不会把它去掉,因为它会破坏一个特性——至少可以说这是一个奇怪的特性。