- 浏览: 784997 次
- 性别:
- 来自: 广州
文章分类
最新评论
--集合类型
/*
单行单列的数据,使用标量变量
单行多列数据,使用记录
单列多行数据,使用集合(。。。)
*集合:类似于数组也就是。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 1207Oracle 10g 的clusterware 32位 下载地 ... -
oracle 分析函数 RANK()
2013-04-11 00:05 1098RANK()既是一个聚合函数,也是一个分析函数 其具体的语法 ... -
oracle 分析函数
2013-04-09 23:25 1172分析函数是用于计算一组中多行的聚合值,与聚合函数的区别在于聚合 ... -
批量执行 bulk collect与forall用法
2013-04-08 23:49 1388BULK COLLECT 子句会批量检 ... -
oracle 行链接与行迁移
2013-03-16 01:06 1104表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放 ... -
oracle Health Monitor
2013-01-20 00:02 1611About Health Monitor Beginning ... -
oracle moving window size与 AWR retention period关系
2013-01-19 15:58 8486转自: http://tomszrp.itpub.net/po ... -
Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
2013-01-12 00:20 2914insert提示IGNORE_ROW_ON_DUPKEY_IN ... -
oracle 11g新特性Flashback data archive
2013-01-09 22:52 30851. 什么是flashback data archive F ... -
RMAN List和report 命令
2012-12-25 00:07 2897LIST 命令 使用RMAN LIST 命令显示有关资料档案库 ... -
oracle ASM中ASM_POWER_LIMIT参数
2012-12-24 23:46 6428ASM_POWER_LIMIT 该初始化参数用于指定ASM例程 ... -
oracle I/O 从属进程
2012-12-24 23:24 1418I/O 从属进程 I/O从 ... -
easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
2012-12-19 23:43 5640用easy connect连接出现“tns无法解析指定的连接标 ... -
Flashback Database --闪回数据库
2012-12-19 23:38 1389Flashback 技术是以Undo segment中的内容为 ... -
Oracle 11g新特性:Automatic Diagnostic Repository
2012-12-19 22:35 1392Oracle Database 11g的FDI(Fault D ... -
RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系
2012-12-19 22:09 2688RMAN配置中通道(CHANNEL)相 ... -
oracle 空间RESUMABLE
2012-12-14 22:05 3058空间RESUMABLE操作 转 Oracle从9i开始 ... -
oracle 创建视图 with check option
2012-12-13 23:14 1524我们来看下面的例子: create or replace vi ... -
flashback transaction闪回事务查询
2012-11-26 22:00 1503闪回事务查询有别于闪回查询的特点有以下3个: (1) ... -
pl/sql连不上oracle数据库
2012-11-21 22:56 3748pl/sql 9.2版本连不上oracle数据库 当系统安装 ...
相关推荐
6. **复合类型**:PL/SQL支持数组、集合和记录等复合类型,这些使得处理复杂数据结构变得可能。手册会详细介绍这些类型的创建和使用。 7. **包(Packages)**:包是将相关的过程、函数和变量封装在一起的一种方式,...
- **记录和集合**:用于存储多条数据,可以是自定义类型的记录或标准的PL/SQL集合类型。 - **包**:封装相关的过程、函数和变量,提供模块化的代码组织。 学习PL/SQL不仅有助于你更好地管理Oracle数据库,还能提升...
此外,PL/SQL还支持集合类型,如VARRAY(可变数组)和TABLE(表类型),这对于处理大量数据非常有用。 这本书的配套源代码可能会涵盖以下几个方面: 1. **基础操作**:包括简单的SQL查询、变量声明、流程控制...
- **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...
- **程序包**:集合了一系列相关的子程序、类型定义和其他PL/SQL元素,便于管理和复用。 **2.3 标识符规则** PL/SQL中的标识符遵循以下规则: - 标识符长度不能超过30个字符。 - 第一个字符必须是字母。 - 不区分...
PL/SQL软件包是一组相关的过程和函数的集合,它可以用来组织和管理程序。软件包由两部分组成,说明部分和包体部分,分别用于声明公共接口和实现逻辑。 异常处理在PL/SQL中用来处理程序运行时发生的错误。PL/SQL预定...
* 包:是一组相关的 PL/SQL 程序块的集合。 * 触发器:是一种特殊的存储程序,用于自动执行某些操作。 定义函数的语法: CREATE [OR REPLACE] FUNCTION function_name [(argument [IN|OUT|IN OUT] datatype)] ...
2. **复合数据类型**:介绍PL/TABLE、记录类型(%ROWTYPE)以及集合类型(VARRAY和NESTED TABLE),这些都是处理大量数据或构建复杂数据结构的关键工具。 3. **游标**:讲解如何使用显式和隐式游标进行查询和遍历...
5. **集合类型**:包括数组(PLS_INTEGER索引的PL/SQL表)和关联数组(索引由非数字类型的值定义),以及如何在集合中插入、删除和迭代元素。 6. **包(PACKAGE)**:创建和使用包来组织相关的过程和函数,实现模块...
5. **数据操作**:除了标准的SQL查询,PL/SQL还支持集合操作,如BULK COLLECT和FORALL,可以高效地处理大量数据。 6. **游标**:PL/SQL中的游标允许逐行处理查询结果,是处理复杂数据操作的重要工具。 7. **记录...
5. **过程与函数**:过程是一组PL/SQL语句的集合,用于执行特定任务。函数与过程类似,但返回一个值。它们可以提高代码的复用性和模块化。 6. **异常处理**:PL/SQL提供了一个强大的异常处理机制,允许你定义和捕获...
5. **集合类型**:讨论PL/SQL中的集合类型,如数组、关联数组、表类型和索引表,以及它们在处理大量数据时的优势。 6. **包(PACKAGE)**:解释如何创建和使用包,包括包规范(PACKAGE SPECIFICATION)和包体...
- 表类型:使用PL/SQL表类型进行集合操作。 -记录类型:定义和使用记录类型,类似于结构或对象。 5. **程序单元**: - 包(PACKAGE):定义公共接口和私有实现,提高代码复用性。 -存储过程和函数:创建存储在...
2. 全面的数据类型支持:PL/SQL兼容所有SQL数据类型和Oracle对象类型。 3. 可存储与可重用:PL/SQL块可以被命名并存储在数据库中,便于重复使用,并可通过任何客户/服务器工具访问。 4. 安全性:可以通过Oracle数据...
《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...
3. **集合和游标**:集合是PL/SQL中处理多行数据的有效工具,如VARRAYs(固定大小数组)和associative arrays(关联数组)。游标则允许我们一行一行地处理查询结果,是处理动态数据的重要手段。 4. **存储过程和...
2. **变量和数据类型**:PL/SQL支持多种内置数据类型,如NUMBER、VARCHAR2、DATE等,以及PL/SQL特有的记录和集合类型。 3. **流程控制语句**:包括IF-THEN-ELSIF-ELSE、CASE、FOR循环、WHILE循环等,用于控制程序的...
7. SQL优化:解释PL/SQL代码的优化方法,例如编写高效的SQL语句、使用PL/SQL集合类型减少数据库I/O操作等。 8. 安全性:包括PL/SQL代码的安全性、如何在代码中处理敏感信息以及如何在Oracle数据库中管理PL/SQL代码的...
复合类型包括记录类型和集合类型,其中集合类型又包括数组和表。参考类型是记录的引用,用于在PL/SQL程序中操作数据库表中的行。 PL/SQL支持多种流程控制语句,包括条件语句(如IF和CASE)以及循环语句(如FOR、...