版本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}|`~

一沙一世界 一花一天堂 掌中握無……

网络编程技术、多媒体技术、PC应用技术

| 我爱研发网 | 中电华信 | 阿里西西 | JAVA爱好者 | 北京英才网 | 全球大学查询网 |
| 中国人的网站导航 | 中国电脑论坛 | 信息产业部 | 新浪科技 | 搜狐IT | 信息产业部电子教育与考试中心 |
| IT世界网 | 软件项目交易网 | 中国软件交易网 | 国信培训网 | 亚远景科技 | ....[更多] |