日期:2014-05-16  浏览次数:20399 次

索引表

1、索引表
??索引表的机制实现不同于数组,pl/sql的索引表实现类似于数据库中的表,它有两列:key与value. key的类型是binary_integer,而value的类型是is table of data_type中的data_type指定的数据类型.


2、索引表的一些特性:
?索引表是将数据保存在内存中
?索引表是不受约束的,最大值是binary_integer的取值范围
?pl/sql索引表的元素没有必要按照特定的次序排序,元素可以按照任意键进行插入
?pl/sql索引表使用键(key)没有必要是顺序的,所有binary_integer数据或表达式都可以作用表的索引

?索引表的下标可以为负


3、索引表语法
?-- 定义记录集
??TYPE yang_rec IS RECORD( ename varchar2(30), eid NUMBER );
?-- 定义索引表类型
??TYPE yang_tab IS TABLE OF yang_rec INDEX BY BINARY_INTEGER;
?-- 定义索引表对象的实例
??test_tab yang_tab;

索引表的数据类型也可以是简单数据类型(varchar2 ,number等)


4、将条目插入到索引表中
?索引表中的每个元素都由一个唯一的整型值(索引)标识。引用表中的值时,必须提供该值的索引。
?索引的范围:1 ---- 2147483647,索引值可以不连续,同时PL/SQL并不为没有使用的条目预留空间。
?例如:


DECLARE
 		CURSOR all_emps IS
 				SELECT * FROM employee
 				 ORDER BY emp_id;
 		TYPE emp_table IS TABLE OF employee%ROWTYPE INDEX BY BINARY_INTEGER;
 		emps     emp_table;
 		emps_max BINARY_INTEGER;
 BEGIN
 		emps_max := 0;
 		FOR emp IN all_emps
 		LOOP
 				emps_max := emps_max + 1;
 				emps(emps_max).emp_id := emp.emp_id;
 				emps(emps_max).emp_name := emp.emp_name;
 		END LOOP;
 END;

? 对索引表中进行操作
?1) 插入:见上例。
?2) 引用:
??IF emps.EXIST(10) THEN
??DBMS_OUTPUT.PUT_LINE('存在第10条记录。');
??END IF;
?3) 修改:
?修改emps 表中的第100个条目:
??emps(100).emp_name := 'yang linker';
?4) 删除:
?-- 删除emps 表中的第100个条目:
??emps.DELETE(100);
?-- 删除emps 表中的从1到100的条目:
??emps.DELETE(1, 100);
?-- 删除emps 表中的的所有条目:
??emps.DELETE;


5、索引表中的函数
?1) count:返回表的条目数量:
??num_rows := emps.COUNT;
?2) EXISTS:如果指定的条目存在,则返回为真;否则为假。
??IF emps.EXIST(10) THEN
??DBMS_OUTPUT.PUT_LINE('存在第10条记录。');
??END IF;
?3) LIMIT:该方法返回集合可以包含的最大元素数目。只有变长数组才有上限。将LIMIT 用于嵌套表和索引
?表时,其返回为NULL。
?4) FRIST:该方法返回集合中使用的最小的索引值。
?5) LAST:该方法返回集合中使用的最大的索引值。
?6) NEXT:该方法返回集合中当前使用的下一个索引值。
?7) PRIOR:该方