暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES --KES支持RECORD类型

数据猿 2023-11-24
581


关键字:

RECORD;人大金仓;KingbaseES

RECORD类型

  1. 概述

为了定义记录类型,需要指定名称和定义字段。需指定字段名和字段类型来定义字段。字段默认值为 NULL。可以给字段加 NOT NULL 约束,这种情况下必须指定一个非 NULL 的初始值。如果没有 NOT NULL 约束,这个非 NULL 初始值可选。

语法:TYPE 类型名称 IS RECORD (

成员名称 数据类型[[NOT NULL][:=默认值]表达式],

成员名称 数据类型[[NOT NULL][:=默认值]表达式]);

  1. record类型的变量声明
  2. 声明record常量

\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;

/

  1. 使用%ROWTYPE 和%TYPE 声明的 record 变量。

\set SQLTERM /

DECLARE

TYPE emp_rec is record(

id emp.id%TYPE,

first_name emp.first_name%TYPE,

last_name emp.last_name%TYPE,

email emp.email%TYPE);

emp emp_rec;

begin

END;

/

(3)record类型的赋值方式

  1. 使用:=进行赋值

\set SQLTERM /

DECLARE

TYPE emp_rec is record(

id emp.id%TYPE,

first_name emp.first_name%TYPE);

emp emp_rec;

begin

emp.id:='2';

raise notice 'id:%',emp.id;

END;

/

  1. 使用限定表达式赋值

(i)按照名称赋值

set serveroutput on

\set SQLTERM /

DECLARE

TYPE rec1 IS RECORD(c1 int,c2 varchar(50));

v1 rec1 :=rec1(c1=>1,c2=>'a');

BEGIN

DBMS_OUTPUT.PUT_LINE(v1.c2);

END;

/

(ii)按照位置赋值

\set SQLTERM /

DECLARE

TYPE rec1 IS RECORD(c1 int,c2 varchar(50));

v1 rec1 :=rec1(1,'a');

BEGIN

DBMS_OUTPUT.PUT_LINE(v1.c2);

END;

/

自定义RECORD的使用

(1)使用RECORD类型接收查询返回结果

create table emp(

id int,

first_name varchar,

last_name varchar,

email varchar);

/

\set SQLTERM /

DECLARE

TYPE emp_rec is record(

id emp.id%TYPE,

first_name emp.first_name%TYPE,

last_name emp.last_name%TYPE,

email emp.email%TYPE);

emp emp_rec;

begin

select id,first_name,last_name,email from emp where id =1;

DBMS_OUTPUT.PUT_LINE('id:'||emp.id);

DBMS_OUTPUT.PUT_LINE('first_name:'||emp.first_name);

exception

when NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('NOEXISTS');

END;

/

(2)自定义RECORD类型,声明变量,并为属性赋值

\set SQLTERM /

DECLARE

TYPE emp_rec is record(

id emp.id%TYPE,

first_name emp.first_name%TYPE,

last_name emp.last_name%TYPE,

email emp.email%TYPE);

emp emp_rec;

begin

emp.id:='2';

emp.first_name:='qw';

emp.last_name:='re';

emp.email:='qw@we.com';

DBMS_OUTPUT.PUT_LINE('id:'||emp.id);

DBMS_OUTPUT.PUT_LINE('first_name:'||emp.first_name);

DBMS_OUTPUT.PUT_LINE('last_name:'||emp.last_name );

DBMS_OUTPUT.PUT_LINE('email:'||emp.email);

exception

when NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('NOEXISTS');

END;

/

(3)定义嵌套的RECORD类型

drop table if exists student;

create table student(id int PRIMARY KEY, name text, score number);

insert into student values (1, 'xx', 99);

\set SQLTERM /

DECLARE

TYPE stu_info_rec IS RECORD (

id student.id%TYPE,

name student.name%TYPE

);

TYPE stu_rec IS RECORD (

stu_info stu_info_rec, -- nested record

score student.score%TYPE

);

student1 stu_rec;

BEGIN

student1.stu_info.id := 1;

student1.stu_info.name := 'xx';

student1.score := 88;

RAISE NOTICE '%, %, %', student1.stu_info.id, student1.stu_info.name,student1.score;

END;

/

(4)插入记录,利用RECORD类型保存数据

DROP TABLE IF EXISTS schedule;

CREATE TABLE schedule (

week NUMBER,

Mon VARCHAR2(10),

Tue VARCHAR2(10),

Wed VARCHAR2(10),

Thu VARCHAR2(10),

Fri VARCHAR2(10),

Sat VARCHAR2(10),

Sun VARCHAR2(10)

);

\set SQLTERM /

DECLARE

default_week schedule%ROWTYPE;

BEGIN

default_week.Mon := '0900-1800';

default_week.Tue := '0900-1800';

default_week.Wed := '0900-1800';

default_week.Thu := '0900-1800';

default_week.Fri := '0900-1800';

default_week.Sat := 'Day Off';

default_week.Sun := 'Day Off';

FOR i IN 1..4 LOOP

default_week.week := i;

INSERT INTO schedule VALUES default_week;

END LOOP;

END;

/

\set SQLTERM ;

SELECT * FROM schedule;

(5)修改数据,利用记录类型保存数据

\set SQLTERM /

DECLARE

default_week schedule%ROWTYPE;

BEGIN

default_week.Mon := 'Day Off';

default_week.Tue := 'Day Off';

default_week.Wed := '0800-1700';

default_week.Thu := '0800-1700';

default_week.Fri := '0800-1700';

default_week.Sat := '0800-1700';

default_week.Sun := '0800-1700';

FOR i IN 1..2 LOOP

default_week.week := i;

UPDATE schedule

SET ROW = default_week

WHERE week = i;

END LOOP;

END;

/

\set SQLTERM ;

SELECT * FROM schedule order by week;

自定义RECORD在集合类型中的使用

  1. record类型嵌套可变数组类型

\set SQLTERM /

DECLARE

TYPE stu_info_rec IS VARRAY(2) OF VARCHAR2(20);

TYPE stu_rec IS RECORD (

stu_info stu_info_rec := stu_info_rec('1', 'xx'), -- varray field

score student.score%TYPE

);

student1 stu_rec;

BEGIN

student1.score := 88;

RAISE NOTICE '%, %, %', student1.stu_info(1), student1.stu_info(2),student1.score;

END;

/

  1. record类型嵌套关联数组类型

\set SQLTERM /

CREATE OR REPLACE PROCEDURE pr1 IS

TYPE ass_type IS TABLE OF varchar INDEX BY varchar;

TYPE rec IS RECORD(r1 ass_type,r2 varchar);

v1 rec;

BEGIN

v1.r1('key1') :='key1';

v1.r1('key2') :='key2';

v1.r2 :='test';

INSERT INTO t1 VALUES(1,v1.r1('key1'));

INSERT INTO t1 VALUES(2,v1.r1('key2'));

INSERT INTO t1 VALUES(3,v1.r2);

END;

/

\set SQLTERM ;

CALL pr1();

SELECT * FROM t1;

  1. record类型嵌套嵌套表类型

\set SQLTERM /

DECLARE

TYPE stu_info_rec IS TABLE OF VARCHAR2(20);

TYPE stu_rec IS RECORD (

stu_info stu_info_rec := stu_info_rec('1', 'xx'), -- varray field

score student.score%TYPE

);

student1 stu_rec;

BEGIN

student1.score := 88;

RAISE NOTICE '%, %, %', student1.stu_info(1), student1.stu_info(2),student1.score;

END;

/

参考资料

《KingbaseES_PLSQL过程语言手册》

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论