`
winie
  • 浏览: 216926 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

内存表

阅读更多

内存表
我们知道, oracle, sqlserver等关系数据库最善于处理的数据类型是集合, 而不是单独的记录. 同样的100条记录, 如果逐条循环处理和批量处理其效率的差别将是几何单位的.

所以, 为了提高查询效率, 我们这里考虑将给定的客户字符串转变为一个集合或者临时表来处理. Oracle使用全局临时表和复杂数据类型集合来支持这一点.

这里我们介绍一下使用复杂数据类型集合来处理的方式.

首先我们定义一个复杂类型.

create or replace type ctl.type_jax_varc2tab is table of varchar2(2000);

然后定义一个函数实现将给定的字符串转换为嵌套内存表.

CREATE OR REPLACE FUNCTION f_jax_str2tab(p_str IN VARCHAR2,
p_sep varchar2 default ','
) RETURN ctl.type_jax_varc2tab IS
  /******************************************************************
  Ver1.0 Created by jaxzhang on 2009-06-08
  把字符串(1*2*3*4*5)转换为内存表形式
  create or replace type type_jax_varc2tab is table of varchar2(2000);
  测试用例:SELECT * FROM TABLE(f_jax_str2tab('1*2*3*4*5','*'));
  ******************************************************************/
  v_str varchar2(2000);
  v_cnt NUMBER ;
  v_numtab type_jax_varc2tab := type_jax_varc2tab(); --返回内存表
BEGIN
  select decode(substr(p_str,-1),p_sep,p_str,p_str || p_sep) into v_str from dual;
  select  length(v_str) - length(REPLACE(v_str, p_sep)) into v_cnt from dual;

  FOR i IN 1 .. v_cnt LOOP
    v_numtab.EXTEND;
    v_numtab(i) := substr(v_str, 1, instr(v_str, p_sep) - 1);
    v_str := substr(v_str, instr(v_str,p_sep) + 1);
  END LOOP;

  RETURN v_numtab;
EXCEPTION
  WHEN OTHERS THEN
    v_numtab.DELETE;
END;
上述函数的功能就是要将类似于’客户1,客户2,客户3’的字符串转换为如下形式.

SELECT * FROM TABLE(f_jax_str2tab('客户1,客户2,客户3',','));

COLUMN_VALUE
 
客户1
 
客户2
 
客户3
 

得到上述的内存表之后, 我们就可以使用类似于一个表或者视图的方式来与正式表t_order_cust关联得到我们需要的查询结果.

Select /*+ ordered use_nl(a b)*/

  From TABLE(f_jax_str2tab('客户1,客户2,客户3',',')) a,

        T_order_cust b

   Where b.o_customer = a.column_value

 



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/47522341/archive/2009/06/10/4257755.aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics