天地不仁,以万物为刍狗!

DB2编程序小小技巧

上一篇 / 下一篇  2008-07-30 17:29:04 / 个人分类:db2

一些编程经验,与大家共享!

1        DB2编程       ITPUB个人空间+ty!^ uf!E6\
1.1        建存储过程时CREATE 后一定不要用TAB键        3
[4@TS Zr]01.2        使用临时表        3
~\8H"cy+L0`:rZ01.3        从数据表中取指定前几条记录        3
b+xa/J0D5?01.4        游标的使用        4ITPUB个人空间C5H.gz3k2n
注意commit和rollback        4ITPUB个人空间V#|3z?6G6^8@
游标的两种定义方式        4
3DriqC,px(^0修改游标的当前记录的方法        5
M#`,a C'BA6[01.5        类似DECODE的转码操作        5
3JdqZ/nm*L01.6        类似CHARINDEX查找字符在字串中的位置        5
M2P fvlg;r1J:E01.7        类似DATEDIF计算两个日期的相差天数        5ITPUB个人空间?{GI/iV1y
1.8        写UDF的例子        5
~8?!?lDCLV01.9        创建含IDENTITY值(即自动生成的ID)的表        6
-G{5b.p\+M%\|01.10        预防字段空值的处理        6ITPUB个人空间3?7k(m4_p8DM3Y
1.11        取得处理的记录数        6ITPUB个人空间+qO\3J%Vn8J1H%\Q
1.12        从存储过程返回结果集(游标)的用法        6
}KDlu2QMTx01.13        类型转换函数        8ITPUB个人空间gWm\0?
1.14        存储过程的互相调用        8ITPUB个人空间olx+K:LHj
1.15        C存储过程参数注意        8
o F*x'@Z[{n01.16        存储过程FENCE及UNFENCE        8
L;]^'K }!T4x01.17        SP错误处理用法        9
{,a ipz1S:\#d {01.18        IMPORT用法        9ITPUB个人空间^5m agz7w6P-j/w
1.19        VALUES的使用        9
X^Du.s#o01.20        给SELECT 语句指定隔离级别        10ITPUB个人空间{ J J(d9m'A|E-L
1.21        ATOMIC及NOT ATOMIC区别        10ITPUB个人空间0gk.b9|l&\$va{
2        DB2编程性能注意        10ITPUB个人空间 ?N'S,u1JN@.w d
2.1        大数据的导表        10
&\WhE,x\$y02.2        SQL语句尽量写复杂SQL        10ITPUB个人空间RJ'h.? x$Z3Yc
2.3        SQL  SP及C SP的选择        10
tP:i v(i2g }02.4        查询的优化(HASH及RR_TO_RS)        11
.A#e o~ A"B$y c.t$n02.5        避免使用COUNT(*) 及EXISTS的方法        11
a3rl!kbUS)y03        DB2表及SP管理        12ITPUB个人空间b.a)?&Rsw fl4_s6v,o'o
3.1        看存储过程文本        12ITPUB个人空间2Z9?)Y8S*Z
3.2        看表结构        12
}TI-d6jF03.3        查看各表对SP的影响(被哪些SP使用)        12ITPUB个人空间S0wdV1{%g
3.4        查看SP使用了哪些表        12ITPUB个人空间sbCt5dw
3.5        查看FUNCTION被哪些SP使用        12ITPUB个人空间p/o0~e'|m"U1m
3.6        修改表结构        12
[jlGA;p9G Y2o04        DB2系统管理        13
$F1w8Yx$G0`U04.1        DB2安装        13
(C#d#vn"y04.2        创建DATABASE        14
U3I_YF'K/Z&i)y've] h04.3        手工做数据库远程(别名)配置        14ITPUB个人空间|)c5E~"GF f
4.4        停止启动数据库实例        14ITPUB个人空间dWR:k!f1[
4.5        连接数据库及看当前连接数据库        14
!V*`Hs-VM#S&V04.6        停止启动数据库HEAD        15ITPUB个人空间3pp? IS
4.7        查看及停止数据库当前的应用程序        15
&B{,sS?f04.8        查看本INSTANCE下有哪些DATABASE        15
"BEB I*Z04.9        查看及更改数据库HEAD的配置        16
~loJd [bN)n04.9.1        改排序堆的大小        16
k]2N ZIDb04.9.2        改事物日志的大小        16
p~1S-e/o)dK04.9.3        出现程序堆内存不足时修改程序堆内存大小        16
.g'g2YjV/P04.10        查看及更改数据库实例的配置        16ITPUB个人空间%Gm3Xg-xPF
4.10.1        打开对锁定情况的监控。        16
?.uY;F0qC ]E,|04.10.2        更改诊断错误捕捉级别        17
$~K:B/}?5nTx04.11        DB2环境变量        17
$Z'a&QO|IO5k04.12        DB2命令环境设置        17
H5N!C o"]Ew.\2k04.13        改变隔离级别        17
Q _T c z^Pd04.14        管理DB\INSTANCE的参数        18
hH:d eJW#x8WX04.15        升级后消除版本问题        18
:Bbm1MZcM$d,Z04.16        查看数据库表的死锁        18

