备注:此两种方案,都因为oracle内部字符函数的参数长度4000限制。
另外,个人测试,性能不如”将数据插入物理表再JOIN查询“或”每1000次ID做一次IN查询“的总的运行速度。
即ID的个数越多,这两种方案的总的运行效率越不好(总的耗时越多)。 

Solution 1: Use oracle Regex

select t1.field_01,t1.field_02

from t_XXX t1

where Exists

(

select 1 from

(

SELECT TRIM(REGEXP_SUBSTR (:v_id_list, '[^,]+', 1,rownum)) as ID

FROM DUAL

CONNECT BY ROWNUM <= LENGTH (:v_id_list) - LENGTH (REPLACE (:v_id_list, ',','')) + 1

)  tmp

where t1.ID= tmp.ID

);

------------------------------------------------------------------------------------------------------------

Solution 2: Use record type

Step1: create record type:

create or replace typemyTableType as table of varchar2 (32767);

----------------------------------------------

Step2:Create function that it convert string to datatable.

Create and replace function var_list(p_string in varchar2 ) return myTableType

as

l_string       long default p_string || ',';

l_data         myTableType := myTableType();

n              number;

begin

loop

exit whenl_string is null;

n := instr(l_string, ',' );

l_data.extend;

l_data(l_data.count) :=

ltrim( rtrim( substr( l_string, 1, n-1 ) ) );

l_string :=substr( l_string, n+1 );

end loop;

return l_data;

end;

----------------------------------------------

Step3: test example

select *

from THE

(

select cast( var_list('abc, xyz, 012') as

mytableType )from dual

) a

------------------------------------------------------

Step4: I Use in code, sql format

Note: :v_id_list’svalue is like :value_1,value_2,..,value_n. and n<=1000

select field_xxx01, t1.field_xxx02

from t_xxxx t1

where Exists

(

select 1 from THE

(

select cast( var_list(:v_id_list) as  --select cast( in_list('abc, xyz, 012') as

mytableType ) from dual

)  t2

where t1.field_ID = t2.COLUMN_VALUE

);

------------------------------------------------------ 
create or replace procedure p_getData_byMultiValue
(
   v_id_list in varchar2,
   v_cursor out sys_refcursor
)
is
begin  /* 
  open v_cursor  
  select *
    from THE
    (
             select cast( in_list(v_id_list) as  -- select cast( in_list('abc, xyz, 012') as
                              mytableType ) from dual 
    ) a; */      open v_cursor

  select *
    from T1     where Exists      (          select 1 from  
        (
             select cast( in_list(v_id_list) as  -- select cast( in_list('abc, xyz, 012') as
                              mytableType ) from dual 
         )  t2          where t1.ID = t2.COLUMN_VALUE    );

最新文章

  1. Java基础知识笔记(二:泛型和枚举)
  2. CSS易混淆知识点总结与分享-定位与布局
  3. ecshop适应PHP7的修改
  4. Objective-C 链式语法的实现
  5. Effective C++ -----条款16:成对使用new和delete时要采取相同形式
  6. ubuntu 下创建桌面快捷方式
  7. Sublime Text : 创建工程
  8. 论APP测试中黑盒测试方案的重要性?
  9. How do I place a group of functions or variables in a specific section?
  10. Web前端开发:SQL Jsp小项目(一)
  11. Linux江湖01:玩转Linux系统的方法论 (转载)
  12. linux 第三天11讲
  13. 技巧集:nginx作代理时,查看请求被转发到哪台服务器
  14. Linux学习之head命令
  15. 读取IOS的相应路径
  16. Oracle 的一张表没有主键,如何映射Hibernate
  17. 逆序一个8bit的2进制数
  18. WebService中的WSDL详解 及jmeter测试
  19. HashMap HashTable和ConcurrentHashMap的区别
  20. jupyter notebook + frp 实现内容穿透

热门文章

  1. 前端学PHP之面向对象系列第二篇——魔术方法
  2. 比较一下以&ldquo;反射&rdquo;和&ldquo;表达式&rdquo;执行方法的性能差异
  3. 在Linux中运行Nancy应用程序
  4. iOS开发之版本控制(SVN)
  5. Wave - 花たん 音乐
  6. 深入理解javascript原型和闭包系列
  7. webpack+vue-cli项目打包技巧
  8. 使用VS Code开发调试.NET Core 多项目
  9. Android源码编译make的错误处理
  10. C#-Socket监听消息处理