1DB2编程
1.1建存储过程时Create后一定不要用TAB键
createprocedure
的create后只能用空格,而不可用tab健,否则编译会通不过。
切记,切记。
1.2使用临时表
要注意,临时表只能建在usertemporytablesspace上,如果database只有systemtemporytablespace是不能建临时表的。
另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。
建临时表时最好加上withreplace选项,这样就可以不显示的drop临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。
1.3从数据表中取指定前几条记录
select*fromtb_market_codefetchfirst1rowsonly
但下面这种方式不允许
selectmarket_codeintov_market_code
fromtb_market_codefetchfirst1rowsonly;
选第一条记录的字段到一个变量以以下方式代替
declarev_market_codechar(1);
declarecursor1cursorforselectmarket_codefromtb_market_code
fetchfirst1rowsonlyforupdate;
opencursor1;
fetchcursor1intov_market_code;
closecursor1;
1.4游标的使用
注意commit和rollback
使用游标时要特别注意如果没有加withhold选项,在Commit和Rollback时,该游标将被关闭。Commit和Rollback有很多东西要注意。特别小心
游标的两种定义方式
一种为
declarecontinuehandlerfornotfound
begin
setv_notfound=1;
end;
declarecursor1cursorwithholdforselectmarket_codefromtb_market_codeforupdate;
opencursor1;
setv_notfound=0;
fetchcursor1intov_market_code;
whilev_notfound=0Do
--work
setv_notfound=0;
fetchcursor1intov_market_code;
endwhile;
closecursor1;
这种方式使用起来比较复杂,但也比较灵活。特别是可以使用withhold选项。如果循环内有commit或rollback而要保持该cursor不被关闭,只能使用这种方式。
另一种为
pcursor1:forloopcs1ascousor1cursoras
selectmarket_codeasmarket_code
fromtb_market_code
forupdate
do
endfor;
这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。
但不能使用withhold选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。
修改游标的当前记录的方法
updatetb_market_codesetmarket_code=0wherecurrentofcursor1;
不过要注意将cursor1定义为可修改的游标
declarecursor1cursorforselectmarket_codefromtb_market_code
forupdate;
forupdate不能和GROUPBY、DISTINCT、ORDERBY、FORREADONLY及UNION,EXCEPT,orINTERSECT但UNIONALL除外)一起使用。
1.5类似decode的转码操作
oracle中有一个函数selectdecode(a1,1,n1,2,n2,n3)aa1from
db2没有该函数,但可以用变通的方法
selectcasea1
when1thenn1
when2thenn2
elsen3
endasaa1from
1.6类似charindex查找字符在字串中的位置
Locate(‘y','dfdasfay')
查找'y'在'dfdasfay'中的位置。
1.7类似datedif计算两个日期的相差天数
days(date(‘2001-06-05'))–days