1        DB2编程
*oo`1\6os V9X.[01.1        建存储过程时Create 后一定不要用TAB键
A?'Xm T%A7v0create        procedureITPUB个人空间/Bc^ Q$m-@ `\"[
的create后只能用空格,而不可用tab健,否则编译会通不过。ITPUB个人空间WJ`%j;U/vzR I
切记,切记。

1.2        使用临时表

  要注意,临时表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建临时表的。ITPUB个人空间)L:~-tiYzS r @N
  另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。ITPUB个人空间DY^(?'\w-M8mqg
   建临时表时最好加上  with  replace选项,这样就可以不显示的drop 临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。
LErB lMPgq01.3        从数据表中取指定前几条记录
}`o"p'r.A$w F M0select  *  from tb_market_code fetch first 1 rows only

但下面这种方式不允许ITPUB个人空间mPw\*r3S!^ E w[
select market_code into v_market_code
)H7wz.u(^ }:V#b0        from tb_market_code fetch first 1 rows only;    
ZV} AE.kk$D$X0   ITPUB个人空间:K;e%{)B-DK`)s$]
        选第一条记录的字段到一个变量以以下方式代替
0]!Fa(UXD0    declare v_market_code char(1);ITPUB个人空间*X v-\/`3tq a
    declare cursor1 cursor for select market_code from tb_market_codeITPUB个人空间;Zo-X"F l V1N!g
        fetch first 1 rows only for update;
PE.X7kGzb0WG-s0    open cursor1;
B9Lt7b@ e]p;K#?0    fetch cursor1 into v_market_code;
6@?+`? tM/i0    close cursor1;

1.4        游标的使用
APR@M {+}W'{s0注意commit和rollbackITPUB个人空间Y(@0MI.F
使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。Commit 和Rollback有很多东西要注意。特别小心

游标的两种定义方式
6M+~D0N)}7@(rc0一种为
_.g6BbD4M!s0o0declare continue handler for not foundITPUB个人空间 h#GeTt;@Q L.]
   beginITPUB个人空间+MU(V4?4f AYv3U
     set v_notfound = 1;
x`B(_Y0   end;

declare cursor1 cursor with hold for select market_code from tb_market_code         for update;ITPUB个人空间L&H)]j8R-t0n'Wi!d
open cursor1;ITPUB个人空间:[CgG'g ~:mD hQ
set v_notfound=0;ITPUB个人空间6c9w1^*fs}1U-dpf
fetch cursor1 into v_market_code;
F&L^Hm0F"aYZOI0while v_notfound=0 DoITPUB个人空间z6Z2O{"Eh2T
                --work
