如何在中间执行一个循环的DB2查询序列?

时间:2014-06-09 16:44:58

标签: sql unix for-loop db2

我已经在一个问题上滚了几天了。我正在转换使用Sybase在Unix中运行的Unix脚本,并且在它的中间有一个循环。

该脚本包含几个临时表和更新语句,它们依赖于之前的内容...后跟循环,然后是一些临时表,更新语句等...在填充结束时的查询之前最终结果并将其导出到电子表格。

我遇到的问题是我可以同时将所有声明,插入,更新和选择查询块一起运行。但是,当我尝试在中间循环时同时运行它时,我收到以下错误: “SQL0104N在”ssion.min_assessment“之后发现了一个意外的令牌”END-OF-STATEMENT“。预期的令牌可能包括:”JOIN“.LINE NUMBER = 1.SQLSTATE = 42601”。

单独运行时块运行正常...但我需要所有块一起运行,所以我可以将它们放在unix脚本中进行调度。

结构如下:

Declare temp_table_a;
Insert into temp_table_a (select ... from <table> where ...);
Declare temp_table_b;
Insert into temp_table_b (select ... from temp_table_a, <table> where ...);
Update temp_table_b set <field> = (select <field> from <table> where ...);
Delete temp_table_b where ...;
Declare temp_table_c;
Declare temp_table_d;
Begin Atomic
   FOR V1 AS
       Select ... From temp_table_b
   DO
       Delete temp_table_c;
       Insert into temp_table_c (select ...);
       Delete temp_table_b Where Exists (Select 1 From temp_table_c);
       Update temp_table_d set <date_field> = temp_table_c.<date_field> where exists (Select 1 from temp_table_b where ...);
       Delete temp_table_c where exists (Select 1 from temp_table_c where ...);
       Insert into temp_table_d Select ... From temp_table_c;
   END FOR; 
END
Declare temp_table_e;
Insert into temp_table_e (select ... from temp_table_d, <table> where ...);
Update temp_table_e set <field> = (select <field> from <table> where ...);
Select ... from temp_table_e;

有没有人想知道我能做些什么来让所有查询块按顺序运行并包含循环?

2 个答案:

答案 0 :(得分:1)

首先,您需要将声明放在开头。然后,为了控制执行,您可以使用处理程序和另一个变量,或者获取FOR中的每一行。

http://www.sqlpl-guide.com/DECLARE

答案 1 :(得分:0)

如果要使用复合SQL语句,则需要使用不同的语句终止符。 (复合语句将始终使用;作为语句终止符。)

因此使用@作为语句终止符:

Declare temp_table_a@
Insert into temp_table_a (select ... from <table> where ...)@
Declare temp_table_b@
Insert into temp_table_b (select ... from temp_table_a, <table> where ...)@
Update temp_table_b set <field> = (select <field> from <table> where ...)@
Delete temp_table_b where ...@
Declare temp_table_c@
Declare temp_table_d@
Begin Atomic
   FOR V1 AS
       Select ... From temp_table_b
   DO
       Delete temp_table_c;
       Insert into temp_table_c (select ...);
       Delete temp_table_b Where Exists (Select 1 From temp_table_c);
       Update temp_table_d set <date_field> = temp_table_c.<date_field> where exists (Select 1 from temp_table_b where ...);
       Delete temp_table_c where exists (Select 1 from temp_table_c where ...);
       Insert into temp_table_d Select ... From temp_table_c;
   END FOR; 
END @
Declare temp_table_e@
Insert into temp_table_e (select ... from temp_table_d, <table> where ...)@
Update temp_table_e set <field> = (select <field> from <table> where ...)@
Select ... from temp_table_e@

使用db2 -td@ -f yourfile.sql运行。

或者,您可以在使用DB2 CLP的SQL语句IFF中内联更改终结符:

declare temp_table_a;
...

--#SET TERMINATOR @

begin atomic
   for v ...
end @

--#SET TERMINATOR ;

declare temp_table_e;
...