DB2编程序技巧 (四)
1.10 预防字段空值的处理
2 e. p* _; }$ W* q; kSELECTDEPTNO,DEPTNAME,COALESCE(MGRNO,'ABSENT'),ADMRDEPT
# j! f! x. c. ]FROMDEPARTMENT
) P* K& b5 Z3 KCOALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。 G7 U3 l, n4 V: A3 C
和oracle的isnull类似,但isnull好象只能两个表达式。
* F- V5 Q: x) Y 0 z; l& \! k* N4 c$ n- c
( M$ {7 l, g" C1 G5 E& k7 m9 l# \1 B1.11 取得处理的记录数
8 u! c' q+ ?/ A. R0 m: q0 F0 udeclarev_countint; $ A; k" Y( R* f- G" |
update tb_test set t1=’0’
$ q8 Y4 b! c ~2 @where t2=’2’; / s8 c4 B* d T' U) M+ Q- g$ q1 c2 D
--检查修改的行数,判断指定的记录是否存在 + j4 I9 F) m s- M0 k5 L
getdiagnostics v_count=ROW_COUNT;
$ K6 Z2 Y% F Y' k只对update,insert,delete起作用. + J. ~4 L" O& |( }
不对selectinto有效 % M; W& e# L8 _$ |( M9 T# ^3 Y( y' w
# `; r6 V- |8 h# h( M7 c1 \$ a
! Q: y4 N6 _, U7 Q5 V$ Z
1.12 从存储过程返回结果集(游标)的用法
a/ g( a; V& `7 V% N/ o Z1、建一sp返回结果集 / L p) p, E: L+ ~' v
CREATEPROCEDUREDB2INST1.Proc1()
+ n6 S+ q8 a& x8 S iLANGUAGESQL B% B& C# a& t* w- r; \ W
resultsets2(返回两个结果集) " w, E- w# W! D8 h9 ?( D
------------------------------------------------------------------------ , i$ i/ R! \) ?
--SQL存储过程
3 [2 t& ^+ }/ F------------------------------------------------------------------------ 6 L, A7 {4 P2 _" ~' j
P1:BEGIN
" T$ G. O" ~. D, ^/ p- K# bdeclarec1cursorwithreturntocallerfor $ p% k8 R7 i( k8 C: `0 t0 D( _6 g
selectmarket_code * \" V6 Y; ]" V) c
fromtb_market_code; 2 V. z8 g0 D0 J8 w: H) f" n. e: U
--指定该结果集用于返回给调用者 ; v+ {/ ?5 }7 d9 D! X0 y3 W5 _' Y
declarec2cursorwithreturntocallerfor
6 u1 l" `9 `+ P# q$ C7 Mselectmarket_code
2 c$ h! j) R$ v- W+ k* gfromtb_market_code; ( V6 i- K4 w- M/ i, o# L8 A' ?$ |
openc1; . T: G. z n4 e9 Z. f* ~9 Z
openc2; # g" {6 a5 P8 f4 w% ?, ]: W
ENDP1 & o# j4 x3 `0 f- _" X! ~* D2 ^
. d1 ~1 O. |& v ^+ v
5 Z, S" W" K# R2、建一SP调该sp且使用它的结果集 1 `, ?) l7 n/ g9 w9 t7 ]
6 a( n+ W4 y* v6 |) yCREATEPROCEDUREDB2INST1.Proc2(
8 l! k [/ ~. K% f7 v) ~outout_market_codechar(1))
- c4 G& ^6 V8 T& CLANGUAGESQL
7 R. P. k5 T5 D7 j+ E [------------------------------------------------------------------------
# K! t6 r! n0 T--SQL存储过程
. G, p# k5 w2 N$ A6 w------------------------------------------------------------------------
5 T. t8 t3 y% \. NP1:BEGIN
1 I/ o3 r: T! U/ Q: x* N3 [; m" u% s0 ^" |% Q, P
declareloc1,loc2result_set_locatorvarying;
% J3 t* u1 B5 ?: ]1 P--建立一个结果集数组 ; t( D9 @7 X& p
callproc1; / @5 L+ V" u- e+ P: X7 U
--调用该SP返回结果集。
' } ~8 w1 H( a; P0 Tassociateresultsetlocator(loc1,loc2)withprocedureproc1;
1 ], d3 J7 n5 _1 `/ } B: E8 D--将返回结果集和结果集数组关联
5 @- S3 j' ~3 i. D3 qallocatecursor1cursorforresultsetloc1; ( i0 d" A. w D2 Y7 H6 y
allocatecursor2cursorforresultsetloc2; ( K( w$ F6 O4 K' S% f3 ]
--将结果集数组分配给cursor
; \ o7 n8 C2 M7 Ifetchcursor1intoout_market_code; 8 s1 S/ t% ~/ P! X" F' y
--直接从结果集中赋值 & B. L) u% |, G& P
closecursor1; ; P, \* u* I- y4 s& h9 x9 L7 Q
( _! e, J7 m1 g" R+ m/ q5 I& t. k
ENDP1 ; v# d1 f6 w! H3 x
# k$ Y8 z. }2 s& c/ z3、动态SQL写法 5 S$ I) C4 l6 T* k2 }9 @+ V
DECLARECURSORC1FORSTMT1; 3 V2 K8 I7 p! A: Q" G& }% R
PREPARESTMT1FROM / Q% ]8 d% q$ D
'ALLOCATEC2CURSORFORRESULTSET?';
1 F3 F( L) K# U; g4、注意: : f4 ^- C6 O3 d6 J
一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。
8 ?. l- C$ `$ I4 q- ^$ X二、 allocate的cursor不能再次open,但可以close,是closesp中的对应cursor。 7 `5 z- x4 D7 P( _
3 [0 E8 g/ B7 e1.13 类型转换函数
1 d q- [- k& e3 y; f9 Q, @selectcast(currenttimeaschar(8))fromtb_market_code ; c1 C: \; @- a& B7 H
+ e& t. `1 X: c* S
1.14 存储过程的互相调用 2 T& U3 D0 Y u; Z: }9 u8 K
目前,csp可以互相调用。 ! j+ w' o4 w! }# Z' Z P, l
Sqlsp可以互相调用,
l% [: w% y$ m; u1 \# D( |Sqlsp可以调用Csp,
7 @# v8 M; E# p2 x0 Y* H但Csp不可以调用Sqlsp(最新的说法是可以) + H3 C" M- b" K: j
; j2 V! m: H' \ A6 C" M0 x$ P$ [, b1.15 C存储过程参数注意
* z; y8 T j+ C+ T8 Gcreateprocedurepr_clear_task_ctrl(
% `6 M% ~9 q: m3 c- E8 xININ_BRANCH_CODEchar(4),
* s% K* `' ]3 Q7 h% Y$ @6 s9 xININ_TRADEDATEchar(8),
3 s2 }* w4 X! N5 q! I# ` ININ_TASK_IDchar(2), . g( S( w, l( p; X' L
ININ_SUB_TASK_IDchar(4),
3 D5 x# O* n- tOUTOUT_SUCCESS_FLAGINTEGER) : b5 i, p4 N/ e0 B
$ J- r, {5 Z9 v- Q0 L' e# x* T; p
DYNAMICRESULTSETS0 ! g2 s5 C. j* m k
LANGUAGEC ! L1 @5 `" S# @
PARAMETERSTYLEGENERALWITHNULLS(如果不是这样,sql的sp将不能调用该用c写的存储过程,产生保护性错误) & e' w2 k6 d; c' h
NODBINFO
) J7 W4 w" E2 f0 ^5 p4 m! F" `0 iFENCED 2 E9 Z9 Z* p3 H B9 M7 B
MODIFIESSQLDATA & c- P. R- }" r5 H
EXTERNALNAME'pr_clear_task_ctrl!pr_clear_task_ctrl'@
点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