LightDB支持存储过程,除了支持Postgres的plpgsql存储过程,还兼容Oracle的存储过程,新增了plorasql过程语言。上一篇中我们介绍了存储过程中的动态SQL语句,这一篇主要讲述存储过程中的记录类型。
记录类型时PL/SQL中的复合类型,内部组件可以具有不同的数据类型。可以简单理解为是C语言中的结构体。因此记录类型有着广泛的应用。复合数据类型时指包含内部组件的数据类型,可以参考LightDB中的复合类型这篇文章。
PL/SQL支持两种复合数据类型:集合类型和记录类型。他们的区别是:集合类型中所有内部组件具有相同的数据类型,而记录类型内部组件可以具有不同的数据类型。集合类型后续文章会讲,本文主要讲述记录类型。
可以使用RECORD语句在PL/SQL块中声明记录类型,该记录类型是局部的数据类型,只能在当前块中使用。如果记录类型是在独立子程序或包中声明的,则记录类型存储在数据库中。在包的规范中声明的记录类型是包的公共元素,可以在包外部以"packagename.typename"的形式引用。当删除包时,包中的记录也会被删除。
好了,我们看一下如何声明一个记录类型,如何去使用记录类型。举个具体的例子:
create or replace procedure shenlan
as
declare
type mytype is record (a int, b varchar(10)); -- 在存储过程中声明一个记录类型
v mytype;
begin
select id,name into v from mystudent where rownum < 2;
raise notice '%', v;
end;
/
drop procedure shenlan; -- 同时会删掉记录类型mytype、
当然,声明记录类型时也可以使用%TYPE,举个例子:
create or replace procedure shenlan
as
declare
type mytype is record (a mystudent.id%TYPE, b mystudent.name%TYPE); -- 在存储过程中声明一个记录类型
v mytype;
begin
select id,name into v from mystudent where rownum < 2;
raise notice '%', v;
end;
/
另外,实际使用中,还可以利用%ROWTYPE声明记录类型变量。可以通过%ROWTYPE声明与已知表、视图相一致的记录类型变量,该变量的各个字段的名称、顺序、数据类型与相应表、视图中列的名称、顺序、数据类型一致。举个例子:
create or replace procedure shenlan
as
declare
v mystudent%ROWTYPE; -- 利用%ROWTYPE声明记录类型变量
begin
select * into v from mystudent where rownum < 2;
raise notice '%', v.id; -- 记录类型的使用
end;
/
记录类型还可以在INSERT语句中应用,举个示例如下:
create or replace procedure shenlan
as
declare
v mystudent%ROWTYPE; -- 利用%ROWTYPE声明记录类型变量
begin
select * into v from mystudent where rownum < 2;
v.id := 10000;
insert into mystudent values v; -- 还可以这么用
end;
/
更多请参考LightDB官网