VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

数组支持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)