查看完整版本: DB2编程序技巧 (三)

豹子 2007-6-23 09:48

DB2编程序技巧 (三)

另一种为
(X!e0Te7Mu^ pcursor1:forloopcs1ascousor1cursoras $]r*o.kI+pQ.w9YW
selectmarket_codeasmarket_code
+nSW,j0VS5B@ fromtb_market_code
uhL^MQ2^x-hu+E forupdate
7EN1r@@0E B do 9L q&UX m%}
endfor;
6pG p(ku&U 这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。 )Lb&\Oh_&@6c;})oH,]
但不能使用withhold选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。 f2^q5P`n7d Le
.`svh$TYB'F
修改游标的当前记录的方法
-Fy3Z6_|7B+OUY updatetb_market_codesetmarket_code='0'wherecurrentofcursor1;
3z)jl ?3h4i} 不过要注意将cursor1定义为可修改的游标
"Sr&t/d#Map declarecursor1cursorforselectmarket_codefromtb_market_code eg%m.X,Cw
forupdate; bX!Te})lem j!M

$r uOE6EW forupdate不能和GROUPBY、DISTINCT、ORDERBY、FORREADONLY及UNION,EXCEPT,orINTERSECT但UNIONALL除外)一起使用。
PKV4Hx.?
0w)|-PEV 7? TsA cl,vp
9_$I4? e rX)i(z
1.5 类似decode的转码操作
[+GNRFy oracle中有一个函数 selectdecode(a1,'1','n1','2','n2','n3')aa1from
]D [3l5t!J;~ Z db2没有该函数,但可以用变通的方法
1V(O!gNJ[,G selectcasea1 Z\ P{ g
when'1'then'n1'
Q!c$a:L/k pZ+\7V when'2'then'n2' !zz6q/I~,F ~V
else'n3' I)T i_-PyW
endasaa1from
Cjb7N^l1m?/L (y a'\~~P3a$hS
1.6 类似charindex查找字符在字串中的位置 ? P3C5B{R@ ?1}
Locate(‘y’,’dfdasfay’) 0}.Mj5kR[3c$|
查找’y’在’dfdasfay’中的位置。 9Vk2f!UD%x|/F%^)e

Zt0Rql 1.7 类似datedif计算两个日期的相差天数 jKQU4e~e,wtR\
days(date(‘2001-06-05’))–days(date(‘2001-04-01’))
L.O3wE-M/_ Q9} days返回的是从0001-01-01开始计算的天数 6EXE,Qhdq+KGo
1.8 写UDF的例子
M_RuLK:s@ps C写见sqllib\samples\cli\udfsrv.c ke,ma$d)L Jw
vzUY"IYj
1.9 创建含identity值(即自动生成的ID)的表
^"wF5G(_)o 建这样的表的写法
R9ml(F.f CREATETABLEtest lp:i,\*z4`v0^t
(t1SMALLINTNOTNULL AVw1[tA m
GENERATEDALWAYSASIDENTITY DH5l.LW*Q
(STARTWITH500,INCREMENTBY1), Lf*i7DL dk4h
t2CHAR(1));
JbL&O%Whp.P 在一个表中只允许有一个identity的column.
页: [1]
查看完整版本: DB2编程序技巧 (三)