【赛迪网-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
下一页>>