首先区分几个概念问题:
在平时编程中,对于单行单列,我们可以使用标量变量,对于单行多列,我们可以使用PL/SQL记录,而对于单列多行,我们就要用PL/SQL集合
PL/SQL集合相当于高级编程语言数组的一种复合型变量,包括:索引表(PL/SQL表),嵌套表(NESTED TABLE),变长数组(VARRAY)三种
索引表和嵌套表的区别:
相同点:两者元素个数都没有限制,而变长数组有元素个数限制
不同点:1.定义方法不同:
TYPE TP_DEXINT IS TABLE OF NUMBER INDEX BY PLS_INTEGER;--索引表定义 【1】
TYPE TP_DEXBIN IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;--索引表定义【2】
TYPE TP_DEXVAR IS TABLE OF NUMBER INDEX BY varchar2(10);--索引表定义
TYPE TP_QT IS TABLE OF NUMBER; --嵌套表定义
备注:【1】【2】的区别是什么?两者都是整型类型,【2】类型变量值是计算是
ORACLE模拟执行的,不会出现溢出,但是执行速度较慢,因为它是由ORACLE模拟执行,而
Pls_Integer的执行是由硬件即直接由CPU来运算,因而会出现溢出,但其执行速度较前者快
2.索引表下标可以为负值,而嵌套表下标必须从1开始(默认)
T_DEX TP_DEX
T_DEX(-5):=1; --下标可以为负值
T_DEX('王显伟'):=‘137********’;
3.使用嵌套表变量时,必须首先使用构造方法初始化嵌套表变量,然后才以在块内引用嵌套表元素
T_DEXVAR TP_DEXVAR :=TP_DEXVAR('1');
4.在表列中使用嵌套表类型,必须首先使用CREATE TYPE命令建立嵌套表类型,使用嵌套表类型作为
表列的数据类型时,必须要为嵌套表列指定专门的存储表
create type phone_type is table of varchar2(20);
create table employee(
id number(4),name varchar2(10),sal number(6,2),
phone phone_type
)nested table phone store as phone_table;
当定义嵌套表类型时,ORACLE自动为该类型生成相应的构造方法.当为嵌套表列插入数据时,需要
使用嵌套表的构造方法
begin
insert into employee values(1,'scott',800,phone_type('0471-*******','138********'));
end;
--下面内容引自网络,不在整理
8.10集合方法:ORACLE提供的用于操纵集合变量的内置函数或过程,其中EXISTS,COUNT,LIMIT,FIRST,NEXT,FRIOR和NEXT是函数
而EXTEND,TRIM和DELETE则是过程
集合方法只能在PL/SQL语句中使用,不能在SQL语句中使用.
集合方法EXTEND和TRIM只适用于嵌套表和VARRAY,而不适合于索引表
1.EXISTS:用于确定
集合元素是否存在
declare
type ename_table_type is table of emp.ename%type;
ename_table ename_table_type;
begin
if ename_table.exists(1) then
ename_table(1):='SCOTT';
else
dbms_output.put_line('必须初始化