使用内存表table()和connect by level 处理 一行多条数据显示问题

 一行多条数据显示问题比如:check_value varchar2(4000)  values('1240,1110,1207,1134,1148,1184,10386')

想把这行该列的数据作为参数给SQL语句

 

select *

from a

where value in( check_value);

 

核心代码:

select substr
(
   pi_column,
   instr(','||pi_column,',',1,level),
   instr(pi_column||',',',',1,level)-instr(','||pi_column,',',1,level)
) a
from dual
connect by level<=length(pi_column)-length(replace(pi_column,','))+1;

 

用游标 open r_cur for   上面代码

 

然后 提取到字符数组中

     FETCH r_cur bulk collect into lv_sql;

 

数组声明和初始化:

     lv_sql type_array := type_array();

 

数组类型:

     create or replace type type_array as table of varchar2(50)

 

整个函数代码:

create or replace function f_etl_proc(pi_column in varchar2) return type_array is

  lv_sql type_array := type_array();
  r_cur   sys_Refcursor;
begin

open r_cur for
                  select substr
                  (
                         pi_column,
                         instr(','||pi_column,',',1,level),
                        instr(pi_column||',',',',1,level)-instr(','||pi_column,',',1,level)
                   ) a
              from dual
              connect by level<=length(pi_column)-length(replace(pi_column,','))+1;

   FETCH r_cur bulk collect into lv_sql;

   return(lv_sql);
end f_etl_proc; 

 

返回的对象数组还不能被使用需要TABLE()来处理

select *
 from table (select f_etl_proc(check_value)
                              from etl_condition
                             where condition_id = 2)

 

最后

select *

from a

where value in( select *
                          from table (select f_etl_proc(check_value)
                                            from etl_condition
                                           where condition_id = 2

                                         )

);

你可能感兴趣的:(sql,function,table)