PL/SQL常用自定义类型

原创 2013年12月04日 17:18:30

概述: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 ;


版权声明:本文为博主原创文章,未经博主允许不得转载。

plsql使用自定义的嵌套表

存储过程在使用嵌套表时需要注意: 1.如果嵌套表是直接参照一个物理表的结构创建的,则可以直接使用,如: create or replace procedure mytest2 is   CURS...
  • majian_1987
  • majian_1987
  • 2013年01月30日 17:21
  • 1412

sql创建自定义数据类型

 除了使用系统提供的数据类型外,用户还可以根据需要用自定义的数据类型来定义表的列或声明变量。  7.3.1 用Enterprise Manager 创建用户自定义数据类型  用Enterprise M...
  • fenghu89
  • fenghu89
  • 2007年11月29日 20:37
  • 2637

plsql结构定义,复合类型,行类型和列类型,逻辑控制语句

一:plsql结构定义        PL/SQL(Procedural Language/SQL):过程化编程语言       Oracle对标准SQL语言的过程化扩充  ...
  • t0404
  • t0404
  • 2016年07月01日 23:43
  • 655

PL/SQL基础编程之(五)[自定义复合变量][%TYPE和%ROWTYPE的应用]

1、自定义复合变量查询以及输出案例: declare TYPE myrecord IS RECORD( aa varchar2(10), bb varchar2(10)); -...
  • zhang6622056
  • zhang6622056
  • 2012年01月12日 14:10
  • 1006

PL/SQL表(oracle内存表)---table()函数用法

PL/SQL表(oracle内存表)---table()函数用法 http://blog.csdn.net/jojo52013145/article/details/6758279   Orac...
  • orion61
  • orion61
  • 2013年01月23日 17:14
  • 1386

Oracle 和 PLSQL中支持的数据类型

以下是 Oracle 和 PLSQL中支持的数据类型的列表。我们还列出了在 Oracle 8i 同 Oracle 9i中所支持数据类型的差别: ...
  • eigo
  • eigo
  • 2006年03月31日 13:51
  • 5528

PLSQL内存表

在项目的PLSQL部分中,第一次接触了内存表的概念,类似于C编程语言的数组,以前一直在找PLSQL中COLLECITION的概念。1.      内存表概念:PL/SQL表类似于C语言中的数组。如果要...
  • xqlig2005
  • xqlig2005
  • 2006年07月08日 19:09
  • 1429

PL/SQL常用自定义类型

概述:PL/SQL中常用的自定义类型就两种:记录类型、PL/SQL内存表类型  (根据表中的数据字段的简单和复杂程度又可分别实现类似于简单数组和记录数组的功能) 1、记录类型的定义语句: ...
  • gh320
  • gh320
  • 2013年12月04日 17:18
  • 2011

Oracle自定义数据类型

转自:http://fuwenchao.blog.51cto.com/6008712/1364551 一:Oracle中的类型有很多种,主要可以分为以下几类: 1、字符串类型。如:char、nc...
  • jinzhilong580231
  • jinzhilong580231
  • 2015年03月27日 11:13
  • 6237

PL/SQL 基本语法

PL/SQL介绍PL/SQL是Oracle对标准数据库语言SQL的过程化扩充,它将数据库技术和过程化程序设计语言联系起来,是一种应用开发语言,可使用循环,分支处理数据,将SQL的数据操纵功能与过程化语...
  • u012414590
  • u012414590
  • 2017年04月06日 17:33
  • 2861
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PL/SQL常用自定义类型
举报原因:
原因补充:

(最多只允许输入30个字)