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

内存表使用

一、 内存表概念
1、PL/SQL表类似于C语言中的数组。如果要声明一个PL/SQL表,要先定义该表类型,然后在声明属于该类型的变量。
2、理论上,数据库数据空间有多大,我们的内存表就可以存储多大的数据,就是说他和我们的物理表是相同的,我们可以把物理表的数据完全拷贝到内存表中。
3、PL/SQL表的元素没有必要按照特定的次序排列,因为他们不是象数组那样连续存储在内存中,元素可以按照任意键值进行插入。
4、PL/SQL表的键值(KEY)没有必要是顺序的。表所占用的内存并不依赖于键所使用的数值。


二、 表的属性
count:返回PL/SQL表中行的当前数目。
delete:删除表中的行。
exists:如果指定的表项在表中存在那么返回ture。
first:返回表中第一行的索引。
last:返回表中最后一行的索引。
next:返回表中指定行的下一行的索引。
prior:返回表中指定行的上一行的索引。


三、案例

-- Created : 8/16/2012 3:00:03 PM
-- Purpose : 内存表使用

--1.建立表类型

CREATE OR REPLACE TYPE ty_obj IS OBJECT ( p_empno?? VARCHAR2 (50)
??????????????????????????????????????? , p_ename?? VARCHAR2 (50)
??????????????????????????????????????? , job?????? VARCHAR2 (50)
??????????????????????????????????????? );
???????????????????????????????????????
--2.建立数组
CREATE OR REPLACE TYPE ty_objtab IS TABLE OF ty_obj;

--3.建立函数

CREATE OR REPLACE FUNCTION func_info RETURN ty_objtab
IS
??? v_ty_objtab ty_objtab := ty_objtab(); --返回内存表
BEGIN
??? FOR cur IN (SELECT * FROM emp) LOOP
??????? v_ty_objtab.extend;
??????? v_ty_objtab(v_ty_objtab.count) := ty_obj(cur.empno,cur.ename,cur.job);
??? END LOOP;
???
? RETURN v_ty_objtab;
?
END func_info;
--4.测试1
--查询出所有结果
SELECT * FROM TABLE(func_info);
--查询出部分结果
DECLARE
??? vtab ty_objtab;
BEGIN
??? vtab := func_info;
??? dbms_output.put_line(vtab(1).p_empno);
END;
--查询结果行数
DECLARE
??? vtab ty_objtab;
BEGIN
??? vtab := func_info;
??? dbms_output.put_line(vtab.count);
END;
--综合操作
DECLARE
??? vtab ty_objtab;
BEGIN
??? vtab := func_info;
??? FOR i IN 1..vtab.count LOOP
??????? --修改内存表中数据
??????? vtab(i).p_ename := vtab(i).p_ename || 'mm';
??????? --读取内存表中数据
??????? dbms_output.put_line(vtab(i).p_ename);
??????? --测试表明 操作成功
??? END LOOP;
END;