PL/SQL常用自定义类型

概述:PL/SQL中常用的自定义类型就两种:记录类型、PL/SQL内存表类型

(根据表中的数据字段的简单和复杂程度又可分别实现类似于简单数组和记录数组的功能)


1、记录类型的定义语句:

TYPE type_name IS RECORD
(field_declaration[, field_declaration]…);
identifier type_name;

这里的field_declaration 的具体格式可以是:

field_name {field_type | variable%TYPE
| table.column%TYPE | table%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]


举例:

TYPE  type_group_rec  IS   RECORD (
    interface_run_id  NUMBER  ,
    set_of_books_id   NUMBER  );  --RECORD


2、%ROWTYPE属性:在PLSQL中%ROWTYPE 表示某张表的记录类型或者是用户指定以的记录类型,使用此
属性可以很方便的定义一个变量,其类型与某张表的记录或者自定义的记录类型保持一致。极大的方便了
Select * into ….的语句使用。

定义:emp_rec employees%ROWTYPE;


3、PLSQL内存表即Index By Table , 这种结构类似于数组,使用主键提供类似于数组那样的元
素访问。这种类型必须包括两部分:1、使用BINARY_INTEGER 类型构成的索引主键; 2、另外一个简单类型
或者用户自定义类型的字段作为具体的数组元素。这种类型可以自动增长,所以也类似于可变长数组。

语法:

TYPE type_name IS TABLE OF
{column_type | variable%TYPE
| table.column%TYPE} [NOT NULL]
| table.%ROWTYPE
[INDEX BY BINARY_INTEGER];
identifier type_name;

举例:这是一个简单数组

TYPE ename_table_type IS TABLE OF
employees.last_name%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;


4、实例:


定义数组

TYPE   type_group_info   IS   TABLE   OF   NUMBER   INDEX   BY   PLS_INTEGER   ;   --定义一维数组
  rec_group_info type_group_info;

TYPE   type_batch_info   IS   TABLE   OF   type_group_info   INDEX   BY   PLS_INTEGER ;   --定义二维数组
  rec_batch_info type_batch_info;

--一维数组赋值
rec_group_info(1) := 1;

--二维数组赋值
rec_batch_info(1)(1) := 1;

记录型变量定义
TYPE  type_group_rec  IS   RECORD (
    interface_run_id  NUMBER  ,
    set_of_books_id   NUMBER  );  --RECORD
TYPE  type_group_tbl  IS   TABLE   OF  type_group_rec  INDEX   BY   PLS_INTEGER   --定义二维数组
l_type_group_tbl  type_group_tbl  ;

初始化:(初始化并不是必须的,视情况而定,最好是在程序的入口对数组进行初始化)
l_type_group_tbl.delete;

赋值:
l_type_batch_tbl(l_type_batch_tbl.count +  1  ).interface_run_id := l_type_group_tbl(l_type_group_tbl.count)
                                                                             .interface_run_id;
l_type_batch_tbl(l_type_batch_tbl.count).batch_id := l_batch_id;
同时赋值时注意第二个变量的数量,不能够是count + 1,如果是count + 1在最后count时记录型变量的数量会翻倍。


实例:
DECLARE
   TYPE  type_group_rec  IS   RECORD   (
    interface_run_id  NUMBER  ,
    set_of_books_id   NUMBER  );  --RECORD
   TYPE  type_batch_rec  IS   RECORD   (
    interface_run_id  NUMBER  ,
    batch_id          NUMBER  );  --RECORD
   TYPE  type_group_tbl  IS   TABLE   OF  type_group_rec  INDEX   BY   PLS_INTEGER --定义二维数组
   TYPE  type_batch_tbl  IS   TABLE   OF  type_batch_rec  INDEX   BY   PLS_INTEGER --定义二维数组
  l_type_group_tbl type_group_tbl;
  l_type_batch_tbl type_batch_tbl;
  l_index           NUMBER  :=  0   ;
  l_org_index       NUMBER  :=  0   ;
BEGIN

   FOR  i  IN   1   ..  3   LOOP
    l_index := l_index +  1  ;
    l_org_index := l_org_index + l_index;
    l_type_group_tbl(l_type_group_tbl.count +  1  ).interface_run_id := l_index;
    l_type_group_tbl(l_type_group_tbl.count).set_of_books_id := l_org_index;
    l_type_batch_tbl(l_type_batch_tbl.count +  1  ).interface_run_id := l_index;
    l_type_batch_tbl(l_type_batch_tbl.count).batch_id := l_org_index;
   END   LOOP  ;

   FOR  a  IN   1   .. l_type_group_tbl.count  LOOP
    dbms_output.put_line(   'l_type_group_tbl(a = '  || a ||
                          ').interface_run_id = '  || l_type_group_tbl(a)
                         .interface_run_id);
    dbms_output.put_line(   'l_type_group_tbl(a = '  || a ||
                          ').set_of_books_id = '  || l_type_group_tbl(a)
                         .set_of_books_id);
     FOR   IN   1  .. l_type_batch_tbl.count  LOOP
       IF  l_type_group_tbl(a)
       .interface_run_id = l_type_batch_tbl(b).interface_run_id  THEN
        dbms_output.put_line(   'l_type_batch_tbl(b = '  || b ||
                              ').interface_run_id = '  || l_type_batch_tbl(b)
                             .interface_run_id);
        dbms_output.put_line(   'l_type_batch_tbl(b = '  || b ||
                              ').batch_id = '  || l_type_batch_tbl(b)
                             .batch_id);
       END   IF   ;
     END   LOOP   ;
   END   LOOP  ;
END  ;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值