DB2編程基礎要點(1)

來源:互聯網
上載者:User

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 有效


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.