数据库中集合的详细介绍.doc_第1页
数据库中集合的详细介绍.doc_第2页
数据库中集合的详细介绍.doc_第3页
数据库中集合的详细介绍.doc_第4页
数据库中集合的详细介绍.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

今天写一个东西,需要通过下表找一个未知SQL的列名,如果通过把SQL放到临时表中,然后通过user_tab_cols,的table_name 和columnID找到列名,速度太慢!慢的受不了! 在网上找到关于集合的概念,希望能够通过下表直接取到列值,而不是先去视图,再找列名,再找列值!-集合类型/* 单行单列的数据,使用标量变量 单行多列数据,使用记录 单列多行数据,使用集合(。) *集合:类似于数组也就是。pl/sql集合类型包括索引表(pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)等*/* -集合方法 exists(index) 索引处的元素是否存在 count 当前集合中的元素总个数 limit 集合元素索引的最大值 索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引 first 返回集合第一个元素索引 last 返回集合最后一个元素索引 prior 当前元素的前一个 next 当前元素的后一个 extend 扩展集合的容量,增加元素 只是用于嵌套表和varry类型 x.extend 增加一个null元素 x.extend(n) 增加n个null元素 x.extend(n,i) 增加n个元素,元素值与第i个元素相同 trim 从集合的尾部删除元素 只用于NEST TABLE和VARRY类型 trim 从集合尾部删除一个元素 trim(n) 从集合尾部删除n个元素 delete 按索引删除集合元素 delete 删除所有 delete(index) 删除第index个 delete(a,b) 删除a-b之间的所有元素*/-1 索引表/*下标无限制,可以为负数元素个数无限制定义 TYPE type_name IS TABLE OF element_type NOT NULL INDEX BY key_type; type_name:用户自定义数据类型的名字 element_type:索引表中元素类型 key_type:索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)*/declare type index_tab_type is table of varchar2(30) index by BINARY_INTEGER; v_table index_tab_type;begin v_table(-1) :=hello;-设定下标为-1的元素的值 v_table(1) :=,; dbms_output.put_line(v_table(-1)|-|v_table(1); dbms_output.put_line(元素个数:|v_table.count); v_table(5) :=world; dbms_output.put_line(元素个数:|v_table.count); dbms_output.put_line(第一个元素|v_table.first); dbms_output.put_line(最后一个元素|v_table.last);end;/*输出结果hello-,元素个数:2元素个数:3第一个元素-1最后一个元素5*/-使用varchar2作为索引元素类型 ,其实也就和java中的map一样了 key-value形式存储declare type index_tab_type is table of varchar2(30) index by varchar2(30); v_table index_tab_type; v_record emp%rowtype;begin -emp表中查询3条记录,以name-job的形式存储到索引表中 select * into v_record from emp where emp.empno=7788; v_table(v_record.ename):= v_record.job; select * into v_record from emp where emp.empno=7844; v_table(v_record.ename):= v_record.job; select * into v_record from emp where emp.empno=7900; v_table(v_record.ename):= v_record.job; dbms_output.put_line(v_table.count);-3 dbms_output.put_line(v_table(v_record.ename);-CLERKend;-2嵌套表 NESTED TABLE/*下标从1开始,元素个数灭有限制(*使用时必须先初始化,用extend属性可以扩展元素个数)可以作为表定义数据类型,但是前提是要先create 创造嵌套表类型,这就可以实现1对多了定义 TYPE type_name IS TABLE OF element_type; 和索引表的区别也就是看看有无index by语句,嵌套表的索引固定是int型的*/declare type nest_table_type is table of emp.ename%type; v_nest_tab nest_table_type;begin v_nest_tab :=nest_table_type(x);-初始化 必须! 语句 type_name(.) select ename into v_nest_tab(1) from emp where empno=7788; dbms_output.put_line(v_nest_tab(1);end;declare type nest_tab_type is table of emp.ename%type; v_tab nest_tab_type;begin v_tab := nest_tab_type(x); select ename into v_tab(1) from emp where emp.empno=7788; dbms_output.put_line(v_tab(1);end;-在表列中使用嵌套表 嵌套表类型的列是单独一个表存储 -先创建一个这样的类型 必须 才能使用 create type nest_tab_type is table of varchar2(30); create table test_nest_tab( id int, vals nest_tab_type -使用 ) nested table vals store as nest_tab;-vals字段用嵌套表存储,表明nest_tab -上面语句执行完之后,在生成TEST_NEST_TAB的同时会生出一个关联表NEST_TAB用来存储关联表的数据-插入数据insert into test_nest_tab values(1,nest_tab_type(one,two,three,four);-查询数据declare v_id int; v_tab nest_tab_type;begin select * into v_id,v_tab from test_nest_tab where id=1; dbms_output.put_line(v_id); for i in 1.v_tab.count loop dbms_output.put_line(v_tab(i); end loop;end;-3 VARRY 可变数组 变长数组/*定义 TYPE type_name IS VARRAY(size_limit) OF element_typeNOT NULL; 这个就和java中的数组差不多了,下标from 1 ,定义时先指定最大元素个数,也和varchar2(size)这种一样。 使用时也必须先用构造方法初始化 可以作为表列类型*/declare type varr is VARRAY(10) of int; v_varr varr :=varr();begin -dbms_output.put_line(varr.count); for i in 1.5 loop v_varr.extend; v_varr(i) :=i*i; end loop; for i in 1.5 loop dbms_output.put_line(v_varr(i); end loop;end;-可变数组作为表列类型 可变数组是存储在表内部的,不同于嵌套表create type varr_type is varray(10) of varchar2(30);-先创建类型create table test_varray( id int, name varchar2(30), params varr_type -param是使用可变数组类型);-插入数据insert into test_varray values(1,bird,varr_type(a,b,c);-查询数据declare v_varr varr_type; v_name test_%type;begin select name,params into v_name,v_varr from test_varray where id=1; for i in 1.v_varr.count loop dbms_output.put_line(v_varr(i); end loop;end;-记录表 集合类型是表的一行,集合元素不仅可以是简单类型,也可以是复合类型declare type emp_tab_type is table of emp%rowtype index by binary_integer; v_tab emp_tab_type;begin select * into v_tab(1) from emp where emp.empno=7788; dbms_output.put_line(v_tab(1).ename|-|v_tab(1).job|-|v_tab(1).sal);-SCOTT-ANALYST-3000end;-集合方法综合使用例子 主要是遍历集合declare type v_table_type is table of varchar2(30); v_table v_table_type :=v_table_type();begin dbms_output.put_line(v_table.count|-|v_table.limit|-|v_table.first|-|v_table.last); - 0- if v_table.exists(1) then -判断index1是否有值 null; else v_table.extend;-扩充一个值 select ename into v_table(1) from emp where emp.empno=7788; dbms_output.put_line(v_table(1); -SCOTT dbms_output.put_line(v_table.count|-|v_table.limit|-|v_table.first|-|v_table.last);- 1-1-1 end if;end;-遍历集合(不连续)declare type v_tab_type is table of varchar2(30) index by binary_integer; v_tab v_tab_type; v_index int;begin -添加几个无序有间隔的元素 v_tab(-1) :=a; v_tab(2) :=b; v_tab(3) :=c; v_tab(5) :=d; v_tab(-2) :=e; -method 1 v_index :=v_tab.first; for i in 1.v_tab.count loop dbms_output.put_line(v_tab(v_index); v_index :=v_tab.next(v_index); end loop; -method2 for i in v_tab.first.v_tab.last loop if v_tab.exists(i) then dbms_output.put_line(v_tab(i); else dbms_output.put_line(元素不存在); end if; end loop;end;-修改集合中的元素declare type v_tab_type is table of int; v_tab v_tab_type :=v_tab_type();begin for i in 1.5 loop i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论