关闭

PL/SQL常用自定义类型

标签: plsql记录类型内存表数组二维数组
1728人阅读 评论(0) 收藏 举报
分类:

概述: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 b 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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:201725次
    • 积分:3437
    • 等级:
    • 排名:第9686名
    • 原创:152篇
    • 转载:6篇
    • 译文:0篇
    • 评论:3条
    最新评论