凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1156338
  • 博文数量: 166
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3760
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

about me:oracle ace pro,optimistic,passionate and harmonious. focus on oracle,mysql and other database programming,peformance tuning,db design, j2ee,linux/aix,architecture tech,etc

文章分类

全部博文(166)

文章存档

2024年(21)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2020-07-08 09:09:19

接part1:

pl/sql中的集合类型-凯发app官方网站

  有两种方式声明集合变量,一是在应用程序级别的声明,二是在schema级别的声明。

1.应用程序级别的声明,指三种集合类型声明在程序中,程序可以使用,如果是声明在package中,则所有的package的执行部分可以使用。在声明部分使用type语句。

2.schema级别的声明,在应用程序之外声明,也就是建立一个数据库对象,使用create type

当然也可以使用create or replace type,删除使用drop type name [force],这样的自定义类型,可以在数据库中表的列类型应用,以及程序中使用。

 

   声明index by (associative array)

    typetable_type_nameis table ofdatatype[ not null ]
       index byindex_type;
index_type是管理行的内容的索引。index_type不局限于binary_integer,下面全为合法:
 index by binary_integer;
    index by pls_integer;
    index by positive;
    index by natural;
    index by signtype;
    index by varchar2(32767);
    index bytable.column%type;
    index bycursor.column%type;
    index bypackage.variable%type;
    index bypackage.subtype;
如在包中声明类型,然后将excute权限给public,则所有的就可以使用这个类型。

createorreplacepackage collection_types

   is

      -- associative array types

      type boolean_aat istableofbooleanindexbybinary_integer;

   

      type date_aat istableofdateindexbybinary_integer;

   

      type pls_integer_aat istableofpls_integerindexbybinary_integer;

   

      type number_aat istableofnumberindexbybinary_integer;

    type identifier_aat istableofvarchar2(30)

     indexbybinary_integer;

 

    type vcmax_aat istableofvarchar2(32767)

     indexbybinary_integer;

 --index by表中存的是record,并且索引为varchar2类型,10g支持索引为varchar2,必须指明长度

 

 type a isrecord(

   idnumber,

  mm varchar2(10)

  );

type test_type istableof a indexbyvarchar2(10);

 

    -- nested table types

    type boolean_ntt istableofboolean;

    type date_ntt istableofdate;

    type pls_integer_ntt istableofpls_integer;

    type number_ntt istableofnumber;

    type identifier_ntt istableofvarchar2(30);

    type vcmax_ntt istableofvarchar2(32767)

 end collection_types;

     /

   

                                         

使用:
declare
       family_birthdays collection_types.date_aat;
 

声明nested table or arrays

      schema级别的声明:

create [ or replace ] typetype_nameas | is
       table ofelement_datatype[ not null ];
 
create [ or replace ] typetype_nameas | is
       varray (max_elements) ofelement_datatype[ not null ];

删除类型

drop typetype_name[ force ];//force是不管有没有被使用都删除
应用程序级别的声明,create or replace不使用,直接用type声明。
对于element_typeschema级别的声明可以是不可以引用其他对象类型如%rowtype,在应用程序级别
的声明可以使用其他类型。

 

修改nested table or varray的声明

1.varray,修改存放的元素个数,如

create or replace type  ts is varray(10) of varchar2(10) not null;--声明ts为数组

--修改数组中长度信息

alter type ts modify limit 100 invalidate;

使用alter type命令,然后modify limit 长度,其中invalidate是强迫所有的引用此类型的程序或表发生改变。

2.修改存放的元素类型

alter type ts modify element type varchar2(100) cascade;

使用alter type命令,然后是element type 修改后的 cascade是级联所有使用此类型的程序或表。

 

声明和初始化集合变量

 

