VastbaseG100

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

Menu

%ROWTYPE声明变量

功能描述

Vastbase在Oracle兼容模式下支持%ROWTYPE特性,可以允许用户声明数据库中表或视图的完整或部分行的记录。

对于整行或部分行的每个可见列,记录都有一个具有相同名称和数据类型的字段。如果行的结构发生更改,则记录的结构也会相应更改。使不可见列可见会更改使用该%ROWTYPE属性声明的某些记录的结构。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时支持(即数据库初始化时指定DBCOMPATIBILITY='A')。

  • 从Build 14开始支持使用%ROWTYPE方式引用视图的数据类型。

  • 记录字段不继承相应列的约束或初始值。

  • 如果引用的字符列具有USING_NLS_COMP以外的排序规则,则不能使用%ROWTYPE属性。

语法格式

{db_table_or_view | cursor | cursor_variable} %ROWTYPE

参数说明

  • explicit_cursor_name

    显式游标的名称。对于与explicit_cursor_name关联的查询选择的每个列,记录都有一个具有相同名称和数据类型的字段。

  • cursor_variable_name

    强游标变量的名称。对于与cursor_variable_name关联的查询选择的每个列,记录都有一个具有相同名称和数据类型的字段。

  • db_table_or_view_name

    声明时可访问的数据库表或视图的名称。对于每列db_table_or_view_name,记录都有一个具有相同名称和数据类型的字段。

示例

示例1 包内存储过程入参调用%ROWTYPE view类型,存储函数返回%ROWTYPE view类型。

1、创建测试表并插入数据。

CREATE TABLE course
(
cor_id INT ,
cor_name VARCHAR(30) NOT NULL,
cor_type VARCHAR(20),
credit DOUBLE PRECISION
);

INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (1,'数据库系统概论','必修',3);
INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (2,'艺术设计概论','选修',1);
INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (3,'力学制图','必修',4);
INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (5,'马克思主义','必修',4);

2、创建普通视图。

create or replace view courseview as select cor_id,cor_name from course;

3、声明包和包体。

create or replace package rt_pkg
as
procedure view_proc(var courseview%ROWTYPE);
function view_func(id integer) return courseview%ROWTYPE;
end rt_pkg;
/

create or replace package body rt_pkg
as
procedure view_proc(var courseview%ROWTYPE)
as
begin
raise notice 'id:%',var.cor_id;
raise notice 'name:%',var.cor_name;
end;
function view_func(id integer) return courseview%ROWTYPE
as
declare var courseview%ROWTYPE;
begin
select * into var from courseview where cor_id=id;
return var;
end;
end rt_pkg;
/

4、声明匿名块,调用包中的存储过程。

declare
var courseview%ROWTYPE;
begin
select * into var from courseview where cor_id=2;
rt_pkg.view_proc(var);
end;
/

返回结果为如下:

NOTICE:  id:2
CONTEXT:  SQL statement "CALL rt_pkg.view_proc(var)"
PL/pgSQL function inline_code_block line 4 at PERFORM
NOTICE:  name:艺术设计概论
CONTEXT:  SQL statement "CALL rt_pkg.view_proc(var)"
PL/pgSQL function inline_code_block line 4 at PERFORM
ANONYMOUS BLOCK EXECUTE

5、调用存储函数。

call rt_pkg.view_func(1);
call rt_pkg.view_func(3);

返回结果依次为如下:

 cor_id |    cor_name
--------+----------------
      1 | 数据库系统概论
(1 row)

 cor_id | cor_name
--------+----------
      3 | 力学制图
(1 row)

示例2 使用%TYPE声明变量。

1、创建测试表并插入数据,查看当前表数据。

create table at_tb2(id int,name text);
insert into at_tb2 values(1,'after s1');
insert into at_tb2 values(2,'before s1');
select * from at_tb2;

查询结果为如下:

 id |   name
----+-----------
  1 | after s1
  2 | before s1
(2 rows)

2、创建存储过程,使用%TYPE声明变量。

CREATE OR REPLACE PROCEDURE testatlasdb() 
is  
  v_ss at_tb2%ROWTYPE;
BEGIN  
   select * into v_ss from at_tb2 limit 1;
   raise notice '%', v_ss.id;
   raise notice '%',v_ss.name;
END;  
/

3、调用存储过程。

call testatlasdb();

返回结果为如下:

NOTICE:  1
NOTICE:  after s1
 testatlasdb
-------------

(1 row)

相关链接

使用游标创建type