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

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

http://www.miiceic.org.cn   2008-6-17 9:24:39   中程在线   浏览数:
关键字:数据库 移植

 

版本9.5中改进的应用程序可移植性增加了与现有代码的兼容性,并且不再需要迁移使用其他供应商的数据库的应用程序。版本 9.5 包含以下增强功能: g`nc~#2   
meU I"aV  
• 支持在过程和调用过程的应用程序中使用 ARRAY 数据类型-h53F78  
pzjYk-(\}  
• 支持全局变量。全局变量是已命名的内存变量,您可以通过 SQL 语句访问和修改此变量。版本 9.5 支持已创建的会话全局变量,这些变量与特定会话相关联并包含该会话独有的值。 |=Qk0'/g4  
nSDH\zO?  
• 支持其他供应商的 SQL 方言。版本 9.5 包含对 DECODE、NVL、LEAST 和 GREATEST 函数的支持。 !q*(dXX  
o'k. 5e  
#b, X S  
数组数据>.<rk {%VI  
ts_v,k0  
a zv?nr: $  
在以前的DB2版本,碰到数据集合处理的程序移植,我们只能通过临时表或游标来处理,这是非常麻烦的。 c94V>z&,.G  
~X_[ B7Mq  
版本 9.5 支持 ARRAY 集合数据类型。您可以在存储过程和应用程序中对它们进行处理,此功能使从其他数据库供应商移植已支持数组的应用程序和存储过程更容易。 oi`_JzPj  
]6Aw&OJ  
您可以使用数组以在应用程序与存储过程之间更有效率地传递数据以及存储和处理 SQL 过程中的瞬态数据集合,而不必使用关系表。SQL 过程中可用的数组运算符允许更有效率地存储和检索数据。 |&fD[72RM  
n~z DK_  
zH]I]%EZm  
版本 9.5 中对数组数据类型的支持允许您执行以下操作: Jd8?U ^  
bCj7g3nBo'  
j /-`9 `  
• 根据数组创建用户定义的类型;例如,CREATE TYPE INT10 AS INTEGER ARRAY[10] 定义最多 10 个整数值的数组的类型; M !eIk3  
> G'34/>  
• 在存储过程和应用程序中声明数组类型的变量和参数; ) D8TWw(4  
Tf SCFe}  
• 创建和处理数组值,数组处理的基本部分包括数组构造方法、设置子下标、元素计数和整理; 5 &6Nd5q  
Jj=/G T  
• 在 JDBC 和 CLI 应用程序与 SQL 和 Java 存储过程之间来回传递数组; mx Zq  
/U,%Z^-yJ  
• 将数组转换为表(每个表行一个数组元素)以及将聚集列转换为数组,以便更容易在数组与 SQL 之间通过接口进行连接; ]>0GrQ_  
q NG [)  
• 使用输入和输出数组参数从命令行处理器调用过程。 =^+A].b  
_qa[vY  
tKYOM=  
ARRAY 数据类型定义: K[ Mp!$0'j  
z"xF{6P`  
CREATE TYPE type-name AS data-type ARRAY [integer-constant] X_Nzx_T$  
=03k HNZ"  
其中:data-type 不支持LONG VARCHAR, LONG VARGRAPHIC, LOB, XML类型, integer-constant 最大值2147483647 ec7 Gj?  
7L<qO S\X  
dwe%z  
与ARRAY相关的函数: @n, aaBp  
P;ny"Fbw  
ARRAY_AGG 将行数据集聚集成数组 S[7b{<tLF  
 `}^t_  
UNNEST 将数组数据转成行数据 4aC_kcy/  
B]NB>   
CARDINALITY 返回数组中的元素号,类型 BIGINT d nlRp`  
)rPg:=%}  
MAX_CARDINALITY 返回数组中所含的最大元素号,类型 BIGINT wDBvfA|1l  
P6}r~,K  
注意,这些函数只用于SQL procedure @aM '-,H  
mp$6EvSAr  
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) Wvek?8de  
&ky#&k  
WITH ORDINALITY AS T(PHONE, ID, INDEX) HJ$be'$  
'SD nyl=(  
ORDER BY T.INDEX $CNo=X  
8tW^]r)JD  
#U^Pu O  
Example 1 N}|`/)(  
:SN_ E  
这个例子包含2个存储过程, sum 和 main. 存储过程 main 建立一个含有6个元素(integer)的数组。传递这个数组给存储过程sum, 计算出所有元素值的和并返回给调用存储过程 main. 存储过程 sum 说明了array subindexing 和CARDINALITY 函数的用法. Q :4tW~*.  
z?+tH i @W  
create type intArray as integer array[100] @ Pj%6_p4  
FVD\)T  
cTN0r  
create procedure sum(in numList intArray, out total integer) Ai-FI$@?)  
MFUzFS|,  
begin k6"UB&M  
[)1 QAAV$  
declare i, n integer; !"AT @"3S  
e.NRp V  
set n = CARDINALITY(numList); GCK;9  
 m+  
set i = 1; %#4f mv2  
0-~ _t W  
set total = 0; K 2KIfy  
W7EbZ7{J  
while (i < n) do 3?o@m8e  
d W_] @  
set total = total + numList; 1{OS8P?s2  
Qc-U;,#5  
set i = i + 1; V(?tVg <|  
OJL %D  
end while; . bhB8  
4NG6zWX  
end @ C^ b\G%_Z  
^y7E+9r!  
s!bbFKT=  
create procedure main(out total integer) +RP;F|%Y  
bA @]Vp  
begin ;\q.:!nx  
WixD>C  
declare numList intArray; OJV>M^}  
&0vQ W,  
set numList = ARRAY[1,2,3,4,5,6]; y&jOp  
mqi,_+$p  
call sum(numList, total); \s bP|7  
\A/I7Zp^B|  
end @ mE$N|3Km}Y  
UQqn^2  
(>Qk Z/?  
Example 2 5j9Lr1 K  
d@V;XC  
这个例子,我们使用2个数组类型(intArray 和 stringArray),使用一个包含列(id 和 name)的 persons 表。 存储过程 processPersons 添加3个人到 persons表, 并返回person名字的数组,按id排序,名字中包含字母 'o'。 3个persons 的 id 和 name 作为数组元素(ids 和 names)添加到数组中。这些数组使用UNNEST 函数,将数组数据以包含2列数据的表的表达形式表达,并插入到persons 表中。最后使用ARRAY_AGG函数将数据汇集返回给输出参数。 8]NEhlf  
zoS_ $Sl`  
create type intArray as integer array[100] @ 6K1N>}  
&dpY3?+U  
create type stringArray as varchar(10) array[100] @ /M93(aE  
k>)a9i  
~ 7rDUc  
create table persons (id integer, name varchar(10)) @ ;@$F[l!L  
$\osTJe  
insert into persons values(2, 'Tom') @ a[7F1j C  
N[&a)t1X  
insert into persons values(4, 'Jill') @ lM$7TvRC  
+a 1#.0Rm  
insert into persons values(1, 'Joe') @ 5@`2}0  
^@Jc:f  
insert into persons values(3, 'Mary') @ 0'D oWwFr  
H+QL!c j  
VwPhsfNr  
create procedure processPersons(out witho stringArray) -Ns4 (k}  
kjz*<S`l  
begin {"3[NG<}  
V0lQj`[Jn  
declare ids intArray; -Rj31#  
nZmf%=3W  
declare names stringArray; q>>*ZY  
0yET;hL2E  
set ids = ARRAY[5,6,7]; b+$-Fu*[  
ZG+g~V Ii  
set names = ARRAY['Bob', 'Ann', 'Sue']; yuU;l  
sa,u|X :7  
insert into persons(id, name) (select T.i, T.n from UNNEST(ids, names) as T(i, n)); ng-?XY2E=:  
|e_]S/ H  
set witho = (select array_agg(name order by id) 8K9]P"-'  
dHuE;Z58>  
from persons V>UP~jx\m  
w!4$o(  
where name like '%o%'); s2_X t   
|cS#lum(X  
end @ wcTye  
vKlIh_el  
eLhch8nDS  
Example 3 x-)GWep.8  
a}/E.=\  
这个例子说明在java代码中如何调用含有数组参数的存储过程,本例子中存储过程bonus_calculate含有2个输入参数,一个是数组projs,一个是整形percentage Eb- OdZEa  
A'u!@Oaw]&  
……… ]4f^#01J  
K~+~i$dtab  
String sql = "CALL bonus_calculate(?, ?)"; A]?94`s_  
K<F31[  
CallableStatement callStmt = con.prepareCall(sql); R@Z%1.  
F42k068)  
// Create an SQL Array LoY} YGN  
{zVdgo  
projects[0] = "AD3111"; \bF`Xd&&,  
O4 .(>"  
projects[1] = "IF1000"; ~]6TD]  
}CJr'CU  
projects[2] = "MA2111"; zwc5B $  
z++{k!wf  
java.sql.Array projectArray=con.createArrayOf("VARCHAR",projects); 9bq} !-Y  
kYyp{  
// set IN parameters 6la&/WZU  
};24]T  
callStmt.setArray(1, projectArray); n<;z^  
TgN{>K`yr  
callStmt.setInt(2,percentage); cSe_AMq0  
fF xtJ2  
// call the procedure G_IR)tM1  
}kY_E9K  
callStmt.execute(); GGf>z"Pu?:  
i{ *p.  
………… #( * n^_8  
Fo-:_>MO  
G4m /$I  
CREATE PROCEDURE bonus_calculate (IN projs projects, IN percentage integer) JCUgVEBlzB  
k72 ysQ  
BEGIN ]gz9>)0  
Bmw2,(MZ  
DECLARE emp_array employees; .(k ;~A6  
MzBTdm}  
DECLARE bonus_array bonus; nY8[bd %  
80yx6QD%  
SELECT cast(array_agg(employee.empno) AS employees), fjXH4 Vf  
V{aGEc T=  
cast(array_agg(.10*salary) AS bonus) INTO emp_array,bonus_array P0\8J~-(  
x@g$R4N2  
FROM vempprojact, unnest(projs) AS P(id), employee dR>\j_xX  
f0tO]<JW$/  
WHERE P.id=vempprojact.projno AND employee.empno=vempprojact.empno; ZdXvI  
f3 FD-8h>  
INSERT INTO bonus_temp L9;)xk,a<  
U(`.v=\ww  
SELECT T.empno, T.bonus yp5=@  
mG4/6!J !  
FROM unnest(emp_array, bonus_array) 9r[xZpSX  
E =T4gz  
WITH ORDINALITY AS T(empno,bonus, idx); BiP g,><  
5zmu)9]\R  
END@ 5d}aKc@ r  
RCC'F!ie0  
6 ?{h&?56  
全局变量 zZ@4o@aS]  
)Qr3/[}  
在以前的DB2版本,碰到含全局变量处理的移植程序移植,我们只能通过全局临时表来处理,使用起来非常麻烦。 /$g):[  
36?k.*X  
UyZQreDJ0P  
全局变量改进了 SQL 语句之间的数据共享。版本 9.5 引入了全局变量的概念,它们是命名的内存变量,可以通过 SQL 语句访问和修改这些变量。全局变量使您能够在运行于同一会话(或连接)的不同 SQL 语句之间共享数据,而不需要应用程序逻辑来支持此数据传输。 pZ\0  
Jks'~g{xJ>  
c[^!Zrl  
应用程序不再需要发出这种语句来将值从一个语句的输出自变量(如主机变量)复制到另一个语句的输入自变量。此外,包含在数据库系统本身中的 SQL 语句(如定义触发器和视图的语句)现在可以访问此共享信息。 &:c:!0Y  
M$U?{yO  
| na:JABCV  
全局变量有助于您为数据库本身中的数据传输实现更复杂的交互式模型,以便您不必在应用程序或 SQL 过程中放置支持逻辑。与全局变量相关联的已定义特权确保所传送数据的安全性不会升高到强制通过应用程序逻辑。如果安全性存在问题,那么您可以通过 GRANT 和 REVOKE 语句来控制对全局变量的访问。 Z4[L98oX9  
a3WYv9 LI  
A _F  
存储静态的、在会话期间很少更改的或者进行了管理控制的数据时,全局变量特别有用。用于将警报发送至 DBA 的寻呼机号以及指示是启用还是禁用某些触发器的指示器就是这种数据的示例。 "-UIIL+N[  
5vz}@+s3  
,h9RpSuwJ  
版本 9.5 支持已创建的会话全局变量。会话全局变量与特定会话相关联并包含该会话独有的值。已创建的会话全局变量可用于任何正在您定义该变量的数据库上运行的活动 SQL 语句。系统目录包含已创建的会话全局变量的定义以及与这些全局变量相关联的特权。 2Bf %hEV  
j~#HO~*  
# S!rzb  
例子: cJ<Y+ rs  
gAEymv&  
创建全局变量: dr/=d;GW  
dJj PD399  
CREATE VARIABLE myjob_current varchar (10) DEFAULT ('soft-engg'); [d$L0j  
?V +e>H_  
#V,<8^-z  
获取全局变量信息: 08,[r }  
\tojm;lx$  
SELECT substr (varschema, 1, 10) as varschema, W:%RO_ y  
hqG|X&{ >  
substr (varname, 1, 10) AS varname, #KY~@  
FS1j~H{  
varid, substr(owner,1,10) AS owner, N 'G6{DF  
^2}&bDul  
ownertype, create_time, i$< t  
,k%%:0Ix  
substr(typeschema,1,10) AS typeschema, whf.*(_Sx  
6l-w   
substr(typename,1,10) AS typename, length KB[Vy VvJ  
4 QLW\u  
FROM syscat.variables zKW,f\i'f  
jR/TvU]\uL  
WHERE varname = 'MYJOB_CURRENT'; 7OEJAouB\  
Y:Je7N  
SoFSPO,+E  
给用户praveen 和 sanjay 读和写权限,剥夺用户sanjay写权限: A@l_g\  
Ki=l$^2SX  
GRANT READ, WRITE ON VARIABLE myjob_current TO USER praveen, USER sanjay; Ga5 /<  
V #a +EbT  
REVOKE WRITE ON VARIABLE myjob_current FROM USER sanjay; 7r1c  
x:t[ P-)  
ZSd">$j  
获取用户 praveen 和 sanjay 的全局变量权限信息: I'Gs,X$ B  
TL+4\#x  
SELECT substr (varschema, 1, 10) AS schema, {].RbIg4F  
G rP;GJ  
substr (varname, 1, 10) AS name, r8z ygJ:  
ES*P%{/a  
substr(grantor,1,10) AS grantor, grantortype AS Rtype, 8@ d=0k0  
B`]kRBi  
substr(grantee,1,10) AS grantee, granteetype AS Etype, !snK  
J6PDsy  
readauth, writeauth hd 1Bsl  
O_LVfsj#  
FROM syscat.variableauth '^i<V3B 1  
`;MOADGRS  
WHERE varname ='MYJOB_CURRENT'; ] zMt-3d3I  
r([6E}%K  
] -~nZv  
7G,pV  
q0dCA(fE  
在触发器中使用全局变量,本例是设计一个disable触发器示例: T1^;yL<r  
\=Z*pHT  
CREATE VARIABLE disable_trigger char (1) DEFAULT ('N'); B&2Nb}b^  
-h(&\pHFd  
CREATE TRIGGER validate_t BEFORE INSERT ON EMPLOYEE w2#h.c  
g4s52`X  
REFERENCING NEW AS n FOR EACH ROW %~$t@"RN  
_&) ]q  
WHEN (disable_trigger = 'N' AND n.empno > '10000') 7 kk P(  
po%wHLjw]  
SIGNAL SQLSTATE '38000' _ Hlxt  
`51H:t  
SET message_text = 'EMPLOYEE NUMBER TOO BIG and INVALID'; ol(m|O*=  
jFn>`Rb  
SET disable_trigger = 'Y'; 使触发器失效 ZoT&  
|6:~o"/  
'0ut ^h  
简化用户权限检索: ##+4mJI?w  
dn{n6*F  
CREATE VARIABLE schema1.gv_workdept CHAR W>C]!)p  
pBmwHQrX=  
DEFAULT ((SELECT workdept FROM employee /!e@neI  
M< YzX  
WHERE firstnme = SESSION_USER)); yWPND*-g  
gOFK( !U@  
CREATE VIEW schema1.emp_filtered AS  9$iQFKX[  
U1oRf"my  
SELECT * FROM employee -n+`dP+|p  
rAq ;SsZ\  
WHERE workdept = schema1.gv_workdept; ! lC3  
0-|fs  
.b_u"bj7  
在存储过程,嵌入C,java程序中都可使用全局变量。 CRs#fFx-  
5wOU-7  
k#Qb| @2  
新的函数 E3!6l,YB  
a+PMN7  
新的函数简化了应用程序移植,版本 9.5 包含一些与其他数据库供应商使用的标量函数同名的新标量函数。当您将现有应用程序移植到版本 9.5 中时,您可以继续使用其他供应商使用的函数名称,而无需更改代码。 )L[0Psd|  
u QUw7!\_[  
提供了以下新的标量函数: D[RWc>w  
l?VA.y  
• NVL(现有的 COALESCE 和 VALUE 函数的同义词) aKnHm Hj  
EVsM   
• LEAST 或 MIN(互为同义词) ;FBsQb  
>[DIl  
• GREATEST 或 MAX(互为同义词) ~DSh_BDgg  
JO~?`e@%S  
• DECODE(类似于现有的 CASE 表达式) |F?!JLq  
Lu=KW}|`~

来源: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