%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)