2015-08-25 98 views
0

我正在從MS SQL Server遷移到IBM DB2(版本9.7)。試圖寫一個複合SQL循環和局部變量(不存儲過程的一部分),有點像 -IBM DB2 Control Loop

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" 

任何幫助是極大的讚賞。

+0

你的代碼有類似於一堆語法錯誤和未聲明的變量。如果你展示你的實際代碼而不是類似的東西,有人可能會提供類似於幫助的東西。 – mustaccio

+0

實際的代碼,它非常接近上面的'類似'代碼 - BEGIN ATOMIC DECLARE INT DEFAULT 12; WHILE i> 0 DO INSERT INTO TEMP_ITERATIONS VALUES'IT'|| RTRIM(CHAR(COUNT)); SET COUNT = COUNT - 1; END WHILE; END – user455580

+0

那麼,你聲明'我INT',但然後遞減'COUNT'在循環中 - 不知道我理解這裏的邏輯。 INSERT中的'VALUES'子句需要括號。我建議你閱讀手冊中的語法圖。 – mustaccio

回答

2

我假設你的問題與語句終結者有關(更容易看到你是否提供了你得到的實際錯誤)。我測試了以下,它的工作原理如下:

[ ... ]$ 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 [email protected] -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. 
+0

非常感謝。這是終結者,我可以用你的兩個建議解決方案來工作!欣賞它! – user455580

+0

AFAIK第二個是沒有記錄的功能。 Serge Rielau(當時是DB2的架構師之一)在2004年的這篇usenet文章中提到:https://groups.google.com/forum/#!topic/comp.databases.ibm-db2/goEiaG3jsAI – Lennart

+0

@ Lennart--他確實說他們不會拿出來,因爲它會打破一個功能 - 至少可以說是一個奇怪的特徵。 – Hogan