Oracle 内存表的使用方法总结

一个应用场景:

假设有一个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




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值