oracle 复合类型 (索引表,嵌套表,数组array)

/* 回顾oracle 复合类型 (记录和集合) */
/* 1.记录是为了更方便的处理单行多列,而集合是为了更方便的处理单列多行 */
-- (一 )记录
/* 1. 首先创建一个简单表开始 */
  create table test_complex(
                             id varchar2(20),
                             username varchar2(20)
                            );
  -- 向test_complex 表插入几条记录                         
   insert into test_complex values('1111111','aaaaa');
   insert into test_complex values('2222222','bbbbb');
   insert into test_complex values('3333333','ccccc');
                           
  /* 2. 创建一个记录类型 record   
        记录类型有两种定义方式:显式定义和隐式定义。
  */
  --显示定义
  declare
   --1.显示定义
   type t_record is record (
        id test_complex.id%type,
        username test_complex.username%type
   );
    r_record t_record ; -- 声明一个记录类型变量r_record
 
   --2.隐式定义
   r_record test_complex%rowtype;
 
   --游标定义
   cursor c_cursor(v_id) is select id,username from test_complex t where t.id=v_id;
   --3.游标定义记录变量
   r_record2 c_cursor%rowtype;
 
 
   begin
 
 
   for v in (select * from test_complex) loop
           r_record.id := v.id;
           r_record.username := v.username;
           dbms_output.put_line('id='|| r_record.id ||'username='||r_record.username);
   end loop;
     exception when others then
           raise_application_error(-20201,'程序错误 for !');
   end;
 
                        
 --- select * from tab;
 --- select * from test_complex
-- (二) 集合
   /* 集合主要包括三种: 索引表,嵌套表,以及数组(array)
     1. Index表不能存储在数据库中(存储在内存),但嵌套表和VARRAY可以被存储在数据库中。
       索引表语法如下;
       TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER;
        关键字是INDEX BY BINARY_INTEGER,没有这个关键字,那么集合将是一个嵌套表。由于不存储在数据库中,
        element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。
        索引表的下标可以为负,并且元素个数没有限制(索引有三种类型  pls_integer,binary_integer 10g开始允许使用varchar2 )
        一 :pls_integer 和 binary_integer 一样可以存储 -2^31-2^31  
        1.存储性能高
        2.pls_integer 溢出时会抛出异常,而binary_integer 如果指派给number 则不抛出异常
        3.pls_integer 直接由cpu 运算比binary_integer(由oracle 模拟执行)快
    */   
      type t_tab is table of test_complex%rowtype index by binary_integer;
           r_tab t_tab;
       SELECT id,username INTO r_tab(0) FROM test_complex WHERE id='1111111';  
    ---------------------------------------------------------------------------------------------------------------   
   /* 2.嵌套表定义语法如下:
        嵌套表非常类似于Index_by表,创建的语法也非常相似。只是没有INDEX BY BINARY_INTEGER子串
        TYPE type_name IS TABLE OF element_type [NOT NULL];
        存储在一个数据库中的嵌套表并不与表中的其它数据存放在同一个数据块中,它们实际上被存放在第二个表中。
        从数据库中取回的嵌套表也不保证元素的顺序。集合数据是离线存储的,所以嵌套表适合大型集合。
        区别1:嵌套表下标从1开始并且元素格式不限
        区别2:索引表类型不能作为表列的数据类型使用,但嵌套表可以
        区别3:嵌套表类型变量使用是必须先被构造方法初始化才能使用
        当使用嵌套表作为表列是必须用 eg: create type t_tbl is table of  varchar2(2),并且必须要为列指定专门的存储表
          create type t__tbl is table of  varchar2(10);
          /
          create table tab_t (
              username varchar2(8),
              phone  t__tab1
          ) nested table phone store as t__tab1;
          
         如果要处理多行多列则可以采用记录表
            eg: type t__tbl is table of tab_t%rowtype index by binary_integer;
   */
      type t_n_tab is table of test_complex.id%type ;
           r_n_tab t_n_tab;
       r_n_tab := r_n_tab('11111','22222');--初始化赋值
     ---------------------------------------------------------------------------------------------------------------     
   /* 3.VARRAY定义语法如下:(定长数组,下标从1开始)
        TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL];
                max_size是一个整数,用于标示VARRAY集合拥有的最多元素数目。VARRAY集合的元素数量可以低于max_size,但不能超过max_size。
                element_type是一维元素的数据类型,如果element_type是记录,那么这个记录只能使用标量数据字段(与嵌套标相似)。
                VARRAY存储在数据库中时与表中的其他数据存放在同一个数据块中,元素的顺序保存在VARRAY中。
                集合是在线存储的,VARRAY很适合于小型集合。  
               
       嵌套表和VARRAY都能作为列存储在数据库表中,所以集合自身可以为NULL,当集合为NULL时,所以也不能引用集合中的元素。
       可以使用IS NULL操作符检测集合是否为NULL。
   */
   type t_array is array(100) of test_complex.id%type ;   --可以作为表列
           r_array t_array;
       r_array := r_array('11111','22222');--初始化赋值
      -------------------------------------------------------------------------------------------------------------------
      /* 4: 批量绑定:执行单次sql 操作能完成所有元素额数据 ,可以提高性能
             forall 有三种语法如下
                     1.forall index in low_bound,up_bount sql_statement;
                     2.forall index int indices of collection [between low_bound and up_bound] sql_statement;
                     3.forall index in values of index_collection sql_statement;
                     
                     for i in indices of t_tabl -- indices of (oracle 10g 特性)用于跳过 'null'
      
            1.bulk collect into 子句用于取得批量数据,只试用于 select into ,fetch into ,dml语句
            2.forall 语句上使用values of 子句 用于从其他集合中集合下标的值(目的是可以指定插入)子集
              forall i in values of index_tab sql_statement
      
           3.sql%bulk_rowcount 用于第i个元素所作用的函数
              eg; sql%bulk_rowcount(2) 第二个元素作用的行是多少
      */
      
      
       ----------常用函数------------------------------------------------------------------------------------------------
   /*  COUNT===返回集合中元素的个数  
      DELETE========删除集合中所有元素
      DELETE(x)=====删除元素下标为x的元素=====对VARRAY非法
      DELETE(x,y)===删除元素下标从X到Y的元素====对VARRAY非法
      EXIST(x)======如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
      EXTEND========在集合末尾添加一个元素=======对Index_by非法
      EXTEND(x)=====在集合末尾添加x个元素================对Index_by非法
      EXTEND(x,n)===在集合末尾添加元素n的x个副本==============对Index_by非法
      FIRST=========返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
      LAST==========返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.  
      LIMIT=========返回VARRY集合的最大的元素个数===========Index_by集合和嵌套表无用
      NEXT(x)=======返回在第x个元素之后及紧挨着它的元素的值,如果x是最后一个元素,返回null.
      PRIOR(x)======返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null。
      TRIM==========从集合末端开始删除一个元素=====对于index_by不合法
      TRIM(x)=======从集合末端开始删除x个=====对index_by不合法
*/</p>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值