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

豹子 2007-6-23 09:48

DB2编程序技巧 (四)

1.10 预防字段空值的处理 mY!@B3_2a!M
SELECTDEPTNO,DEPTNAME,COALESCE(MGRNO,'ABSENT'),ADMRDEPT
n} S,KA-a2q9? FROMDEPARTMENT
$x O+]\dL] COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。
#O#^K0o$O5D)s 和oracle的isnull类似,但isnull好象只能两个表达式。
lrL5VcHC Y$sTW!I
.S.naGWFi
]x"KT_2sM|Z 1.11 取得处理的记录数 V j#KX)rkz
declarev_countint;
8?!}M%aqQ[w update tb_test set t1=’0’
UND9I(O"I hq where t2=’2’;
MF6I$O/fhSrje --检查修改的行数,判断指定的记录是否存在 +u&u'`c!u}
getdiagnostics v_count=ROW_COUNT; |U+cd&h YQs
只对update,insert,delete起作用.
Sr I2}0F:mS 不对selectinto有效
3X G&j-U8Y})cg ?W8? C#P `1Ja-U'u t
L2e9AE7V-SW
1.12 从存储过程返回结果集(游标)的用法 wE[$@G8K
1、建一sp返回结果集
9z+bkr5\b CREATEPROCEDUREDB2INST1.Proc1() z+c2Q#^7|
LANGUAGESQL i-Zq6o xgD
resultsets2(返回两个结果集)
T8]%Yd)e ------------------------------------------------------------------------
;V(gZ"l d4a --SQL存储过程
U'Swk:I!l'c v+D.G^ ------------------------------------------------------------------------ ZP6m7Y9tJV r
P1:BEGIN
iggm2_W0lZ%Z%V declarec1cursorwithreturntocallerfor &fE#B}k)Vh+u Ww(r'D:{
selectmarket_code &P!NX(lgf
fromtb_market_code;
`-W@ _3LQ O8j0F){ D UX --指定该结果集用于返回给调用者 "s?,\p/J`q
declarec2cursorwithreturntocallerfor
2oB ]+lsG1Z A selectmarket_code
#A@~C0\2j fromtb_market_code; {7iD)x)e!p
openc1; -[CkZev5kZd
openc2;
,s??.IZ*U ENDP1 B#m*H\;s7Z
G4C$B-R7\

bL2y#vV;d 2、建一SP调该sp且使用它的结果集 \t"E;[5|ez {T

HY/Q o2DC CREATEPROCEDUREDB2INST1.Proc2( 7^%Y s!sr3e:LKh
outout_market_codechar(1)) ~/H!U*M4o)J!|;X
LANGUAGESQL N2Z~6k2L-P(BYeV
------------------------------------------------------------------------ %F-N W9l-w9h
--SQL存储过程 F+v y Jw$fbeK
------------------------------------------------------------------------
0p_n3u7P+HTs#U P1:BEGIN
Y+w3s}uNJ^U"Y3|,j
0X"ZrL Fm)n)P declareloc1,loc2result_set_locatorvarying; Y@ N u(cA"b
--建立一个结果集数组 ;a_z-Z6wV
callproc1; n,ZYrQ2iD.z)|B
--调用该SP返回结果集。
;nG4bje associateresultsetlocator(loc1,loc2)withprocedureproc1;
[*t6B'rh7s --将返回结果集和结果集数组关联 |4LzyN0zb Md*i
allocatecursor1cursorforresultsetloc1;
zn;E AVYf/c allocatecursor2cursorforresultsetloc2; 4pl }}J(Y.|L
--将结果集数组分配给cursor
$wO4g#y'H M fetchcursor1intoout_market_code;
0HG3GT0|~Z/L(r^!^ --直接从结果集中赋值 3b&i)W }*l/OY,j];s
closecursor1; 9Dq|B ?5K&o/vU;r
e,? U{2|"UwVB~;pQ
ENDP1
$BE$J;N,r h Azx [?/k3~&q{
3、动态SQL写法
5MV ~5^v DECLARECURSORC1FORSTMT1;
!s8T{(YF;RMP4U PREPARESTMT1FROM .{d X~ x^
'ALLOCATEC2CURSORFORRESULTSET?'; hu9lU:H,]'O/SI
4、注意:
&@)Q)k(e(v%e"Nx"L b 一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。
4h$I)_%|"?cuc 二、 allocate的cursor不能再次open,但可以close,是closesp中的对应cursor。 'Lv-A*C{E
(b;B"o iB+vK
1.13 类型转换函数 o*v9@ l0Tf.s
selectcast(currenttimeaschar(8))fromtb_market_code
t7H6U*CQ-SPw.d{
(Stfer0I 1.14 存储过程的互相调用 i PI| ?0U{X_u
目前,csp可以互相调用。
e"f HH)I%kDv Sqlsp可以互相调用,
2v8X\+X&]$o Sqlsp可以调用Csp,
m7d]B/A7F0s$E c7F q 但Csp不可以调用Sqlsp(最新的说法是可以) 3]` U7R0L,ab i
"~T1d:SwG\}kg
1.15 C存储过程参数注意 B dp$H{+l;?3I
createprocedurepr_clear_task_ctrl( Yf[m$GkmC
ININ_BRANCH_CODEchar(4), /lfv]3u"?T4T |'O
ININ_TRADEDATEchar(8),
1Nv:Rq?,A4w ININ_TASK_IDchar(2), .m\Z],e;tG3e p
ININ_SUB_TASK_IDchar(4),
S w y9^fe![-e OUTOUT_SUCCESS_FLAGINTEGER)
gB!JoE~yIZ
$QPO{u)L DYNAMICRESULTSETS0
3Q A7eGO2m LANGUAGEC T8C9jzf*BNe
PARAMETERSTYLEGENERALWITHNULLS(如果不是这样,sql的sp将不能调用该用c写的存储过程,产生保护性错误)
eM(r*x#T NODBINFO (](^a"JGeq
FENCED
9a8p"sI&Lc }j MODIFIESSQLDATA
/z F&Je1Y-guV EXTERNALNAME'pr_clear_task_ctrl!pr_clear_task_ctrl'@
页: [1]
查看完整版本: DB2编程序技巧 (四)