金仓数据库KingbaseES RECORD记录类型介绍
关键字:
KingbaseES、record、人大金仓
记录类型的创建
1.1 record类型变量的创建方式
定义RECORD类型,然后声明此类型变量。
通过%ROWTYPE来声明一个记录类型变量,该变量可以表示数据库表或视图的完整行或部分行。
通过%TYPE声明一个与之前已经声明过得记录类型相同的记录类型的变量。
- 记录类型变量的初始化值
对于RECORD类型的 record 变量,每个字段的初始化值为NULL,除非在定义类型时制定了不同的初始化值。
对于%ROWTYPE和%TYPE声明的 record 变量,每个字段的初始值也是NULL。该 record 变量不会继承引用项的初始化值。
- 声明 record 常量
初始化record常量r。
\set SQLTERM /
DECLARE
TYPE Rec IS RECORD (a NUMBER, b NUMBER);
r Rec := (0,1);
BEGIN
raise notice 'r = %',r;
raise notice 'r.a = %',r.a;
raise notice 'r.b = %',r.b;
END;
/
结果:
使用RECORD关键字声明RECORD类型变量
如下示例中定义了名为StuRecTyp的记录类型,为每个字段指定了初始值。最后声明了名为stu_rec的记录类型变量。
\set SQLTERM /
DECLARE
TYPE StuRecTyp IS RECORD (
stu_id NUMBER(4) NOT NULL := 1,
stu_name VARCHAR2(30) NOT NULL := 'xm',
score NUMBER(5,2) = 88.88
);
stu_rec StuRecTyp;
BEGIN
RAISE NOTICE 'stu_id = %', stu_rec.stu_id;
RAISE NOTICE 'stu_name = %', stu_rec.stu_name;
RAISE NOTICE 'score = %', stu_rec.score;
END;
/
结果:
声明record变量的注意事项:
- 在PL/SQL块中定义的RECORD类型是本地类型,仅在块中有效。
- 在包规范中定义的RECORD类型是公共项。可以通过包名限定的方式(package_name.type_name)在包外引用。它会一直存储在数据库中,直到通过DROP PACKAGE语句删除包。
- 不能在模式级创建RECORD类型,因此,RECORD类型不可以作为ADT属性数据类型。
- 为了定义记录类型,需要指定名称和定义字段。需指定字段名和字段类型来定义字段。字段默认值为NULL。可以给字段加NOT NULL约束,这种情况下必须指定一个非NULL的初始值。如果没有NOT NULL约束,这个非NULL初始值可选。
使用%ROWTYPE属性声明RECORD类型变量
%ROWTYPE属性可以声明一个 record 变量,用于表示数据库表或视图的完整行或部分行。
- 要声明代表数据库表或视图的整行的 record 变量
语法:
variable_name table_or_view_name%ROWTYPE;
使用该语法定义后对于表或者视图的每一列,record变量都有一个具有相同名称和数据类型的字段。
示例:
\set SQLTERM /
DECLARE
stu_rec student%ROWTYPE; --(student为已经存在的表)
BEGIN
stu_rec.id := 1;
stu_rec.name := 'xx';
stu_rec.score := '99';
RAISE NOTICE 'stu_rec.id = %, stu_rec.name = %, stu_rec.score = %',
stu_rec.id, stu_rec.name, stu_rec.score;
END;
/
注意:
只会继承表的列属性,包括字段名和数据类型,不会继承表内的值和约束条件。
- 声明表示部分行的 record 变量
语法:
variable_name cursor%ROWTYPE;
该语法中的游标与表查询关联,对于查询选择的每一列,record 变量都会有相对应的类型兼容的字段。
注意:这里的游标必须是显示游标或强游标变量。
示例:
\set SQLTERM /
DECLARE
CURSOR c IS
SELECT id, name, score FROM student;
stu c%ROWTYPE;
BEGIN
stu.id := 1;
stu.name := 'xx';
stu.score := 88;
RAISE NOTICE 'stu.id = %, stu.name = %, stu.score = %',
stu.id, stu.name, stu.score;
END;
/
结果:
以上示例中显示游标c查询了student表的id,name,score三列,所以使用该游标声明的record变量只有这三列。
- 将两个表列连接声明两个表连接行的 record 变量
CREATE TABLE stu_info (id int, name text);
CREATE TABLE stu_grade (id int, score number);
insert into stu_info values (1, 'xx');
insert into stu_grade values (1, 88);
\set SQLTERM /
DECLARE
CURSOR c2 IS
SELECT stu_info.id, name, score
FROM stu_info , stu_grade
WHERE stu_info.id = stu_grade.id;
join_rec c2%ROWTYPE; -- 包括两个表的列
BEGIN
NULL;
raise notice '%',join_rec;
END;
/
record 变量赋值
给record变量赋值,包括给record变量的每个字段指定一个值和将一个 record 变量的值赋给另一个 record 变量。如果 record 变量表示数据库表或视图的完整行或部分行,则可以将这些行赋值给 record 变量。
- 一个record变量赋值给另外一个record变量的条件
- 两个 record 变量有相同的RECORD类型。
- 目标变量用RECORD类型声明,源变量用%ROWTYPE声明,他们的字段在数量和顺序上都匹配且相应的字段具有相同的数据类型。
示例:
\set SQLTERM /
DECLARE
TYPE stu_rec IS RECORD (
id student.id%TYPE DEFAULT 1,
name student.name%TYPE DEFAULT 'xx'
);
stu1 stu_rec;
stu2 stu_rec;
BEGIN
stu1.id := 1;
stu1.name := 'xx';
RAISE NOTICE 'stu1 = %', stu1;
stu2 := stu1; -- 这个位置即为赋值语句
RAISE NOTICE 'stu2 = %', stu2;
END;
/
- %ROWTYPE 给RECORD类型的 record 变量赋值
目标变量用RECORD类型声明,源变量用%ROWTYPE声明
\set SQLTERM /
DECLARE
TYPE stu_rec IS RECORD (
id student.id%TYPE DEFAULT 1, --使用的是student表的id列
name student.name%TYPE DEFAULT 'xx' --使用的是student表的name列
);
CURSOR c IS
SELECT id, name -- 游标也是选中的student表的id和name列
FROM student;
rec_val stu_rec;
rowtype_val c%ROWTYPE;
BEGIN
rec_val.id := 1;
rec_val.name := 'xx';
RAISE NOTICE 'rec_val = %', rec_val;
rowtype_val := rec_val;
RAISE NOTICE 'rowtype_val = %', rowtype_val;
END;
/
结果:
- 使用SELECT INTO将一行赋值给 record 变量
语法:
SELECT select_list INTO record_variable_name FROM table_or_view_name;
示例:示例中将student表中score为99的行中的id和name列赋值给record类型的变量rec1的相应字段。
\set SQLTERM /
DECLARE
TYPE RecordTyp IS RECORD (
id student.id%TYPE,
name student.name%TYPE
);
rec1 RecordTyp;
BEGIN
SELECT id, name INTO rec1
FROM student
WHERE score = 99;
RAISE NOTICE 'rec1.id = %, rec1.name = %',rec1.id ,rec1.name;
END;
/
结果:




