oracle pl/sql中记录类型、内存表总结

pl/sql中除了常用的number、varchar2、date等几种简单的数据类型外,还有两种比较常用的自定义的数据类型,即记录类型和PL/SQL内存表,下面详细总结下:

1、记录类型

记录类型可以理解为只有一行记录,它有简单和复杂之分,如果记录中只包括一个字段,那么可以认为是简单记录类型;如果字段数多于一条,可以认为是复杂记录类型。下面直接看代码理解:

简单记录类型:

TYPE cust_record_type IS RECORD (cust_name VARCHAR2(20));
cust_record cust_record_type;
cust_record customer%cust_name;

复杂记录类型:

TYPE cust_record_type IS RECORD (cust_id NUMBER, cust_name VARCHAR2(20), cust_sex VARCHAR2(2));
cust_record cust_record_type;
cust_record customer%ROWTYPE;

2、内存表类型

内存表类型可以理解为有一行或多行记录,它也有简单和复杂之分,如果只包括一个字段,可以看成是一个简单记录类型的数组;如果包含多个字段,可以看成是一个复杂记录类型的数组。下面直接看代码理解:

简单内存表类型:

TYPE cust_table_type IS TABLE OF customer.cust_name%TYPE INDEX BY BINARY_INTEGER;
cust_table cust_table_type;

复杂内存表类型:

TYPE cust_table_type IS TABLE OF customer%ROWTYPE INDEX BY BINARY_INTEGER;
cust_table cust_table_type;

一个例子

DECLARE
  TYPE cust_table_type IS TABLE OF customer%ROWTYPE INDEX BY BINARY_INTEGER;
  my_cust_table cust_table_type;
BEGIN
  FOR i IN 1 .. 100
  LOOP
    SELECT *
      INTO my_cust_table(i)
      FROM customer
     WHERE cust_id = i;
  END LOOP;
END;

对于记录类型和内存表的简单的理解大概就是上面这样,记录类型和内存表结合在一起使用,可以看下面的这样一个例子:

DECLARE
  TYPE myrecord_type IS RECORD(
    desc01 VARCHAR2(100),
    desc02 VARCHAR2(100));
  TYPE mytable_type IS TABLE OF myrecord_type INDEX BY BINARY_INTEGER;
  mytable mytable_type;
BEGIN
  mytable(0).desc01 := 'description0001';
  mytable(0).desc02 := 'description0002';
  mytable(1).desc01 := 'description0011';
  mytable(1).desc02 := 'description0012';
  mytable(2).desc01 := 'description0021';
  mytable(2).desc02 := 'descritpion0022';
  dbms_output.put_line('desc01' || '           ' || 'desc02');
  FOR i IN 0 .. 2
  LOOP
    dbms_output.put_line(mytable(i).desc01 || '      ' || mytable(i).desc02);
  END LOOP;
END;

再看下面的这个例子,跟上面的用法有些区别:

DECLARE
  TYPE myrecord_type IS RECORD(
    desc01 VARCHAR2(100),
    desc02 VARCHAR2(100));
  TYPE mytable_type IS TABLE OF myrecord_type;
  mytable mytable_type := mytable_type();
BEGIN
  mytable.extend;
  mytable(mytable.last).desc01 := 'description0001';
  mytable(mytable.last).desc02 := 'description0002';
  mytable.extend;
  mytable(mytable.last).desc01 := 'description0011';
  mytable(mytable.last).desc02 := 'description0012';
  mytable.extend;
  mytable(mytable.last).desc01 := 'description0021';
  mytable(mytable.last).desc02 := 'descritpion0022';
  dbms_output.put_line('desc01' || '           ' || 'desc02');
  FOR i IN mytable.first .. mytable.last
  LOOP
    dbms_output.put_line(mytable(i).desc01 || '      ' || mytable(i).desc02);
  END LOOP;
END;

如果去掉上面这段代码中的mytable_type(),就会出现如下图1的报错信息:ORA-06531:引用未初始化的收集

ORA-06531:引用为初始化的收集

图1:ORA-06531:引用为初始化的收集

有关内存表、集合的其他用法详见《Collections in Oracle PL/SQL》、《Bulk Binds (BULK COLLECT & FORALL) and Record Processing in Oracle》。

本文标题:oracle pl/sql中记录类型、内存表总结

本文链接:http://yedward.net/?id=84

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章