一个应用场景:
假设有一个1000万条记录的游标(多个表格,多个schema join在一起的一个游标),需要在此之上进行多项复杂的计算,如果重复打开该游标相当费时,可以只打开一次游标,然后内存表暂存数据,然后在内存表上进行处理。
内存表概念
1、PL/SQL表类似于C语言中的数组。如果要声明一个PL/SQL表,要先定义该表类型,然后在声明属于该类型的变量。2、理论上,数据库数据空间有多大,我们的内存表就可以存储多大的数据,就是说他和我们的物理表是相同的,我们可以把物理表的数据完全拷贝到内存表中。
3、PL/SQL表的元素没有必要按照特定的次序排列,因为他们不是象数组那样连续存储在内存中,元素可以按照任意键值进行插入。
4、PL/SQL表的键值(KEY)没有必要是顺序的。表所占用的内存并不依赖于键所使用的数值。
-- 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;
转载自: http://www.itpub.net/forum.php?mod=viewthread&tid=1707128