collection_name collection_type [:=collection_type(...)];

         index by表不需要构造器初始化,对于nested tablevarray需要构造器初始化。如果在使用之前不初始化会报错:ora-06531: reference to uninitialized collection一般是在声明集合变量的时候给予空初始化,如果显示初始化多个值,则用逗号隔开。

            nested tablevarray的初始化,可以在声明部分,也可以在执行部分,如

 

       declare

       type company_aat is table of company%rowtype;

       premier_sponsor_list company_aat := company_aat(  );--声明部分的初始化

      begin

       ...--

       end;

 

declare
       type company_aat is table of company%rowtype;
       premier_sponsor_list company_aat;
    begin
       premier_sponsor_list:= company_aat(  );--执行部分的初始化
end;
 

   

     createorreplacetype color_tab_t astableofvarchar2(30);

/**

集合的声明和初始化

**/

   declare

       my_favorite_colors color_tab_t := color_tab_t(  );--初始化为空

       his_favorite_colors color_tab_t := color_tab_t('purple');--初始化一个元素

       her_favorite_colors color_tab_t := color_tab_t('purple', 'green');--初始化两个元素

      

    begin

       dbms_output.put_line(her_favorite_colors(2));--通过下标访问

    end;

 

 

增加新元素,必须使用extend,初始化了,使用隐extend

 

通过隐性相互赋值直接初始化

        相同类型的集合变量可以相互赋值,而不是存放的元素类型相同。

   

createorreplacetype st istableofvarchar2(10);

 

declare

       a st:=st('ding','wang');--初始化两个值

       b st:=st();--初始化为空

       begin

         b:=a;--相同类型之间赋值,相当于拷贝

         dbms_output.put_line('直接赋值b(2)='||b(2));

         b(2):='jack';--修改b(2),a(2)不受影响

         dbms_output.put_line('修改后的b(2)='||b(2));

       end;  


通过fetchselect..into隐性初始化

如果数据库中表的列类型是集合类型,可以通过fetch或select..into到集合中实现初始化。

--建立一个schema level的集合类型
create or replace type color_tab_t as table of varchar2(30);
/
--建立一个表有集合列
    create table color_models (
         model_type varchar2(12)
       , colors color_tab_t
       )
       nested table colors store as color_model_colors_tab;
    insert into color_models
       values ('rgb', color_tab_t('red','green','blue'));
  declare
       l_colors color_tab_t;
    begin
       /* retrieve all the nested values in a single fetch.
       || this is the cool part.
       */
       select colors into l_colors from color_models
          where model_type = 'rgb';
      dbms_output.put_line(l_colors(1));
    end;


用数据操纵集合

 

       index by表初始化不需要构造器,只要初始化一个就可以,直接赋值,索引可正可负,范围在-231 1 and 231 – 1.

       nested tablearray初始化必须通过构造器。先初始化为空的话,要增加数据必须通过extend关键字,而且增加数据的范围由extend决定。否则会报越界错误。

       给集合变量分配数据:

 

declare
       type emp_copy_t is table of emp%rowtype;
       l_emps emp_copy_t := emp_copy_t(  );
       l_emprec emp%rowtype;
    begin
       l_emprec.ename := 'steven';
       l_emprec.salary := 10000;
       l_emps.extend
       l_emps (l_emps.last) := l_emprec;
    end;

 

index by 表在10g中接受索引类型的种类

       10gindex by表又称为associate arrays,接受的索引不光是binary_integer,对于pls_integer,varchar2等也接受。见下表:

 

index by clause

minimum value

maximum value

    index by binary_integer

 

-231 1

231 - 1

    index by pls_integer

 

-231 1

231 - 1

 index by natural

 

0

231 - 1

    index by positive

 

1

231 - 1

    index by signtype

 

-1

1

    index by varchar(n)

 

any string within specified length

任何字符都合法

any string within specified lengt

 

 

declare

  type aa istableofvarchar2(10)indexbyvarchar2(10);--支持varchar2作为索引,任意字符

  vb aa;

  begin

       vb('ds'):='jack';

       vb('4'):='wang';

       vb('5'):='ding';

       dbms_output.put_line(vb('ds'));

  end;



未完待续,见part3:
阅读(1885) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:pl/sql中的集合类型_part3

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图