2014-06-09 39 views
0

我一直在解決一個問題幾天。我將一個使用Sybase的Unix腳本轉換爲在DB2中運行,並且在它的中間有一個循環。如何在中間執行一個循環的DB2查詢序列?

該腳本包含多個臨時表和更新語句,它們依賴於它之前的內容......後面是一個循環,然後是一些更多的臨時表,更新語句等......在最後的查詢之前填充最終結果並將其導出到電子表格。

我遇到的問題是我可以同時運行聲明,插入,更新和選擇查詢塊。但是,當我試圖在中間循環中一次運行它時,出現以下錯誤: 「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; 

沒有人有任何想法,我能做些什麼來讓所有的查詢塊按順序運行,包括循環?

回答

1

首先,您需要將聲明放在開頭。然後,爲了控制執行,你可以使用一個處理程序和另一個變量,或者是獲取FOR中的每一行。

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

0

如果你要使用複合SQL語句,那麼你就需要使用不同的語句結束。 (複合語句將始終使用;作爲語句終結符)。

因此,使用@作爲語句終止:

Declare [email protected] 
Insert into temp_table_a (select ... from <table> where ...)@ 
Declare [email protected] 
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 [email protected] 
Declare [email protected] 
Declare [email protected] 
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 [email protected] 
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 [email protected] 

運行與db2 [email protected] -f yourfile.sql

declare temp_table_a; 
... 

--#SET TERMINATOR @ 

begin atomic 
    for v ... 
end @ 

--#SET TERMINATOR ; 

declare temp_table_e; 
... 

另外,您可以IFF您正在使用DB2 CLP改變線終止在SQL語句

相關問題