信息产业培训网
[当前位置]:首页--技术专区--数据库--DB2RSS订阅按钮

DB2 V9.5中数据库应用程序移植的改进

http://www.miiceic.org.cn   2008-6-16 10:48:19   中程在线   浏览数:
关键字:DB2 V9.5

版本9.5中改进的应用程序可移植性增加了与现有代码的兼容性,并且不再需要迁移使用其他供应商的数据库的应用程序。版本 9.5 包含以下增强功能: I|# '!\7  
"^53QIL0  
• 支持在过程和调用过程的应用程序中使用 ARRAY 数据类型ysv moq  
nC%~ r;  
• 支持全局变量。全局变量是已命名的内存变量,您可以通过 SQL 语句访问和修改此变量。版本 9.5 支持已创建的会话全局变量,这些变量与特定会话相关联并包含该会话独有的值。 >>62v0w2  
V liX<F7A  
• 支持其他供应商的 SQL 方言。版本 9.5 包含对 DECODE、NVL、LEAST 和 GREATEST 函数的支持。 s]4nHE  
\5(-eTXo  
t/VX$xwBo/  
数组数据M6{h3G{^  
LOpu  J  
$D9{m2D6M  
在以前的DB2版本,碰到数据集合处理的程序移植,我们只能通过临时表或游标来处理,这是非常麻烦的。 >b{Uv5S(  
Wwo- +^  
版本 9.5 支持 ARRAY 集合数据类型。您可以在存储过程和应用程序中对它们进行处理,此功能使从其他数据库供应商移植已支持数组的应用程序和存储过程更容易。 K,[Ap_bn  
d~ajs'L;5  
您可以使用数组以在应用程序与存储过程之间更有效率地传递数据以及存储和处理 SQL 过程中的瞬态数据集合,而不必使用关系表。SQL 过程中可用的数组运算符允许更有效率地存储和检索数据。 {V%~<88  
=0) C3:q  
ka-n[Hz  
版本 9.5 中对数组数据类型的支持允许您执行以下操作: W]]-NWk  
E8H3pjN{m  
xAN1BK  
• 根据数组创建用户定义的类型;例如,CREATE TYPE INT10 AS INTEGER ARRAY[10] 定义最多 10 个整数值的数组的类型; *7dedUJP  
X$@IbaBygT  
• 在存储过程和应用程序中声明数组类型的变量和参数; $JLf]9[N  
S\h"yu4X  
• 创建和处理数组值,数组处理的基本部分包括数组构造方法、设置子下标、元素计数和整理; oV9_p ,  
uE dc6U  
• 在 JDBC 和 CLI 应用程序与 SQL 和 Java 存储过程之间来回传递数组; ^h5qUrulL  
zG|?gV,d x  
• 将数组转换为表(每个表行一个数组元素)以及将聚集列转换为数组,以便更容易在数组与 SQL 之间通过接口进行连接; <SHR:u]ZJ  
`Z3Nhr&  
• 使用输入和输出数组参数从命令行处理器调用过程。 #I_ eBeTO  
!dW8Qay%y  
yN- 5:k.r  
ARRAY 数据类型定义: h4!]^_  
!ep/(D-vh  
CREATE TYPE type-name AS data-type ARRAY [integer-constant] YP(r[<9|  
k7:w  
其中:data-type 不支持LONG VARCHAR, LONG VARGRAPHIC, LOB, XML类型, integer-constant 最大值2147483647 |8YdL)3  
*7O*%~Z  
/'z/W &V4  
与ARRAY相关的函数: MJ2]*$Nm  
~N#0  
ARRAY_AGG 将行数据集聚集成数组 %JFSE[%&  
; -Fayb[  
UNNEST 将数组数据转成行数据 A{4h bHs  
dMA-_ 'iX  
CARDINALITY 返回数组中的元素号,类型 BIGINT /b My}W>a  
sD=`zjZ\  
MAX_CARDINALITY 返回数组中所含的最大元素号,类型 BIGINT H3/LMDNQ  
#9 ;-]"  
注意,这些函数只用于SQL procedure |? !6[  
8  Zq &  
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) e- t5;(2  
TB*a;mb  
WITH ORDINALITY AS T(PHONE, ID, INDEX) /|Q;iz  
4h6[" L  
ORDER BY T.INDEX S x{1}a  
Uq Kqdq  
}J:N[Bxk  
Example 1 KG Tf'0.  
$''i'; pA  
这个例子包含2个存储过程, sum 和 main. 存储过程 main 建立一个含有6个元素(integer)的数组。传递这个数组给存储过程sum, 计算出所有元素值的和并返回给调用存储过程 main. 存储过程 sum 说明了array subindexing 和CARDINALITY 函数的用法. "fF]+(WV  
M Jc-D&  
create type intArray as integer array[100] @ <Q)N;7>%  
<30rB6Glo  
R\s%O{  
create procedure sum(in numList intArray, out total integer) 2PR6V*?  
eRTa^2E%  
begin v CRHkg  
b wa(e  
declare i, n integer; })7(t>.  
k75+J]y~  
set n = CARDINALITY(numList); 'GV Ql  
U^.d$0_V:  
set i = 1; ^YLH}`-^5  
rD#]D'k  
set total = 0; hO B?0s  
 ,/ 7c[K-  
while (i < n) do uLz< "hUB  
!ztx,~Bz"  
set total = total + numList; xYV >X  
K -Y0-q  
set i = i + 1; M[#?E~.  
@$9/ VLb8  
end while; }N` $]  
Y\jitx]IP  
end @ Gc_EtQi  
?RSWH=lI,_  
3cLx(5,  
create procedure main(out total integer) EzKk=  
Cmu")St!  
begin SvC dT G  
XP^USrz  
declare numList intArray; / [! /  
l_3rD:b_  
set numList = ARRAY[1,2,3,4,5,6]; y(p_9F%CU^  
aR[KBz2t  
call sum(numList, total); P`;AltKb  
7P/-y_M  
end @ G+& xEjj  
>8wM1awkP  
m}(F  
Example 2 YNw-eT,  
*\C[Q\k  
这个例子,我们使用2个数组类型(intArray 和 stringArray),使用一个包含列(id 和 name)的 persons 表。 存储过程 processPersons 添加3个人到 persons表, 并返回person名字的数组,按id排序,名字中包含字母 'o'。 3个persons 的 id 和 name 作为数组元素(ids 和 names)添加到数组中。这些数组使用UNNEST 函数,将数组数据以包含2列数据的表的表达形式表达,并插入到persons 表中。最后使用ARRAY_AGG函数将数据汇集返回给输出参数。 k <19.H  
B&V&8^ \  
create type intArray as integer array[100] @ #rA~eu4+  
uu?uxx"p  
create type stringArray as varchar(10) array[100] @ dZVo\ {A{  
!Ye!, R  
Z6`Aw{   
create table persons (id integer, name varchar(10)) @ Nd) @<   
mr Q2US<  
insert into persons values(2, 'Tom') @ %5RNv 5  
E2c3!9b  
insert into persons values(4, 'Jill') @ tRZ2'   
!U53=WUQ  
insert into persons values(1, 'Joe') @ bi"cd-@3  
H!`Y~a  
insert into persons values(3, 'Mary') @ (VwNNb  
@ ZK"<#>  
+Dt!#Yw  
create procedure processPersons(out witho stringArray) v YZ W6qui  
rzZ7n::R  
begin >:#T+FUWZ  
 &tcv*2  
declare ids intArray; [\;C)a c`)  
Rp]zxK:  
declare names stringArray; d8_B9i^M[  
?C[*,$wh  
set ids = ARRAY[5,6,7]; m|oNv Z_  
@_S.whw  
set names = ARRAY['Bob', 'Ann', 'Sue']; Q;G.K^  
l( IZU`  
insert into persons(id, name) (select T.i, T.n from UNNEST(ids, names) as T(i, n)); x|M+$xf\m  
mvk^g@{c  
set witho = (select array_agg(name order by id) >xeh)\E(^1  
=Pu#%],W1  
from persons 1_RWaQL  
pQ[+R6s  
where name like '%o%'); lltVQ\{  
p1it`\;]=  
end @ pb$bM*$B!  
<&A" x0\H  
hUF4};  
Example 3 5+9OJg4 q  
b#}$co2  
这个例子说明在java代码中如何调用含有数组参数的存储过程,本例子中存储过程bonus_calculate含有2个输入参数,一个是数组projs,一个是整形percentage `E4d^jmQJ  
i5]&z9<L!  
……… X [&U'7*  
{p1Np =0  
String sql = "CALL bonus_calculate(?, ?)"; 9c}cNOk -#  
`QkR'lFl  
CallableStatement callStmt = con.prepareCall(sql); _HA@]<2d  
{$S$un:3  
// Create an SQL Array bpV^r.^  
h( G to*  
projects[0] = "AD3111"; JPy@ypN  
E.2 #!  
projects[1] = "IF1000"; KNAdm  
xr_F^%9ft  
projects[2] = "MA2111"; Fj}yPo /1  
]j=x0.n 2  
java.sql.Array projectArray=con.createArrayOf("VARCHAR",projects); WD3 OwmyS  
!RkPTZ  
// set IN parameters yg,JW-{C*  
;PD)!H)Z  
callStmt.setArray(1, projectArray); wjw9y  
W lD)9  
callStmt.setInt(2,percentage); )&HQX|_  
1'Z(:_`  
// call the procedure 4Qm%+k  
e\5M W?-  
callStmt.execute(); [MME^TVJhd  
Fmk\peT"o  
………… zu GP|G  
x1?9= 1oX  
'Eiotdg  
CREATE PROCEDURE bonus_calculate (IN projs projects, IN percentage integer) A6X wg  
M$wgLD4d  
BEGIN rI]AC8|,  
GBf>|  
DECLARE emp_array employees; HcH>]o:Il  
h4< 8.  
DECLARE bonus_array bonus; PDI9;+  
ok$4Pj{Y]j  
SELECT cast(array_agg(employee.empno) AS employees), ; 835p{  
iw5No  
cast(array_agg(.10*salary) AS bonus) INTO emp_array,bonus_array qo't` "m  
7YO564=  
FROM vempprojact, unnest(projs) AS P(id), employee _ ZT g  
*\[m</p  
WHERE P.id=vempprojact.projno AND employee.empno=vempprojact.empno; vcs|Y6YL  
~)sV|Y  
INSERT INTO bonus_temp yu tyo/;  
v8<BH1*  
SELECT T.empno, T.bonus _o.?cXGz  
:V\8Z5Yg  
FROM unnest(emp_array, bonus_array) ^BN-Nh2o)L  
Umk-s  
WITH ORDINALITY AS T(empno,bonus, idx); \?D::nP  
@~&EzM=<  
END@ hpn~cy  
bq}z4B  
Pyz[>0R%~  
全局变量 k{^gi(?p6  
hfh*T;wb  
在以前的DB2版本,碰到含全局变量处理的移植程序移植,我们只能通过全局临时表来处理,使用起来非常麻烦。 KSo@ t  
_'l~j.h8P|  
Q~"+;6+  
全局变量改进了 SQL 语句之间的数据共享。版本 9.5 引入了全局变量的概念,它们是命名的内存变量,可以通过 SQL 语句访问和修改这些变量。全局变量使您能够在运行于同一会话(或连接)的不同 SQL 语句之间共享数据,而不需要应用程序逻辑来支持此数据传输。 d=PnB[  
HfY 5g82#E  
>~WM@g"  
应用程序不再需要发出这种语句来将值从一个语句的输出自变量(如主机变量)复制到另一个语句的输入自变量。此外,包含在数据库系统本身中的 SQL 语句(如定义触发器和视图的语句)现在可以访问此共享信息。 AwcYwr4Q  
-.a<8"-  
s\re|$Zf  
全局变量有助于您为数据库本身中的数据传输实现更复杂的交互式模型,以便您不必在应用程序或 SQL 过程中放置支持逻辑。与全局变量相关联的已定义特权确保所传送数据的安全性不会升高到强制通过应用程序逻辑。如果安全性存在问题,那么您可以通过 GRANT 和 REVOKE 语句来控制对全局变量的访问。 ;]S{Rw3K[  
<jJ?Rq y  
5t9I*/!yv-  
存储静态的、在会话期间很少更改的或者进行了管理控制的数据时,全局变量特别有用。用于将警报发送至 DBA 的寻呼机号以及指示是启用还是禁用某些触发器的指示器就是这种数据的示例。 ErNdY1/L  
44W\u9VZ  
MTM\~E3!  
版本 9.5 支持已创建的会话全局变量。会话全局变量与特定会话相关联并包含该会话独有的值。已创建的会话全局变量可用于任何正在您定义该变量的数据库上运行的活动 SQL 语句。系统目录包含已创建的会话全局变量的定义以及与这些全局变量相关联的特权。 DFCk%?#S  
m^+5n{UB;  
yR[ p41p  
例子: p~V{Y_hm  
rjV%Ja\P  
创建全局变量: N0 t+,i?G  
h=)6#>;  
CREATE VARIABLE myjob_current varchar (10) DEFAULT ('soft-engg'); <v!  
2^HWB8J  
G- #Jm.kE  
获取全局变量信息: */;2n'4z  
/FciQ <;*  
SELECT substr (varschema, 1, 10) as varschema, / hb+xf'  
YoW/oYX!  
substr (varname, 1, 10) AS varname, Y?V&~4  
&01JjJ?6  
varid, substr(owner,1,10) AS owner, lb{XRgdXDL  
q C`Cf-U@  
ownertype, create_time, EQ. ' /6  
t}jqE E[  
substr(typeschema,1,10) AS typeschema, o:{#NZ`   
z:z(K/qR  
substr(typename,1,10) AS typename, length #OC!cDW  
 AMHI  
FROM syscat.variables Mpa]o#WX9  
0sAF="  
WHERE varname = 'MYJOB_CURRENT'; = )?qu  
Dc-@q&[zp  
|Ohpn>\5F  
给用户praveen 和 sanjay 读和写权限,剥夺用户sanjay写权限: [s?C@AI`  
a2|4],9  
GRANT READ, WRITE ON VARIABLE myjob_current TO USER praveen, USER sanjay; wE-v \y">d  
+e}WH8',f  
REVOKE WRITE ON VARIABLE myjob_current FROM USER sanjay; 1F~4   
SEZ;5S#6 g  
855h+s/  
获取用户 praveen 和 sanjay 的全局变量权限信息: {^4B zY  
8RcV) ?w  
SELECT substr (varschema, 1, 10) AS schema, !'B_AY<  
Fv3A9T$ }  
substr (varname, 1, 10) AS name, zG|Po  
XkhkBWb  
substr(grantor,1,10) AS grantor, grantortype AS Rtype, 6cLu7<s  
oB ]0  
substr(grantee,1,10) AS grantee, granteetype AS Etype, Q?VT1i> P  
T*ZJD-1  
readauth, writeauth 8L}* d  
`&`"v>P  
FROM syscat.variableauth tiCA  
6$Uf\p-9E  
WHERE varname ='MYJOB_CURRENT'; ] v%GD mb  
msMY2^~c  
`diLL/@c  
qKW8;/(m  
pNX_F{k9  
在触发器中使用全局变量,本例是设计一个disable触发器示例: ^}!qrc1A&  
8,.#q |G)  
CREATE VARIABLE disable_trigger char (1) DEFAULT ('N'); N6:<W3'A  
HaKF]&.FT  
CREATE TRIGGER validate_t BEFORE INSERT ON EMPLOYEE orXMg)d  
#t0V@D(7S  
REFERENCING NEW AS n FOR EACH ROW `c7ld]V)  
1&Qto.d~  
WHEN (disable_trigger = 'N' AND n.empno > '10000') bpSN {:o5  
~k#u;E?  
SIGNAL SQLSTATE '38000' HIM$sidi.  
WNx;`0o  
SET message_text = 'EMPLOYEE NUMBER TOO BIG and INVALID'; @qo0d{E Jl  
0d :|f(6$  
SET disable_trigger = 'Y'; 使触发器失效 V^K,%  
nTBW+W  
[M-N~}2{  
简化用户权限检索: @*s+/Os  
5PKepLZd  
CREATE VARIABLE schema1.gv_workdept CHAR <k:\8  
^[J&w?*(O  
DEFAULT ((SELECT workdept FROM employee nXbM`R8  
RlwFG@m  
WHERE firstnme = SESSION_USER)); \=i6fwE-  
ZX@]^rm}_  
CREATE VIEW schema1.emp_filtered AS c%dyB  
=cksR(G  
SELECT * FROM employee (I O3#R|>  
)f262F[,  
WHERE workdept = schema1.gv_workdept; /&#JK  
vK_bV^<%l  
pk`vv]  
在存储过程,嵌入C,java程序中都可使用全局变量。 /J>xtdP*  
jc`Pk/B<  
g rI3H  
新的函数 o4f<\^I|q&  
 /:u/se:  
新的函数简化了应用程序移植,版本 9.5 包含一些与其他数据库供应商使用的标量函数同名的新标量函数。当您将现有应用程序移植到版本 9.5 中时,您可以继续使用其他供应商使用的函数名称,而无需更改代码。 <\e}OX+Ec  
;)zjBwi9  
提供了以下新的标量函数: D)^zfg  
,:!h ^ uQ  
• NVL(现有的 COALESCE 和 VALUE 函数的同义词) 9gVHBl^  
1/Jjh/2W  
• LEAST 或 MIN(互为同义词) @.)!m[R'  
2&6omc>^{  
• GREATEST 或 MAX(互为同义词)  Hb(~0  
cbv&7,}  
• DECODE(类似于现有的 CASE 表达式) xJjg']5  
5(N$DY%y^

来源:CCID
相关连接
最新评论
*以下网友发言不代表中程在线网站的观点和看法
    我要评论

    请您注意
    1、遵守中华人民共和国的各项有关法律规定
    2、承担一切因您的行为而导致的法律责任
    3、本网留言管理人员有权删除其管辖留言内容
    4、您在本网的留言本网有权在网站内转载和引用
    5、参与本留言即表明您已经阅读并接受上述条款
    我爱研发网中电华信阿里西西JAVA爱好者北京英才网全球大学查询网
    中国人的网站导航中国电脑论坛信息产业部新浪科技搜狐IT信息产业部电子教育与考试中心
    IT世界网软件项目交易网中国软件交易网国信培训网亚远景科技....[更多]
    关于我们 | 网站地图 | 周边住宿 | 行车路线 | 联系我们 | 网站律师 | 意见反馈 | 虚位以待 | 友情链接
    中程在线(北京)科技有限公司 版权所有
    总 部:北京市海淀区青东商务楼A座西四层
    企业培训部:010-52636110 52636106 就业培训部:010-68716925 68716926
    邮 件:training@miiceic.org.cn
    京ICP备06053134号
    Copyright © 2005-2008 Miiceic.org.cn All Rights Reserved