版本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^

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

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

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