- 浏览: 771548 次
- 性别:
- 来自: 广州
文章分类
最新评论
--集合类型
/*
单行单列的数据,使用标量变量
单行多列数据,使用记录
单列多行数据,使用集合(。。。)
*集合:类似于数组也就是。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));--CLERK
end;
--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_type[NOT 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_varray.name%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-3000
end;
--集合方法综合使用例子 主要是遍历集合
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
if v_tab.exists(i) then
null;
else
v_tab.extend;--扩展一个
v_tab(i) := i*i;
end if;
end loop;
dbms_output.put_line(v_tab.count);--5
for i in 1..5 loop
dbms_output.put_line(v_tab(i));
if v_tab(i)=9 then --删除3*3=9的元素
v_tab.delete(i);
end if;
end loop;
dbms_output.put_line(v_tab.count);--4
end;
/*
单行单列的数据,使用标量变量
单行多列数据,使用记录
单列多行数据,使用集合(。。。)
*集合:类似于数组也就是。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));--CLERK
end;
--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_type[NOT 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_varray.name%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-3000
end;
--集合方法综合使用例子 主要是遍历集合
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
if v_tab.exists(i) then
null;
else
v_tab.extend;--扩展一个
v_tab(i) := i*i;
end if;
end loop;
dbms_output.put_line(v_tab.count);--5
for i in 1..5 loop
dbms_output.put_line(v_tab(i));
if v_tab(i)=9 then --删除3*3=9的元素
v_tab.delete(i);
end if;
end loop;
dbms_output.put_line(v_tab.count);--4
end;
发表评论
-
Oracle 10g 的clusterware 32位 下载地址
2013-04-19 23:03 1163Oracle 10g 的clusterware 32位 下载地 ... -
oracle 分析函数 RANK()
2013-04-11 00:05 1066RANK()既是一个聚合函数,也是一个分析函数 其具体的语法 ... -
oracle 分析函数
2013-04-09 23:25 1137分析函数是用于计算一组中多行的聚合值,与聚合函数的区别在于聚合 ... -
批量执行 bulk collect与forall用法
2013-04-08 23:49 1339BULK COLLECT 子句会批量检 ... -
oracle 行链接与行迁移
2013-03-16 01:06 1067表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放 ... -
oracle Health Monitor
2013-01-20 00:02 1574About Health Monitor Beginning ... -
oracle moving window size与 AWR retention period关系
2013-01-19 15:58 8455转自: http://tomszrp.itpub.net/po ... -
Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
2013-01-12 00:20 2835insert提示IGNORE_ROW_ON_DUPKEY_IN ... -
oracle 11g新特性Flashback data archive
2013-01-09 22:52 30421. 什么是flashback data archive F ... -
RMAN List和report 命令
2012-12-25 00:07 2828LIST 命令 使用RMAN LIST 命令显示有关资料档案库 ... -
oracle ASM中ASM_POWER_LIMIT参数
2012-12-24 23:46 6368ASM_POWER_LIMIT 该初始化参数用于指定ASM例程 ... -
oracle I/O 从属进程
2012-12-24 23:24 1371I/O 从属进程 I/O从 ... -
easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
2012-12-19 23:43 5592用easy connect连接出现“tns无法解析指定的连接标 ... -
Flashback Database --闪回数据库
2012-12-19 23:38 1336Flashback 技术是以Undo segment中的内容为 ... -
Oracle 11g新特性:Automatic Diagnostic Repository
2012-12-19 22:35 1348Oracle Database 11g的FDI(Fault D ... -
RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系
2012-12-19 22:09 2598RMAN配置中通道(CHANNEL)相 ... -
oracle 空间RESUMABLE
2012-12-14 22:05 3010空间RESUMABLE操作 转 Oracle从9i开始 ... -
oracle 创建视图 with check option
2012-12-13 23:14 1464我们来看下面的例子: create or replace vi ... -
flashback transaction闪回事务查询
2012-11-26 22:00 1462闪回事务查询有别于闪回查询的特点有以下3个: (1) ... -
pl/sql连不上oracle数据库
2012-11-21 22:56 3708pl/sql 9.2版本连不上oracle数据库 当系统安装 ...
相关推荐
第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包 第十章 PL/SQL对象类型 第十一章 本地动态SQL 第十二章 PL/SQL应用程序性能调优
《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...
集合类型 对象类型等 本书不仅适合于pl/sql初学者 而且也适合于有经验的pl/sql编程人员 本书还可以作为oracle应用开发培训班的教材或者辅助材料 ">sql是关系数据库的基本操作语言 它是应用程序与数据库进行交互...
PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...
《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...
PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...
PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...
第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 PL-SQL子程序 第十章 PL-SQL包 第十一章 PL-SQL对象类型 第十二章 本地动态SQL 第十三章 PL...
通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量...
通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的...pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...
《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...
通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的...PL/SQL的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...
PL/SQL集合 23 嵌套表 24 使用集合 25 集合的方法 28 关于集合之间的比较 29 3.PL/SQL单行函数和组函数详解 29 单行字符串函数 30 单行转换函数 37 SQL中的组函数 40 嵌套函数 42 4.Oracle数据库数据对象分析(上)...
PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...
PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...
通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的...pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)...
· 第五章 PL/SQL集合与记录(2) 2008-04-08 · 第五章 PL/SQL集合与记录(1) 2008-04-08 · 第四章 PL/SQL的控制结构 2008-04-08 · 第三章 PL/SQL数据类型 2008-04-08 · 第二章 PL/SQL基础 2008-04...
PL/SQL Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的数据库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或数据库移动到其他位置时,所需工程条目的查找就变得比较简单...