赛迪网 > IT技术 数据库 > DB2开发者园地
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

DB2 V9.5版本中数据库应用程序移植的改进 (1)

发布时间:2008.06.04 07:45     来源:赛迪网    作者:Alizze

【赛迪网-IT技术报道】版本9.5中改进的应用程序可移植性增加了与现有代码的兼容性,并且不再需要迁移使用其他供应商的数据库的应用程序。版本 9.5 包含以下增强功能:

• 支持在过程和调用过程的应用程序中使用 ARRAY 数据类型。

• 支持全局变量。全局变量是已命名的内存变量,您可以通过 SQL 语句访问和修改此变量。版本 9.5 支持已创建的会话全局变量,这些变量与特定会话相关联并包含该会话独有的值。

• 支持其他供应商的 SQL 方言。版本 9.5 包含对 DECODE、NVL、LEAST 和 GREATEST 函数的支持。

数组数据类型

在以前的DB2版本,碰到数据集合处理的程序移植,我们只能通过临时表或游标来处理,这是非常麻烦的。

版本 9.5 支持 ARRAY 集合数据类型。您可以在存储过程和应用程序中对它们进行处理,此功能使从其他数据库供应商移植已支持数组的应用程序和存储过程更容易。

您可以使用数组以在应用程序与存储过程之间更有效率地传递数据以及存储和处理 SQL 过程中的瞬态数据集合,而不必使用关系表。SQL 过程中可用的数组运算符允许更有效率地存储和检索数据。

版本 9.5 中对数组数据类型的支持允许您执行以下操作:

• 根据数组创建用户定义的类型;例如,CREATE TYPE INT10 AS INTEGER ARRAY[10] 定义最多 10 个整数值的数组的类型;

• 在存储过程和应用程序中声明数组类型的变量和参数;

• 创建和处理数组值,数组处理的基本部分包括数组构造方法、设置子下标、元素计数和整理;

• 在 JDBC 和 CLI 应用程序与 SQL 和 Java 存储过程之间来回传递数组;

• 将数组转换为表(每个表行一个数组元素)以及将聚集列转换为数组,以便更容易在数组与 SQL 之间通过接口进行连接;

• 使用输入和输出数组参数从命令行处理器调用过程。

ARRAY 数据类型定义:

CREATE TYPE type-name AS data-type ARRAY [integer-constant]

其中:data-type 不支持LONG VARCHAR, LONG VARGRAPHIC, LOB, XML类型, integer-constant 最大值2147483647

与ARRAY相关的函数:

ARRAY_AGG 将行数据集聚集成数组

UNNEST 将数组数据转成行数据

CARDINALITY 返回数组中的元素号,类型 BIGINT

MAX_CARDINALITY 返回数组中所含的最大元素号,类型 BIGINT

注意,这些函数只用于SQL procedure

SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS)

WITH ORDINALITY AS T(PHONE, ID, INDEX)

ORDER BY T.INDEX

Example 1

这个例子包含2个存储过程, sum 和 main. 存储过程 main 建立一个含有6个元素(integer)的数组。传递这个数组给存储过程sum, 计算出所有元素值的和并返回给调用存储过程 main. 存储过程 sum 说明了array subindexing 和CARDINALITY 函数的用法.

create type intArray as integer array[100] @

create procedure sum(in numList intArray, out total integer)

begin

declare i, n integer;

set n = CARDINALITY(numList);

set i = 1;

set total = 0;

while (i < n) do

set total = total + numList[i];

set i = i + 1;

end while;

end @

create procedure main(out total integer)

begin

declare numList intArray;

set numList = ARRAY[1,2,3,4,5,6];

call sum(numList, total);

end @

Example 2

这个例子,我们使用2个数组类型(intArray 和 stringArray),使用一个包含列(id 和 name)的 persons 表。 存储过程 processPersons 添加3个人到 persons表, 并返回person名字的数组,按id排序,名字中包含字母 'o'。 3个persons 的 id 和 name 作为数组元素(ids 和 names)添加到数组中。这些数组使用UNNEST 函数,将数组数据以包含2列数据的表的表达形式表达,并插入到persons 表中。最后使用ARRAY_AGG函数将数据汇集返回给输出参数。

create type intArray as integer array[100] @

create type stringArray as varchar(10) array[100] @

create table persons (id integer, name varchar(10)) @

insert into persons values(2, 'Tom') @

insert into persons values(4, 'Jill') @

insert into persons values(1, 'Joe') @

insert into persons values(3, 'Mary') @

create procedure processPersons(out witho stringArray)

begin

declare ids intArray;

declare names stringArray;

set ids = ARRAY[5,6,7];

set names = ARRAY['Bob', 'Ann', 'Sue'];

insert into persons(id, name) (select T.i, T.n from UNNEST(ids, names) as T(i, n));

set witho = (select array_agg(name order by id)

from persons

where name like '%o%');

end @

1 2 3 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 电子商务盈利新招:垂直化渠道管理新趋势
· 互联网加速蜕变 运营商进军搅动市场格局
· 08 IT技术风起云涌 专访 ITIL落地难在哪
· 视频加密保护解决方案 文档安全解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统