1 DB2編程
1.1 建預存程序時Create 後一定不要用TAB鍵
create procedure
的create後只能用空格,而不可用tab健,否則編譯會通不過。
切記,切記。
1.2 使用暫存資料表
要注意,暫存資料表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建暫存資料表的。
另外,DB2的暫存資料表和sybase及oracle的暫存資料表不太一樣,DB2的暫存資料表是在一個session內有效。所以,如果程式有多線程,最好不要用暫存資料表,很難控制。
建暫存資料表時最好加上 with replace選項,這樣就可以不顯示的drop 暫存資料表,建暫存資料表時如果不加該選項而該暫存資料表在該session內已建立且沒有drop,這時會發生錯誤。
1.3 從資料表中取指定前幾條記錄
select * from tb_market_code fetch first 1 rows only
|
但下面這種方式不允許:
select market_code into v_market_code from tb_market_code fetch first 1 rows only;
|
選第一條記錄的欄位到一個變數以以下方式代替:
declare v_market_code char(1); declare cursor1 cursor for select market_code from tb_market_code fetch first 1 rows only for update; open cursor1; fetch cursor1 into v_market_code; close cursor1;
|
1.4 遊標的使用
注意commit和rollback
使用遊標時要特別注意如果沒有加with hold 選項,在Commit和Rollback時,該遊標將被關閉。Commit 和Rollback有很多東西要注意。特別小心。
遊標的兩種定義方式:
一種為:
declare continue handler for not found begin set v_notfound = 1; end; declare cursor1 cursor with hold for select market_code from tb_market_code for update; open cursor1; set v_notfound=0; fetch cursor1 into v_market_code; while v_notfound=0 Do --work set v_notfound=0; fetch cursor1 into v_market_code; end while; close cursor1;
|
這種方式使用起來比較複雜,但也比較靈活。特別是可以使用with hold 選項。如果迴圈內有commit或rollback 而要保持該cursor不被關閉,只能使用這種方式。
另一種為:
pcursor1: for loopcs1 as cousor1 cursor as select market_code as market_code from tb_market_code for update do end for;
|
這種方式的優點是比較簡單,不用也不允許)使用open,fetch,close。
但不能使用with hold 選項。如果在遊標迴圈內要使用commit,rollback則不能使用這種方式。如果沒有commit或rollback的要求,推薦使用這種方式(看來For這種方式有問題)。
修改遊標的目前記錄的方法
update tb_market_code set market_code='0' where current of cursor1;
|
不過要注意將cursor1定義為可修改的遊標
declare cursor1 cursor for select market_code from tb_market_code for update;
|
for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。
1.5 類似decode的轉碼操作
oracle中有一個函數
select decode(a1,'1','n1','2','n2','n3') aa1 from
|
db2沒有該函數,但可以用變通的方法。
select case a1 when '1' then 'n1' when '2' then 'n2' else 'n3' end as aa1 from
|
1.6 類似charindex尋找字元在字串中的位置
Locate(‘y’,’dfdasfay’)
尋找’y’ 在’dfdasfay’中的位置。
1.7 類似datedif計算兩個日期的相差天數
days(date(‘2001-06-05’)) – days(date(‘2001-04-01’))
days 返回的是從 0001-01-01 開始計算的天數
1.8 寫UDF的例子
C寫見sqllib\samples\cli\udfsrv.c
1.9 建立含identity值(即自動產生的ID)的表
建這樣的表的寫法:
CREATE TABLE test (t1 SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 500, INCREMENT BY 1), t2 CHAR(1));
|
在一個表中只允許有一個identity的column。
1.10 預防欄位空值的處理
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT FROM DEPARTMENT
|
COALESCE函數返回()中運算式列表中第一個不為空白的運算式,可以帶多個運算式。
和oracle的isnull類似,但isnull好象只能兩個運算式。
1.11 取得處理的記錄數
declare v_count int; update tb_test set t1=’0’ where t2=’2’; --檢查修改的行數,判斷指定的記錄是否存在 get diagnostics v_ count=ROW_COUNT;
|
只對update,insert,delete起作用.
不對select into 有效