- 浏览: 224540 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kandari:
很全,收藏
oracle相关知识 -
若见三生石:
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
若见三生石:
你好,要定义的类和类型怎么写呢?
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
greatwqs:
...
PLSQL操作文件 -
sun17921:
var areaCode ={11:"北京" ...
身份证验证JS
http://www.cnblogs.com/lanzi/archive/2010/09/14/1825717.html
下表中列出oracle中集合的方法
方法 | 描述 | 使用限制 |
COUNT | 返回集合中元素的个数 | |
DELETE | 删除集合中所有元素 | |
DELETE() | 删除元素下标为x的元素,如果x为null,则集合保持不变 | 对VARRAY非法 |
DELETE(,) | 删除元素下标从X到Y的元素,如果X>Y集合保持不变 | 对VARRAY非法 |
EXIST() | 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE | |
EXTEND | 在集合末尾添加一个元素 | 对Index_by非法 |
EXTEND() | 在集合末尾添加x个元素 | 对Index_by非法 |
EXTEND(,) | 在集合末尾添加元素n的x个副本 | 对Index_by非法 |
FIRST | 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。 | |
LAST | 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT. | |
LIMIT | 返回VARRY集合的最大的元素个数,对于嵌套表和对于嵌套表和Index_by为null | Index_by集合无用 |
NEXT() | 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null. | |
PRIOR() | 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。 | |
TRI M | 从集合末端开始删除一个元素 | 对于index_by不合法 |
TRIM() | 从集合末端开始删除x个元素 | 对index_by不合法 |
集合方法
集合方法是oracle所提供的用于操纵集合变量的内置函数或过程,其中exists,count,limit,first,next,prior,next是函数,而extend,trim,delete则是过程。集合调用语法如下:
collection_name.method_name[(parameters)]
注意,集合方法只能在PL/SQL语句中使用,而不能在SQL语句中使用。另外集合方法extend和trim只适用于嵌套表和varray,而不适用于索引表。
1--exists 用于确定集合元素是否存在
declare
type area_table_type is table of emp.ename%type;
area_table area_table_type;
begin
if area_table.exists(1) then
area_table(1):='tt';
else
dbms_output.put_line('必须初始化元素');
end if;
end;
注:嵌套表和VARRAY在引用前必须先初始化相应元素,而索引表可以直接在select语句中引用。
2--count的使用(统计元素总数)
如果集合元素存在数值,则统计结果会包含该元素,如果集合元素为NULL,则统计结果不含该元素。
declare
type area_table_type is table of emp.ename%type
index by binary_integer;
area_table area_table_type;
begin
area_table(-1):='tt';
area_table(3):='cc';
area_table(4):='gg';
dbms_output.put_line('集合元素总个数:'||area_table.count);
end;
3--limit的使用
(返回集合元素的最大个数)
该方法用于返回集合元素的最大个数。因为嵌套表和索引表的元素个数没有限制,所以调用该方法会返回NULL;而对于VARRAY来说,该方法会返回其所允许的最大元素个数。
declare
type area_table_type is varray(30) of emp.ename%type;
area_table area_table_type:=area_table_type('ff');
begin
dbms_output.put_line('集合元素的最大个数:'||area_table.limit);
end;
4--first和last的使用
first方法用于返回集合变量第一个元素的下标,而last方法用于返回集合变量最后一个元素的下标。
declare
type area_table_type is table of emp.ename%type
index by binary_integer;
area_table area_table_type;
begin
area_table(-1):='tt';
area_table(3):='cc';
area_table(4):='gg';
dbms_output.put_line('第一个元素:'||area_table.first);
dbms_output.put_line('最后一个元素:'||area_table.last);
end;
5--prior和next的使用
prior用于返回当前集合元素的前一个元素的下标,而next方法用于当前集合元素的后一个元素的下标。
declare
type area_table_type is table of emp.ename%type
index by binary_integer;
area_table area_table_type;
begin
area_table(-1):='tt';
area_table(3):='cc';
area_table(4):='gg';
dbms_output.put_line('元素3的前一个元素:'||area_table.prior(3));
dbms_output.put_line('元素3的下一个元素:'||area_table.next(3));
end;
6--extend 用于扩展集合变量的尺寸
,并为它们增加元素。该方法有extend,extend(n),extend(n,i)等三种调用格式,只适用于嵌套表和VARRAY。
其中:
extend用于为集合变量添加一个null元素;
extend(n)用于为集合变量添加n个null元素;
extend(n,i)用于为集合变量添加n个元素(元素值与第i个元素相同)
declare
type area_table_type is varray(20) of varchar2(20);
area_table area_table_type;
begin
area_table:=area_table_type('tt');
area_table.extend(5,1);
dbms_output.put_line('元素总个数:'||area_table.count);
end;
7--trim 裁剪元素
该方法用于从集合尾部删除元素,它有TRIM和TRIM(n)两种调用格式。其中:
trim用于从集合尾部删除一个元素;
trim(n)则用于从集合尾部删除n个元素。
注:该方法只适用于嵌套表和VARRAY。
declare
type area_table_type is table of varchar2(10);
area_table area_table_type;
begin
area_table:=area_table_type('a','a','a','a');
area_table.trim(2); --裁掉2个元素
dbms_output.put_line('元素总个数:'||area_table.count); --总个数2个
end;
8--delete 删掉某元素
该方法用于删除集合元素,但该方法只适用于嵌套表和索引表,而不适用于VARRAY。该方法有delete、delete(n)、delete(m,n)等三种调用格式。其中:
delete(n)用于删除集合变量的第n个元素;
delete(m,n)用于删除集合变量从m到n之间的所有元素。
declare
type area_table_type is table of emp.ename%type
index by binary_integer;
area_table area_table_type;
begin
area_table(-1):='tt';
area_table(3):='cc';
area_table(4):='gg';
area_table.delete(3); --删掉元素3
dbms_output.put_line('元素总个数:'||area_table.count); --总个数2
end;
集合赋值
9--将一个集合的数据赋值给另一个集合
DECLARE
TYPE name_varray_type IS VARRAY(4) OF VARCHAR2(10);
name_array1 name_varray_type;
name_array2 name_varray_type;
BEGIN
name_array1:=name_varray_type('SCOTT','SMITH');
name_array2:=name_varray_type('a','a','a','a');
dbms_output.put('name_array2的原数据:');
FOR i IN 1..name_array2.count LOOP
dbms_output.put(' '||name_array2(i));
END LOOP;
dbms_output.new_line;
name_array2:=name_array1;
dbms_output.put('name_array2的新数据:');
for i IN 1..name_array2.count LOOP
dbms_output.put(' '||name_array2(i));
END LOOP;
dbms_output.new_line;
END;
输出结果 name_array2的原数据:'a','a','a','a';
name_array2的新数据:'SCOTT','SMITH'
备注:当进行集合赋值时,源集合和目标集合的数据类型必须完全一致。如果集合元素数据类型一致,但集合类型不一致,也不能进行赋值。
如下错误的例子:
TYPE name_varray1_type IS VARRAY(4) OF VARCHAR2(10);
TYPE name_varray2_type IS VARRAY(4) OF VARCHAR2(10);
name_array1 name_varray1_type;
name_array2 name_varray2_type;
BEGIN
name_array1:=name_varray1_type('scott','smith');
name_array2:=name_array1;
END;
ERROR 位于第8行:
ORA-06550: 第8行第17列:
表达式类型错误
ORA-06550: 第8行第4列:
PL/SQL:Statement ignored
10--给集合赋NULL值
当需要清空集合变量的所有数据时,既可以使用集合方法delete和trim,也可以使用一个null集合变量赋值给目标集合变量。
DECLARE
TYPE name_varray_type IS VARRAY(4) OF VARCHAR2(10);
name_array name_varray_type;
name_empty name_varray_type;
BEGIN
name_array:=name_varray_type('SCOTT','SMITH');
dbms_output.put_line('name_array的原有元素个数:'||name_array.count);
name_array:=name_empty;
IF name_array IS NULL THEN
dbms_output.put_line('name_array的现有元素个数:0');
END IF;
END;
输出结果 name_array的原有元素个数:2
name_array的现有元素个数:0
--使用集合操作符给嵌套表赋值
11--使用set操作符
set操作符用于取消特定嵌套表中的重复值。
DECLARE
TYPE nt_table_type IS table OF number;
nt_table nt_table_type:=nt_table_type(2,4,3,1,2);
result nt_table_type;
BEGIN
result:=set(nt_table);
dbms_output.put('result:');
FOR i in 1..result.count LOOP
dbms_output.put_line(' '||result(i));
END LOOP;
dbms_output.new_line;
END;
result:
2
4
3
1
12--multiset union操作符的使用
(两个几何合并)
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_type;
BEGIN
result:=nt1 multiset union nt2;
dbms_output.put('result:');
FOR i in 1..result.count LOOP
dbms_output.put_line(' '||result(i));
END LOOP;
dbms_output.new_line;
END;
result:
1
2
3
3
4
5
13--multiset union distinct操作符的使用
(去掉合并后的重复值)
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_type;
BEGIN
result:=nt1 multiset union distinct nt2;
dbms_output.put('result:');
FOR i in 1..result.count LOOP
dbms_output.put_line(' '||result(i));
END LOOP;
dbms_output.new_line;
END;
result: 1
2
3
4
5
14--multiset intersect操作符的使用
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_type;
BEGIN
result:=nt1 multiset intersect nt2;
dbms_output.put('result:');
FOR i in 1..result.count LOOP
dbms_output.put_line(' '||result(i));
END LOOP;
dbms_output.new_line;
END;
result: 3
15--multiset except操作符的使用
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_type;
BEGIN
result:=nt1 multiset except nt2;
dbms_output.put('result:');
FOR i in 1..result.count LOOP
dbms_output.put_line(' '||result(i));
END LOOP;
dbms_output.new_line;
END;
result: 1 2(nt1表在nt2表中不存在的)
比较集合
在oracle10g之前,当使用嵌套表类型和varray类型的集合变量时,开发人员可以检测集合变量是否为null。从oracle10g开始,开发 人员还可以比较两个集合变量是否相同,另外还可以在嵌套表上使用cardinality,submultiset of,member of,is a set,isempty等集合操作符。其中
函数cardinality用于返回嵌套表变量的元素个数,操作符submultiset of用于检测特定数据是否为嵌套表元素,操作符is a set用于检测嵌套表是否包含重复的元素值,操作符is empty用于加你侧嵌套表是否为null。
16--检测集合是否为null
当编写复杂的pl/sql应用程序时,经常需要检测集合变量是否为null,在oracle10g之前,使用is null操作符检测嵌套表或varray是否为null。
DECLARE
TYPE name_array_type IS varray(3) OF varchar2(10);
name_array name_array_type;
BEGIN
IF name_array IS NULL THEN
dbms_output.put_line('name_array未初始化');
END IF;
END;
输出:name_array未初始化
oracle10g开始,当检测嵌套表是否为null时,不仅可以使用is null操作符,也可以使用 is empty操作符。注意,is empty操作符只适用于嵌套表,而不适用于varray。
TYPE name_table_type IS TABLE OF varchar2(10);
name_table name_table_type;
BEGIN
IF name_table IS empty THEN
dbms_output.put_line('name_table未初始化');
END IF;
END;
问题:没有输出结果,奇怪?
17--比较嵌套表是否相同
在oracle10g之前,不能直接比较两个嵌套表是否相同。但从oracle10g开始,允许使用比较操作符=和!=检测两个嵌套表变量是否相同。注意,使用这两个比较符只能比较嵌套表,不能比较varray和索引表。
DECLARE
TYPE nt_table_type IS table OF varchar2(10);
nt1 nt_table_type;
nt2 nt_table_type;
BEGIN
nt1:=nt_table_type('scott');
nt2:=nt_table_type('smith');
IF nt1=nt2 THEN
dbms_output.put_line('两个嵌套表完全相同');
else
dbms_output.put_line('两个嵌套表值不同');
END IF;
END;
输出结果:两个嵌套表值不同
18--在嵌套表上使用集合操作符
从oracle10g开始,开发人员可以在嵌套表上使用ANSI集合操作符CARDINALITY,MEMBEROF,IS A SET。注意,这些操作符只适用于嵌套表,不适用于varray和索引表。
19--使用cardinality
(返回嵌套表变量的元素个数)
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3,1);
BEGIN
dbms_output.put_line('元素个数:'||cardinality(nt1));
END;
元素个数:4
20--SUBMULTISET OF
用于确定一个嵌套表是否是另一个嵌套表的子集
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(1,2,3,4);
BEGIN
IF nt1 SUBMULTISET OF nt2 THEN
dbms_output.put_line('nt1是nt2的子集');
END IF;
END;
nt1是nt2的子集
21--MEMBER OF
检测特定数据是否是嵌套表的元素
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
v1 NUMBER:=&V1;
BEGIN
IF v1 MEMBER OF nt1 THEN
dbms_output.put_line('v1是nt1的元素');
END IF;
END;
输入的值:1
v1是nt1的元素
22--IS A SET
检测嵌套表是否包含重复的元素值
DECLARE
TYPE nt_table_type IS table OF number;
nt1 nt_table_type:=nt_table_type(1,2,3);
BEGIN
IF nt1 IS A SET THEN
dbms_output.put_line('嵌套表nt1无重复值');
END IF;
END;
嵌套表nt1无重复值
2010年12月2日 补充
对于index_by 不存在的元素
index_by表中的元素i如果不存在,实际上会创建一个元素i,类似于对表的insert 操作;对元素的引用类似于select操作。但是,如果元素i还没创建就被引用,pl\
sql会报错,提示“ORA-1403:no data found ”。如下语句:
DECLARE
TYPE NumberTab IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
v_Numbers NumberTab;
BEGIN
FOR v_count IN 1..10 LOOP
v_Numbers(v_count) := v_count * 10;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Table elements: ');
FOR v_count IN 1..10 LOOP
DBMS_OUTPUT.put_line('v_Numbers('||v_count||'): ' ||v_numbers(v_count));
END LOOP;
BEGIN
DBMS_OUTPUT.put_line('v_numbers(11): '|| v_numbers(11));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('No data found reading v_numbers(11)!');
END;
END;
输出结果如下:
Table elements:
v_Numbers(1): 10
v_Numbers(2): 20
v_Numbers(3): 30
v_Numbers(4): 40
v_Numbers(5): 50
v_Numbers(6): 60
v_Numbers(7): 70
v_Numbers(8): 80
v_Numbers(9): 90
v_Numbers(10): 100
No data found reading v_numbers(11)!
发表评论
-
ORACLE 中ROWNUM
2012-02-03 11:16 825对于 Oracle 的 rownum 问题,很多资料都说不 ... -
timesten内存数据库
2011-11-10 14:18 3285为什么现在内存型数据 ... -
oracle(集合类型)
2011-07-08 18:47 1078http://blog.sina.com.cn/s/blog_ ... -
PL/SQL Developer 设置快捷键
2011-06-20 11:47 10381、登录后默认自动选中My Objects 默认 ... -
PD常用设置和快捷键
2011-06-15 16:37 2214最近用powerDesinger ... -
PL/SQL Developer 使用技巧
2011-02-17 12:32 988http://hi.baidu.com/chssheng200 ... -
ASCII码对应表
2010-10-19 20:15 1550chr(9) tab空格 chr(10) 换行 chr(13) ... -
oracle的to_char
2010-08-20 15:02 991The following are number exam ... -
Oracle系列:Cursor
2010-07-29 17:28 9441,什么是游标? ... -
oracle job 和它的时间设置
2010-07-29 17:27 1248描述 INTERVAL参 ... -
oracle字符替换
2010-06-24 20:16 3282select REGEXP_REPLACE( 'AB ... -
update机制
2010-05-22 04:56 972就 oracle 而言 update 的时候,如果存在索引字 ... -
oracle commit
2010-05-21 09:40 1840http://blog.csdn.net/knowhow/ ... -
Oracle中的二进制、八进制、十进制、十六进制相互转换函数
2010-05-13 12:41 4501CREATE OR REPLACE PACKAGE pkg_n ... -
oracle相关知识
2010-04-28 00:16 10221.曾经不小心把开发库的数据库表全部删除,当时吓的要死。结果找 ... -
index rebuild online
2010-04-23 16:30 1304SQL> select segment_name ,se ... -
Oracle优化器Optimizer
2010-04-23 14:13 842Oracle在执行一个SQL之前, ... -
改变表空间的大小
2010-04-20 15:13 1132方法 : 如果你想把 aa.dbf 这个数据文件给缩小。 ... -
oracle的锁详解
2010-04-19 10:36 1639Oracle 多粒度锁机制介绍 根据保护对象的不同, ... -
latch的理解
2010-04-19 10:25 7781.shared pool latch和library c ...
相关推荐
PL/SQL软件包是一组相关的过程和函数的集合,它可以用来组织和管理程序。软件包由两部分组成,说明部分和包体部分,分别用于声明公共接口和实现逻辑。 异常处理在PL/SQL中用来处理程序运行时发生的错误。PL/SQL预定...
3. **集合和游标**:集合是PL/SQL中处理多行数据的有效工具,如VARRAYs(固定大小数组)和associative arrays(关联数组)。游标则允许我们一行一行地处理查询结果,是处理动态数据的重要手段。 4. **存储过程和...
4. **集合**:PL/SQL支持数组和记录等集合类型,允许存储多个同类型的数据项。 5. **游标**:游标是处理查询结果集的一种方式,可以逐行访问SELECT语句返回的结果。这对于迭代处理大量数据非常有用。 6. **存储...
### PL/SQL 集合相关知识点详解 #### 一、概述 在PL/SQL中,集合(Collections)是一类非常重要的数据结构,用于存储多个相同类型的数据元素。这些元素可以是基本数据类型如`NUMBER`、`VARCHAR2`等,也可以是复杂...
《PL/SQL经典开发手册》是一本专注于Oracle数据库编程语言PL/SQL的指南。PL/SQL结合了SQL的查询功能和过程语言的控制结构,提供了一种强大的方式来管理和操作数据库。它支持多种数据类型,包括大对象和集合类型,...
- Bulk Collect允许高效地将数据库结果集批量收集到PL/SQL集合中,提高性能。 12. **与SQL的交互** - PL/SQL可以直接执行DML(INSERT、UPDATE、DELETE)和DDL(CREATE、ALTER、DROP)语句,也可以使用动态SQL执行...
变量的声明和赋值是PL/SQL程序的基础。 3. **流程控制语句**: 包括条件语句(IF-THEN-ELSIF-ELSE)、循环语句(WHILE,FOR),以及CASE语句。这些语句允许根据特定条件执行不同的代码块。 4. **PL/SQL块**: 有...
3. **表达式**:PL/SQL中的表达式用于计算和返回值,可以包含算术、比较和逻辑运算符。 4. **PL/SQL程序块结构**:程序块由声明部分、执行部分和异常处理部分组成,通常包含BEGIN、END关键字,可以嵌套和组合以实现...
PL/SQL提供了集合和表数据类型,允许开发者存储多个同类型的数据项。这些数据结构在处理复杂的数据操作时非常有效。 ### 结论 Oracle 11g PL/SQL为开发者提供了一个强大且功能全面的工具箱,使得数据库编程变得...
- **变量与常量**:在PL/SQL中,我们可以声明变量和常量来存储数据,变量用于存储可变数据,常量则一旦赋值不可更改。 - **数据类型**:包括数值型(如NUMBER)、字符串型(如VARCHAR2)、日期型(如DATE)以及...
Oracle PL/SQL是一种强大的编程语言,它将关系数据库管理系统的SQL查询能力与过程式编程语言的灵活性结合起来。在Oracle数据库环境中,PL/SQL是开发存储过程、触发器、函数、包等数据库对象的关键工具,极大地提高了...
5. **集合类型**:PL/SQL提供了数组(VARRAYs)和关联数组(INDEX BY TABLES),以及集合操作如索引、迭代和成员关系测试。 6. **游标**:游标用于处理查询结果集,允许逐行处理数据,通常与FOR循环结合使用。 7. ...
对于初学者,掌握PL/SQL语法和PL/SQL Developer的使用方法,是进入Oracle数据库开发领域的基础。而对于有经验的开发者,这款工具的强大功能和易用性,能够提升他们的工作效率,使得数据库管理和开发更加得心应手。
在PL/SQL中,基本的编程元素包括变量声明、赋值、条件语句(如IF-THEN-ELSIF-ELSE)、循环(如FOR、WHILE)、异常处理(如BEGIN-EXCEPTION-END块)以及存储过程和函数的定义。存储过程和函数是可重用的代码段,它们...
PL/SQL,全称为Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它将SQL语句与过程式编程语言结合在一起,为数据库管理、数据处理和应用程序开发提供了强大的工具。本文将深入探讨PL/SQL...
- **集合**:PL/SQL提供了多种集合类型,如TABLE和VARRAY,用于存储多个同类型的数据项。 #### 八、过程与函数 PL/SQL支持创建自定义的过程和函数,可以在数据库中封装复杂数字逻辑,提高代码的重用性和维护性。 #...
10. **游标表达式和集合**:PL/SQL中的集合数据类型和游标表达式可以处理大量数据。 11. **PL/SQL的调试和性能分析**:如何利用Oracle提供的工具进行PL/SQL代码的调试和性能优化。 这本书通过详细的讲解和实例,...
5. **集合和索引表**:PL/SQL提供了数组和关联数组(VARRAYs)作为集合类型,以及索引-by表,它们允许一次性处理多条数据。 6. **游标**:游标用于逐行处理查询结果,是处理数据库记录的一种常见方式。它可以用于...
6. **存储过程与函数**:存储过程是预编译的PL/SQL代码集合,用于执行特定任务。函数则返回一个值,可以作为表达式的一部分使用。它们提高了代码的重用性和性能。 7. **异常处理**:通过BEGIN...EXCEPTION部分,...