B$n2X OWvFW J0                set v_notfound=0;
3zX N%C5Y6Ed0fetch cursor1 into v_market_code;ITPUB个人空间YM$L(~7~HbT@
end while;
s(dZ4o#oLr+Pb0close cursor1;
n'{^+EF(B0这种方式使用起来比较复杂,但也比较灵活。特别是可以使用with hold 选项。如果循环内有commit或rollback 而要保持该cursor不被关闭,只能使用这种方式。
hGP"E&{gJ0  另一种为ITPUB个人空间 P'f9q,M!B b
             pcursor1: for loopcs1 as  cousor1  cursor  asITPUB个人空间!{*f4R YsR
                                select  market_code  as market_code
{E*}7y-h0           from tb_market_code
M2AEhM2M0           for updateITPUB个人空间w6h^!g(ji
        do
ea:K&p`0        end for;ITPUB个人空间3t4Q ~`sHP"H
       这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。ITPUB个人空间R-d? G1S
  但不能使用with  hold 选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。

修改游标的当前记录的方法
|5Z GCp0update tb_market_code set market_code='0' where current of cursor1;
x `X8LY ? {0不过要注意将cursor1定义为可修改的游标
|i'lz"Kf0  declare cursor1 cursor for select market_code from tb_market_code
;^n9f~!DW|L0        for update;

for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。

       

1.5        类似decode的转码操作ITPUB个人空间}r{4d5yi9b
oracle中有一个函数         select decode(a1,'1','n1','2','n2','n3') aa1 fromITPUB个人空间}M*z'] k%c
db2没有该函数,但可以用变通的方法
xyx"d3AqM'L G0select case a1ITPUB个人空间/wy:K*t6vJC2a
                when '1' then 'n1'
k`mv&r@8Uu#Z|R0                when '2' then 'n2'
n6r-] u;g;l0                else 'n3'
8] S-| W,k YmV0          end as aa1 from

1.6        类似charindex查找字符在字串中的位置ITPUB个人空间.k)[3@Q&pJ+u3JY!v
Locate(‘y’,’dfdasfay’)ITPUB个人空间:j*Mg^A7V$uPr
        查找’y’ 在’dfdasfay’中的位置。

1.7        类似datedif计算两个日期的相差天数
(S*]5q2m.XCH(R S0days(date(‘2001-06-05’)) – days(date(‘2001-04-01’))ITPUB个人空间z8Cc3qU0C
days 返回的是从  0001-01-01 开始计算的天数ITPUB个人空间3i2EZ9U2?:O`,h
1.8        写UDF的例子
$M,?P3p {(Zi#Z0C写见sqllib\samples\cli\udfsrv.c

1.9        创建含identity值(即自动生成的ID)的表ITPUB个人空间e9HC/m g(Oev
建这样的表的写法
Fd#X:u|,u#r G0CREATE TABLE test
E XGxo9T&BU b%~mVA0     (t1 SMALLINT NOT NULLITPUB个人空间5{+YYxl`0a6b2b
        GENERATED ALWAYS AS IDENTITY
,RH{xU/|0        (START WITH 500, INCREMENT BY 1),ITPUB个人空间?0gr&P1o.R j+A?
      t2 CHAR(1));ITPUB个人空间I.Wc AM"Hu
在一个表中只允许有一个identity的column.

1.10        预防字段空值的处理ITPUB个人空间M$J}!I"E$j:c
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPTITPUB个人空间Y IB9t%{4d_
FROM DEPARTMENTITPUB个人空间6W},ib:nN2x
   COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。ITPUB个人空间f2\"A5N%y.GTu*n
   和oracle的isnull类似,但isnull好象只能两个表达式。
M g&[&n@B"dt0    

1.11        取得处理的记录数
6T |3XmS%} K0        declare v_count int;
p$p%j:n@0update        tb_test                set                t1=’0’ITPUB个人空间 m&bT:o J.e
                where        t2=’2’;ITPUB个人空间6m+?O-z`&p$[k
        --检查修改的行数,判断指定的记录是否存在ITPUB个人空间{Sz"Nw wcki:b
        get diagnostics        v_ count=ROW_COUNT;    
Kr aWX5MHpWA0        只对update,insert,delete起作用.
V c.n#ixA.u0?%U-C0        不对select into 有效

1.12        从存储过程返回结果集(游标)的用法
'sJ&z!F7RKT0y&_01、建一sp返回结果集
mU;Lm%]h0CREATE PROCEDURE DB2INST1.Proc1 (  )ITPUB个人空间/nfe5MX9j;[1u;o
    LANGUAGE SQLITPUB个人空间P2^M|H*bNoM
    result sets 2(返回两个结果集)
9|;r8~/KE,wI0------------------------------------------------------------------------
j$m6`6h@@|D)sd0-- SQL 存储过程
9l(|0e,KX}a0M-k.c/N0------------------------------------------------------------------------ITPUB个人空间.IFx1p8T@
P1: BEGIN
{j;N%md9jG6D4},IY:G0        declare c1 cursor  with return to caller for
~}7Wcb0            select  market_codeITPUB个人空间.bj[{J5qK)X*?B
            from    tb_market_code;ITPUB个人空间q_}/^-h*S;Q{Ss of j
        --指定该结果集用于返回给调用者
ER1yJ;jz+j0T0        declare c2 cursor  with return to caller for
-M/Z`n4r9^_[0            select  market_codeITPUB个人空间-L/?cZm7~/S`
            from    tb_market_code;
R$s s/z]8Q d|0         open c1;ITPUB个人空间 l;iu#s#s&p
         open c2;
