2012-10-19 25 views
4

我正面臨着試圖理解DB2 sql(注意,我來自MS SQL Server)的挑戰:P。如何在DB2中執行復合sql

這是一個場景,我有兩個表,一個有ID和其他細節,第二個有很多其他信息對應於每個ID。

ID    Info for ID 
_______  ____> _______ 
|  | / |  | 
| T1 |<---------> | T2 | 
|_____|  \____> |_____| 

從SQL Server的到來,我習慣了運行的腳本,如:

Declare @ID int 
Declare @ID1 int 

select @ID=ID from T1 where col1 = @ID1 

select * from T2 where ID = @ID 

這一切都運行良好那裏,給我相應的ID1的ID,可以進一步用於獲取ID的所有信息從T2開始。

可悲的是,在DB2這一爆炸在我的臉上吧,我很害怕,如果我將執行此查詢一次,它會認我永遠:(。

我做了一些研究,寫這(我甚至。停留在變量聲明)

--#SET TERMINATOR @ 
BEGIN ATOMIC 
DECLARE UID char(30); 
END @ 

對於其他人來說,它的工作很好,但我收到以下錯誤:

BEGIN ATOMIC 
DECLARE UID char(30); 
END 

ILLEGAL USE OF KEYWORD ATOMIC. TOKEN WAS EXPECTED. SQLCODE=-199, SQLSTATE=42601, DRIVER=3.63.108 

其他信息:

IBM DB2 z/OS版V9.1 IBM Data Studio的V3.1.1.0

[編輯:使用declare] 另一件事我想,沒有了工作:

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID; 
--some other activity goes here 
--and here 
DROP VARIABLE UID; 

TIA , 阿比納夫


更新於2016年5月13日(黑色星期五)

創建一個存儲過程是解決這個的唯一途徑:(

+0

你試圖做什麼'JOIN'不是一個選項?看一看[DB2 Reference](http://publib.boulder.ibm.com/epubs/pdf/dsnsqk1c.pdf) - 我認爲'BEGIN ATOMIC'只是觸發器定義的一部分(這就是你所說的'重新嘗試?)。如果你只是試圖在一個命令行程序中執行此操作,那麼它可能會期待'DECLARE'接下來,儘管我不認爲這實際上是你想要的方式。你真正的問題是什麼? –

+0

@ Clockwork-Muse我只需要將ID存儲在表T1的一個變量中,然後在腳本的其餘部分使用該變量。後來該腳本將成爲一個存儲過程,但現在我剛剛開始,所以需要更多地瞭解變量聲明等。 – Abhinav

+0

因此,經過與DBA的多次討論,我意識到在此版本中不可能DB2 for z/OS V9.1。他建議我應該將它包裝在存儲過程中,然後對其進行測試。如果更新生效,則更新。 – Abhinav

回答

2

這是你的第一個案件的基本語法:

create variable id_var integer; 
create variable id_var1 integer; 

set id_var = 100; 

set id_var1 = (select id from t1 where id = id_var); 

select * from t2 where id = id_var1; 

在這個例子中,但是,你要使用一個變量作爲列名:

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID; 
--some other activity goes here 
--and here 
DROP VARIABLE UID; 

不幸的是,你不能在DB2中這樣做。做這種事的唯一方法是建立一個dynamic sql statement並執行它。這很麻煩:你在一個字符串中創建一個sql命令,然後準備並執行它。並且在動態sql中直接使用SELECT也有限制。想想另一種能解決你的問題的設計可能會更好,而不是走這條路。

2

您的命令在DB2 10 for LUW中正常工作。數據工作室版本無關緊要,因爲它與CLP的工作方式相同。 我測試此代碼示例數據庫:

BEGIN ATOMIC 
DECLARE UID char(30); 
SET UID = 200280; 
SELECT FIRSTNME, LASTNAME FROM ANDRES.EMPLOYEE WHERE EMPNO = UID; 
END @ 

也許,您使用的是不支持嵌入式SQL在z/OS版本(開始原子)。我不是zos DBA,我知道LUW,iSeries和zOS之間有許多SQL差異。

請檢查跨平臺兼容性。這是一個非常好的博客瞭解的問題:https://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/crossplatformsqlrefv4?lang=en

+0

這也可以幫助(有點老)http://www.ibm.com/developerworks/data/library/techarticle/db2common/ – AngocA