备注:此两种方案,都因为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    );

Oracle a Parameter with multi value的更多相关文章

  1. [转]Oracle Hidden Parameter:_allow_resetlogs_corruption

    本文转自eygle博客,原文地址:http://www.eygle.com/archives/2005/10/oracle_hidden_allow_resetlogs_corruption.html ...

  2. oracle db shutdown immediate–multi Instance

    [oracle@redhat4 ~]$ sqlplus / as sysdba@orcl SQL*Plus: Release 11.2.0.1.0 Production on Tue Oct 6 21 ...

  3. linux下单节点oracle数据库间ogg搭建

    环境说明:   linux为Linux 2.6.32-573.el6.x86_64     oracle为 11g Enterprise Edition Release 11.2.0.1.0 - 64 ...

  4. 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务

    使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...

  5. Oracle连接数过多释放机制

    Oracle连接数过多释放机制  sqlplus /nolog   打开sqlplus          connect /as sysdba    使用具有dba权限得用户登陆oracle      ...

  6. Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration

    Installing and setting up Oracle GoldenGate connecting to an Oracle database Also please make sure t ...

  7. ORACLE数据库学习之体系结构

     Oracle体系结构 ORACLE数据库体系结构决定了oracle如何使用网络.磁盘和内存.包括实例(instance),文件(file)和进程(process不包括后台进程)三部分. 实例:每 ...

  8. Oracle 11g 单实例到单实例OGG同步实施文档-OGG initial load

    Oracle 11g 单实例到单实例OGG同步实施文档-OGG initial load 2018-06-07 00:514730原创GoldenGate 作者: leo 本文链接:https://w ...

  9. Oracle 11g 单实例到单实例OGG同步实施文档-RMAN 初始化

    Oracle 11g 单实例到单实例OGG同步实施文档-RMAN 初始化 2018-06-07 13:455170原创GoldenGate 作者: leo 本文链接:https://www.cndba ...

随机推荐

  1. SubSonic3.0插件分页查询速度测试

    使用SubSonic3.0一段时间了,一直都想找机会测试一下各种查询分页速度,对比一下插件的查询效率到底怎么样,所以昨天写好了测试程序,准备好1K.1W.10W.50W和100W记录的数据表,早上详细 ...

  2. Rust初步(三):使用atom搭配racer进行rust编程

    在rust.cc社区中有一个关于rust编辑器的讨论(话说很多人要学一个新语言,都会立即考虑编辑器的问题,包括我在内),主要关注的是,智能提示(这个真的太重要了).大家讨论下来有几个选择 1. ecl ...

  3. android 伸缩控件ExpandableListView 展开失败的可能原因。

    (原创)转载请声明出处http://www.cnblogs.com/linguanh/ 问题原型: ExpandableListView 展开失效. --------------------直接看结论 ...

  4. ZOJ Problem Set - 1048 Financial Management

    我承认这是一道水的不能再水的题,今天一下就做到了,还是无耻的帖上来吧 #include <stdio.h> int main() { double sum=0; for(int i=1;i ...

  5. 使用Oracle调度程序自动完成任务

    1. 创建作业.计划和时间表 2. 创建轻量级作业 3. 使用作业链执行一系列相关任务 4. 创建窗口和作业类 5. 使用高级调度程序概念确定作业优先顺序 Reference 实验演示准备: --业务 ...

  6. MySQL入门01-MySQL源码安装

    操作系统:CentOS 6.7 MySQL版本:5.6.30 1.前期准备 2.系统配置 3.CMake编译配置 4.make && make install 5.后期配置和测试 Re ...

  7. java操作数据库增删改查的小工具1--TxQueryRunner

    在java程序中,一般使用jdbc连接数据库,比较麻烦,在看传智教程时学了一个工具类,用于简化与数据库之间的操作步骤,就是TxQueryRunner,他是QueryRunner的子类,用起来和他是一样 ...

  8. Circuit Breaker Pattern(断路器模式)

    Handle faults that may take a variable amount of time to rectify when connecting to a remote service ...

  9. VS2013常用快捷键

    Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代码管控工具.集成开发环境(IDE)等等.VS 2013 中新增了很多提高 ...

  10. DDL/DML是什么?

    DDL:(Data Definition Language)数据库定义语言 它是定义数据库的语言, 里面包含: CREATE ALTER DROP TRUNCATE COMMENT RENAME DM ...