(}M Ne~`5`6_S2p0END P1                                      

2、建一SP调该sp且使用它的结果集

CREATE PROCEDURE DB2INST1.Proc2 (
2m@-[ BQ0out out_market_code char(1))ITPUB个人空间!GN P#}5xO
    LANGUAGE SQLITPUB个人空间]_*X$d u um{
------------------------------------------------------------------------ITPUB个人空间!l9r0_,J Iy
-- SQL 存储过程ITPUB个人空间vgy#J]*STa#h
------------------------------------------------------------------------
6\6W\ j/v(C:p"\hj0P1: BEGIN

declare loc1,loc2 result_set_locator varying;
8dF,Y(gx&h3\0--建立一个结果集数组
x2fa*u)h%g:\"q y0call proc1;
#Poe}aj:\p)g~0--调用该SP返回结果集。
8V)s8G B| v/K0associate result set locator(loc1,loc2) with procedure proc1;ITPUB个人空间 LM*unhL/E:d
--将返回结果集和结果集数组关联ITPUB个人空间Y#I9oKeE5c
allocate cursor1 cursor for result set loc1;ITPUB个人空间(\K/wE9{
allocate cursor2 cursor for result set loc2;ITPUB个人空间{N?TeXAc
--将结果集数组分配给cursor
/u&Rk(Tn!u w'^D)U3F0C0fetch  cursor1 into out_market_code;
"f+qy3d:zE3[B$OIL0--直接从结果集中赋值
6N}]:xv0close cursor1;        

END P1

3、动态SQL写法
k6Pu%Ec4Z~P0     DECLARE CURSOR C1 FOR STMT1;
(e|)hR[Y obW0     PREPARE STMT1 FROMITPUB个人空间)e'_:JD/Q*L-s
        'ALLOCATE C2 CURSOR FOR RESULT SET ?';
nrnu*A+E(a"yo04、注意:
7D'D9W#W-U0一、        如果一个sp调用好几次,只能取到最近一次调用的结果集。
U fKU@X#@0二、        allocate的cursor不能再次open,但可以close,是close sp中的对应cursor。

1.13        类型转换函数
#h9}r?(W*A"b3pGP1b$d0select cast ( current time as char(8)) from tb_market_code

1.14        存储过程的互相调用
y/Jr$f;]+c0目前,c sp可以互相调用。ITPUB个人空间L0} q'vm4bc#^:U ~
Sql sp 可以互相调用,
Q*GmcQ v&eX{0Sql sp 可以调用C sp,ITPUB个人空间yi!c Oh}r6g%X
但C sp 不可以调用Sql sp(最新的说法是可以)

1.15        C存储过程参数注意
!ZrR9^8L!N_&|\ @]0create procedure pr_clear_task_ctrl(ITPUB个人空间 zz0y;L^W/K!a]
                                        IN IN_BRANCH_CODE char(4),ITPUB个人空间5I O:~{6M n4I
                      IN IN_TRADEDATE   char(8),
'C"]'y*Z/{A6a m0                                  IN IN_TASK_ID     char(2),
m s gn9Q}9l2a0                               IN IN_SUB_TASK_ID char(4),ITPUB个人空间:u#vz+c/l@u
                               OUT OUT_SUCCESS_FLAG INTEGER )

DYNAMIC RESULT SETS 0
I5PQ,y'w!?V:S0LANGUAGE CITPUB个人空间2xnhI j8u~
PARAMETER STYLE. GENERAL WITH NULLS(如果不是这样,sql 的sp将不能调用该用c写的存储过程,产生保护性错误)ITPUB个人空间2Q}0f-}+l&e
NO DBINFO
']])ary3z"z;~ u0FENCED
Yo _6QCP h0MODIFIES SQL DATA
^z%W$]X-\$F0EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@

