数组支持RECORD类型
功能描述
该功能允许在PL/SQL程序中定义RECORD类型数组。
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
数据库兼容模式为Oracle时,支持通过SELECT/FETCH INTO向RECORD数组或复合类型数组赋值:
查询结果的列数量必须与RECORD数组或复合类型数组的字段数量相匹配。如果不匹配,将会抛出异常。
被赋值的RECORD数组或复合类型数组的字段类型和查询结果的列类型必须兼容,类型不匹配可能会导致值失败或数据截断。
语法格式
TYPE array_type IS VARRAY(size) OF data_type;
参数说明
array_type
要定义的数组类型名。
VARRAY
表示要定义的数组类型。
size
取值为正整数,表示可以容纳的成员的最大数量,最大值为2147483647。
data_type
要创建的数组中成员的类型,现在支持record类型。
示例
示例1: 在程序块中定义数组类型。
declare
TYPE sum_type IS RECORD
(
sum_id varchar2(20),
sum_sum number
);
sum_rec sum_type;
TYPE sum_type_array IS VARRAY(2) of sum_type;
sum_rec_array sum_type_array;
begin
sum_rec.sum_id :='GLG001_CBB_DAY';
sum_rec.sum_sum := 1;
sum_rec_array[1] := sum_rec;
sum_rec.sum_id :='GLG001_CBC_SUM';
sum_rec.sum_sum := 2;
sum_rec_array[2] := sum_rec;
sum_rec := sum_rec_array[1];
raise notice 'sum_rec_array[1]:% %', sum_rec.sum_id, sum_rec.sum_sum;
sum_rec := sum_rec_array[2];
raise notice 'sum_rec_array[2]:% %', sum_rec.sum_id, sum_rec.sum_sum;
end;
/
返回结果为:
NOTICE: sum_rec_array[1]:GLG001_CBB_DAY 1
NOTICE: sum_rec_array[2]:GLG001_CBC_SUM 2
ANONYMOUS BLOCK EXECUTE
示例2: 在存储过程中使用select插入数据到record数组。
1、打开SERVEROUTPUT参数(使信息从存储过程传输回应用程序,输出在屏幕上)。
SET SERVEROUTPUT ON;
2、创建record类型和数组。
CREATE OR REPLACE PACKAGE pkg AS
TYPE rec IS RECORD (
id INT,
name VARCHAR2(10),
age INT
);
TYPE recl IS TABLE OF rec INDEX BY BINARY_INTEGER;
END pkg;
/
3、创建存储过程并通过select插入数据到record数组。
CREATE OR REPLACE PROCEDURE insert_and_output AS
var_rec pkg.rec;
var_recl pkg.recl;
BEGIN
-- 插入数据到record变量
SELECT 1, 'John', 25 INTO var_rec FROM dual;
-- 将record变量插入到record数组中
SELECT var_rec INTO var_recl(1) FROM dual;
-- 输出record数组中的数据
FOR i IN var_recl.FIRST..var_recl.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || var_recl(i).id || ', Name: ' || var_recl(i).name || ', Age: ' || var_recl(i).age);
END LOOP;
END;
/
4、调用存储过程查看结果。
call insert_and_output();
返回结果为:
ID: 1, Name: John, Age: 25
insert_and_output
-------------------
(1 row)
示例3: 在存储过程中使用fetch插入数据到复合类型数组。
1、打开SERVEROUTPUT参数(使信息从存储过程传输回应用程序,输出在屏幕上)。
SET SERVEROUTPUT ON;
2、创建复合类型和数组。
create TYPE comp as (
id INT,
name VARCHAR2(10),
age INT
);
create TYPE comps IS varray(10) OF comp;
3、创建存储过程并通过fetch插入数据到复合类型数组。
CREATE OR REPLACE PROCEDURE insert_and_output AS
DECLARE
var_rec comp;
var_recl comps;
CURSOR c IS SELECT 4, 'EVEN', 28 FROM dual;
BEGIN
-- 打开游标
OPEN c;
FETCH c INTO var_recl(1) ;
-- 输出数组中的数据
FOR i IN var_recl.FIRST..var_recl.LAST LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || var_recl(i).id || ', Name: ' || var_recl(i).name || ', Age: ' || var_recl(i).age);
END LOOP;
-- 关闭游标
CLOSE c;
END;
/
4、调用存储过程查看结果。
call insert_and_output();
返回结果为:
ID: 4, Name: EVEN, Age: 28
insert_and_output
-------------------
(1 row)