使用记录类型

如果我们是在记录级别进行操作,我们可以避免对记录中单独字段的引用。

目前PL/SQL可以支持的记录级别的操作包括:

  1. 我们可以把一个记录赋给另一个记录,只要这些记录基于相同的记录类型(同一个自定义类型),或是兼容的%ROWTYPE记录类型(这些类型具有相同数量的字段,对应字段的数据类型相兼容)。
  2. 我们可以用赋值操作给记录赋一个NULL值。
  3. 我们可以通过INTO语句更新记录类型数据,当INTO目标中出现记录变量时,则INTO目标只能是单个的记录变量,不能有其他变量存在。

目前不支持的记录级别操作包括:

  1. 不能在参数列表中定义记录类型的参数。
  2. 函数返回值不能是记录类型。
  3. 不能对两个记录作比较,我们必须比较每一个字段才能对两个记录类型进行判断。
  4. 不能向数据库表插入(INSERT)或更新(UPDATE)一个记录类型。相反,我们必须把记录的每一个字段传递给每一列。如下示例说明了记录类型在一些DML语句中的用法。

示例:使用记录类型

--  清理环境
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;

create table tab
(
    a int,
    b varchar2(10)
);
insert into tab values(1,'a');
insert into tab values(2,'b');

CREATE OR REPLACE PROCEDURE proc AS
declare
    myrecord tab%rowtype;
begin
    myrecord.a := 123;
    myrecord.b := 'new';
    --在RETURNING INTO语句中使用记录类型
    update tab set a = 100 where a = 1 
        returning a,b into myrecord;
    dbms_output.put_line( 'a:' || myrecord.a);
    dbms_output.put_line( 'b:' || myrecord.b);

    --在SELECT语句中使用记录类型
    select * into myrecord from tab where a = 2;
    dbms_output.put_line( 'a:' || myrecord.a);

    dbms_output.put_line( 'b:' || myrecord.b);
end;
/
EXEC proc;
a:100
b:a
a:2
b:b


select * from tab;
A(int)      |B(varchar)      |
----------------------------
100         |a               |
----------------------------
2           |b               |
总数目:2

--删除
DROP PROCEDURE proc;
DROP TABLE tab CASCADE;