1.16        存储过程fence及unfence
1?@a[ _#|8MD0fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。ITPUB个人空间7b:x?ma:V
一般而言,fence的存储过程比较安全。ITPUB个人空间q;Yf&s v cc
但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。

1.17        SP错误处理用法ITPUB个人空间4D*[]9~p k0iy
如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP,ITPUB个人空间.HP~c$hU
DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都ITPUB个人空间'p'oo'Kc2b"y
会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。
2{(A!NK.`IYi7BW0处理办法:ITPUB个人空间:u` h1jT&y
定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0,ITPUB个人空间+} o}q'rg6r(J
在CALL SPNAME之后, SET V_STATUS = 1,ITPUB个人空间t"D4U(S#O1R
DECLARE CONTINUE HANDLER FOR SQLWARNING
W-h-N6[]*E0BEGIN
5i!K.J*A _?at5p o%M RH0        IF V_STATUS ; 1 THENITPUB个人空间#U7tQ0^[J@'}Fr
                --警告处理,插入日志ITPUB个人空间z#VJ&Sy9H e
                SET V_STATUS = 0;
U{r(\D!Gj&S0        END IF;ITPUB个人空间fK wLv} s,d/`
END;ITPUB个人空间1K K:ha r9Y gU ~
1.18        import用法
~)y P'S2{Av0db2 import  from  gh1.out   of  DEL messages err.txt insert into  db2inst1.tb_dbf_match_ha

注意要加schma

1.19        values的使用ITPUB个人空间I*a-Ur{T
如果有多个 set  语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。

但要注意,values不能将null值付给一个变量。ITPUB个人空间 J H{s{Y
values(null) into out_return_code;ITPUB个人空间?KbJ5K o
这个语句会报错的。

1.20        给select 语句指定隔离级别
7O;iFJ,? Sa)n!R0select * from tb_head_stock_balance with ur

1.21        atomic及not atomic区别
b"g Xyz0atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。

2         DB2编程性能注意
9C J,d+}0z|5v(ZYmj02.1        大数据的导表ITPUB个人空间I@s]T4eL~:NI
应该是export后再load性能更好,因为load不写日志。
;UBO RvP3B6ZM-r R0比select into 要好。

2.2        SQL语句尽量写复杂SQL
,~@3jW)O0   尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。
4B(M(eH0S,B$S)e0   DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。ITPUB个人空间:H~,k(EZ3I7J
        Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。
t e P0f)}i \0                这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。ITPUB个人空间+k7i*xNvi5f
                一个总的思想就是尽量减少SQL语句的个数。
b`2bB$yz.r)Az02.3        SQL  SP及C SP的选择
+{2^1bA:K\r5zl9y o0首先,C的sp的性能比sql 的sp 的要高。ITPUB个人空间l{S @V
一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。
%D$jx'P DQU5d$V0        而如果逻辑比较复杂,SQL比较简单,用c写比较好。

2.4        查询的优化(HASH及RR_TO_RS)
Z#P u b!DH*p3J0db2set         DB2_HASH_JOIN=Y                (HASH排序优化)
|%vb2?j{3q0   指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
e t?\-r u _-l0   剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下  72秒。

db2set         DB2_RR_TO_RS=Y      
$| C awA.} K'_ oU}{0         该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
%N1n9d:f f)x@0        这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。    

2.5        避免使用count(*) 及exists的方法
!o l.@9o/iDV T"n8l8p,z01、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。ITPUB个人空间Uhb"]8H? il8T$c6^
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。

如果做这两中操作的目的是为ITPUB个人空间Y.rQ-fll
       select into 服务的话,就可以省略掉这两步。ITPUB个人空间 wd uP6r-\
直接使用select into 选择记录中的字段。

如果是没有记录选择到的话,db2 会将  sqlcode=100 和 sqlstate=’20000’
*e#wH} L#X2~0如果是有多条记录的话,db2会产生一个错误。

程序可以创建  continue handler for  exceptionITPUB个人空间:jJG^6bcU
              continue handler for  not found
(TLN0|.LY r1A0来检测。
!Y*L,o"V+@%Iv#?0这是最快速的方法。

3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。

3        DB2表及sp管理
6`1i7I7I6lkz03.1        看存储过程文本
X+H:l"A#Yv0select text from syscat.procedures where procname='PROC1';ITPUB个人空间GN ?LsR
3.2        看表结构
0} p/W}Aw+o0describe table syscat.procedures
(Wp.|i:pL?Ms0describe select * from syscat.procedures

3.3        查看各表对sp的影响(被哪些sp使用)ITPUB个人空间#P2oM,HO\
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME  from syscat.packagedep where bname='TB_BRANCH'))

3.4        查看sp使用了哪些表
"xR5Zf[k0select bname from syscat.packagedep where btype='T' and pkgname in(select bname from sysibm.sysdependencies where dname in (select specificname from syscat.procedures where procname='PR_CLEAR_MATCH_DIVIDE_SHA'))
?2g|*A+?#dU03.5        查看function被哪些sp使用ITPUB个人空间 ]:r;n'hi7Lw#Z
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME  from syscat.packagedep where bname   in  (select SPECIFICNAME from SYSCAT.functions where funcname='GET_CURRENT_DATE')))

使用function时要注意,如果想drop 掉该function必须要先将调用该function的其它存储过程全部drop掉。
EZD[)z!I j0        必须先创建function,调用该function的sp才可以创建成功。ITPUB个人空间:I eV+G8T]
3.6        修改表结构
g)N&`/m7E+Z0一次给一个表增加多个字段
$Pu+G9m|0db2 "alter table tb_test add column t1 char(1) add column t2 char(2) add column t3 int"

4        DB2系统管理
0z#cvL-G o.QB}04.1        DB2安装ITPUB个人空间}9r*TS|^T9As
  在Windows 98 下安装db2 7.1 或其他版本,如果有Jdbc错误或者是Windwos 98不能启动,则将autoexec.bat 中的内容用如下内容替换:

C:\PROGRA~1\TRENDP~1\PCSCAN.EXE C:\ C:\WINDOWS\COMMAND\ /NS /WIN95ITPUB个人空间&|7T1`#t%s:rVrQ
rem C:\WINDOWS\COMMAND.COM /E:32768ITPUB个人空间B5C5Ur'd5[7|ouj
REM [Header]

REM [CD-ROM Drive]

REM [Miscellaneous]

REM [Display]

set PATH=%PATH%;C:\MSSQL\BINN;C:\PROGRA~1\SQLLIB\BIN;C:\PROGRA~1\SQLLIB\FUNCTION;C:\PROGRA~1\SQLLIB\SAMPLES\REPL;C:\PROGRA~1\SQLLIB\HELP
uzF'scom8m9s0IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMQENV.BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMQENV.BATITPUB个人空间:d&T6L%|Q-g,K-?
IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMNENV.BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMNENV.BAT
o0Yv(Wh)sr[+^ eQl0set DB2INSTANCE=DB2
([u'}X#RYt0set CLASSPATH=.;C:\PROGRA~1\SQLLIB\java\db2java.zip;C:\PROGRA~1\SQLLIB\java\runtime.zip;C:\PROGRA~1\SQLLIB\java\sqlj.zip;C:\PROGRA~1\SQLLIB\binITPUB个人空间 L*BJV9yBd K
set MDIS_PROFILE=C:\PROGRA~1\SQLLIB\METADATA\PROFILESITPUB个人空间2JHb C5S"SmDs9q
set LC_ALL=ZH_CN
m%hLWG*a t(X0set INCLUDE=C:\PROGRA~1\SQLLIB\INCLUDE;C:\PROGRA~1\SQLLIB\LIB;C:\PROGRA~1\SQLLIB\TEMPLATES\INCLUDEITPUB个人空间0U^5Gg R b*|L
set LIB=C:\PROGRA~1\SQLLIB\LIB
S t&T8oF}`-Z0set DB2PATH=C:\PROGRA~1\SQLLIBITPUB个人空间`#NYD{1a:z6\N'M
set DB2TEMPDIR=C:\PROGRA~1\SQLLIB
6\%[#A'Bn7?_0set VWS_TEMPLATES=C:\PROGRA~1\SQLLIB\TEMPLATES
:r%\6|%e&s[-I(_0set VWS_LOGGING=C:\PROGRA~1\SQLLIB\LOGGINGITPUB个人空间(F;RH/R.abX
set VWSPATH=C:\PROGRA~1\SQLLIB
8O E z Oc0set VWS_FOLDER=IBM DB2ITPUB个人空间,E}l!k-|gz0o~
set ICM_FOLDER=信息目录管理器

win

4.2        创建DatabaseITPUB个人空间C-V N'd!yO%I
create database head using codeset IBM-eucCN territory CN;ITPUB个人空间'KC r OmhX
这样可以支持中文。

4.3        手工做数据库远程(别名)配置ITPUB个人空间+u-R;x9@u]+S6k
db2  catalog tcpip  node   node1  remote   172.28.200.200 server  50000ITPUB个人空间9e9W#rXJ'Z+dK']9N6e-z
db2  catalog db    head   as     test1                at  node   node1

然后既可使用:
8c4Y5f ~8KHw5I0   db2 connect to test1  user …  using …
P$cKlu_(^0连上head库了

4.4        停止启动数据库实例
Aa7a0O$Fz&w `(C Q-H!k0db2startITPUB个人空间C\ GMs(K5P
db2stop (force)

4.5        连接数据库及看当前连接数据库
C%e#`jdsy#tG0连接数据库
A;B7UVOtU'z6V0db2  connect to head user db2inst1  using db2inst1

当前连接数据库
E;f,Zxs j,z0db2  connect
)rO8iN"r,sa"z04.6        停止启动数据库headITPUB个人空间 lw QKSCVC s.W
db2  activate  db  head
5v5S'Fh#N W4|d({_ YJ0db2  deactivate db  headITPUB个人空间#L!P2v*S-xs/u6S
要注意的是,如果有连接,使用deactivate db 不起作用。ITPUB个人空间 Cm,u1CC&Qy
如果是用activate db启动的数据库,一定要用deactivate db才会停止该数据库。(当然如果是db2stop也会停止)。ITPUB个人空间0gE^RU1EQ&HY3D
使用activate db,这样可以减少第一次连接时的等待时间。ITPUB个人空间h~5k4rq
Database如果不是使用activate db启动而是通过连接数据库而启动的话,当所有的连接都退出后,db也就自动停止。

4.7        查看及停止数据库当前的应用程序ITPUB个人空间mU:}A(^
查看应用程序:
9an^^r0db2   list          applications         show  detailITPUB个人空间{P@EV
       
)v kG6C)j9x_0授权标识 | 应用程序名 | 应用程序句柄 |  应用程序标识 | 序号#  | 代理程序 |  协调程序 | 状态 |  状态更改时间 |  DB 名 | DB 路径|                                                      |    节点号 |   pid/线程

        其中:1、应用程序标识的第一部分是应用程序的IP地址,不过是已16进制表示的。
)|;[1N c \'iYROfM1K0                2、pid/线程即是在unix下看到的线程号。

停止应用程序:ITPUB个人空间4K.X^ ]"G[4]
db2 "force application(236)"
8D4b];wa-j0db2 “force application all”

其中:该236是查看中的应用程序句柄。

4.8        查看本instance下有哪些database
UcUN*bXda0db2 LIST DATABASE DIRECTORY  [ on /home/db2inst1 ]
h w2owz*YeI,p04.9        查看及更改数据库head的配置
X:h\KB6~w1}0请注意,在大多数情况下,更改了数据的配置后,只有在所有的连接全部断掉后才会生效。

查看数据库head的配制
e-U2]xr_Y0db2 get db cfg for head

更改数据库head的某个设置的值
/_+ZD d TF04.9.1        改排序堆的大小ITPUB个人空间Mr};} N#C
                                db2 update db cfg for head using SORTHEAP 2048
7cD"c4z O4Tt2_1O0        将排序堆的大小改为2048个页面,查询比较多的应用最好将该值设置比较大一些。
9{ rFS BIG04.9.2        改事物日志的大小
w#oqwh1gl0                        db2 update db cfg for head using  logfilsiz  40000
k.K uj%w&Dp$e0                        该项内容的大小要和数据库的事物处理相适应,如果事物比较大,应该要将该值改大一点。否则很容易处理日志文件满的错误。

4.9.3        出现程序堆内存不足时修改程序堆内存大小
9yLmy!F8v5Ed0                        db2 update db cfg for head using  applheapsz  40000ITPUB个人空间`2}!JLs1R3LD9xN
                        该值不能太小,否则会没有足够的内存来运行应用程序。

4.10        查看及更改数据库实例的配置
)]u7j$G"j?c,E/s4GZ0查看数据库实例配置ITPUB个人空间WSS j2|9h[:g4[\
db2  get dbm cfgITPUB个人空间n+q1j)z0U&x
更改数据库实例配制

4.10.1        打开对锁定情况的监控。ITPUB个人空间D&BlXgW3MI
                                db2 update dbm cfg using dft_mon_lock  onITPUB个人空间-L8X;@n \M
4.10.2        更改诊断错误捕捉级别
Trqc4]0                        db2 update dbm cfg using diaglevel                3
:~6lY&t[2r]*Zp0                                        0 为不记录信息
,y+\Zo T1~)X7v0                                        1 为仅记录错误
Va u;n.ekV0                                        2 记录服务和非服务错误
ib,hh6~#cc c0缺省是3,记录db2的错误和警告ITPUB个人空间)h.A oD-Z&@9x5\
                                        4 是记录全部信息,包括成功执行的信息ITPUB个人空间vy0~q&Z&I7W
                        一般情况下,请不要用4,会造成db2的运行速度非常慢。ITPUB个人空间6?$e.jm:G3n+Fd
                               
9S-}9X+GA~1C J04.11        db2环境变量ITPUB个人空间,^;H RO}0e Kt
db2 重装后用如下方式设置db2的环境变量,以保证sp可编译ITPUB个人空间da_3?%iy G
将set_cpl 放到AIX上, chmod +x set_cpl, 再运行之

set_cpl的内容
k-_ci%[:|+hN&z0db2set DB2_SQLROUTINE_COMPILE_COMMAND="xlc_r  -g \ITPUB个人空间3~j-N]2FV^e
-I$HOME/sqllib/include SQLROUTINE_FILENAME.c \ITPUB个人空间{+I;X0Tq)Fe
-bE:SQLROUTINE_FILENAME.exp -e SQLROUTINE_ENTRY \
'j8a@GRL]R(~0H0-o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2"

db2set DB2_SQLROUTINE_KEEP_FILES=1
X;Z9\!}G F04.12        db2命令环境设置
C.X'o%B|z/Ka0        db2=>;list command optionsITPUB个人空间D]~xy#F9dH7J&x
        db2=>;update command options using C off--或on,只是临时改变
Yg:^.NG!J0^GB0        db2=>;db2set db2options=+c --或-c,永久改变

4.13        改变隔离级别
|LQ3rI3\]6N0DB2SET DB2_SQLROUTINE_PREPOPTS=CS|RR|RS|UR
PYj.sKq0       ITPUB个人空间$zVv%h gc`d
交互环境更改session的隔离级别,ITPUB个人空间_idD5g`{0l2x cS
       db2 change isolation  to URITPUB个人空间 KN1L3m&Q H1G1h
                请注意只有没有连接数据库时可以这样来改变隔离级别。

4.14        管理db\instance的参数ITPUB个人空间M~ z3H IJ9mo
get db cfg for head(db)
H%A&de1]0get dbm cfg(instance)

4.15        升级后消除版本问题ITPUB个人空间3sA&yd"F2n;o,VgM%f
db2   bind  @db2ubind.lstITPUB个人空间LBh u K JWl hR,`
db2   bind   @db2cli.lst

4.16        查看数据库表的死锁ITPUB个人空间Hl(V ZR+na0DK jQ
再用命令中心查询数据时要注意,如果用了交互式查询数据,命令中心将会给所查的记录加了s锁.这时如果要update记录,由于update要使用x锁,排它锁,将会处于锁等待.

首先,将监视开关打开
2w9pF S pVm0db2 update dbm cfg using dft_mon_lock  onITPUB个人空间-\ z0a4f;E#Us'_&jr
快照
e_jWT}%y)rU0  db2 get snapshot for  Locks  on  cleardb   >;snap.log
uI*MBJ_&dC0                    tables
$v&a,M9m c7J8d0                                                bufferpoolsITPUB个人空间.j)v:A K;} T(JCm
                                                tablespacesITPUB个人空间I(l VS^4q
                                                database
3I R)l!Zp"i1H^)I0   然后再看snap.log中的内容即可。
:l8b8|A$T'`;}+rm'`0对Lock可根据Application handle(应用程序句柄)看每个应用程序的锁的情况。ITPUB个人空间[M7qc*C }W R
监视完毕后,不要忘了将监视器关闭ITPUB个人空间-ynW;E(o-|7PzQ O
     db2 update dbm cfg using dft_mon_lock  off


TAG:

Germin的个人空间 引用 删除 Germin   /   2008-11-07 08:32:10
非常好!
慢慢学习再实践!
引用 删除 db2   /   2008-07-31 18:04:52
非常的好!! 非常的好!! 非常的好!! 非常的好!! 非常的好!! 非常的好!! 非常的好!! 非常的好!! 非常的好!! 非常的好!!
引用 删除 db2   /   2008-07-31 17:57:23
非常的好!!
引用 删除 Guest   /   2008-07-31 17:56:52
-5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-24  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 12244
  • 日志数: 273
  • 图片数: 1
  • 文件数: 2
  • 建立时间: 2007-12-01
  • 更新时间: 2008-11-19

RSS订阅

Open Toolbar