oracle将逗号分割的字符串转换成table类型

(1)分隔字符串

-- p_str 是要分隔的字符串,如:'1,2,3,4,5'

select regexp_substr(p_str,'[^,]+', 1, level) as part_str from dual
connect by regexp_substr(p_str,'[^,]+', 1, level) is not null 

(2)依次获取每行的数据

-- c_pos不用提前定义,c_pos这个名字也可以随意换。
-- 这个写法用隐式游标来遍历数据。

for c_pos in
(
  select * from 表名
)
loop   
  -- 要做的操作
end loop;

(3)添加数据

-- 事先定义table类型
CREATE OR REPLACE TYPE t_table_str AS TABLE OF VARCHAR2(4000)

-- 定义变量并初始化
v_table t_table_str;
v_table := t_table_str();

-- extend用来开辟空间,part_str是刚才自定义的字段名
v_table.extend(1);
v_table(v_table.count) := c_pos.part_str;

(4)完整代码

CREATE OR REPLACE TYPE t_table_str AS TABLE OF VARCHAR2(4000)
create or replace function func_str_to_table(p_str varchar2)
  return t_table_str
  -- 将以逗号分隔的字符串,转换成table
is
  v_table t_table_str;
begin
  v_table := t_table_str();
  for c_pos in
  (
    select regexp_substr(p_str,'[^,]+', 1, level) as part_str from dual
    connect by regexp_substr(p_str,'[^,]+', 1, level) is not null 
  )
  loop
    v_table.extend(1);
    v_table(v_table.count) := c_pos.part_str;
  end loop;
  RETURN v_table;
end;

另附:

create or replace function func_str_to_table2(p_str varchar2,p_split varchar2)
  return t_table_str
  -- 将以指定分隔符分隔的字符串,转换成table
is
  v_table t_table_str;
begin
  v_table := t_table_str();
  for c_pos in
  (
    select regexp_substr(p_str,'[^'||p_split||']+', 1, level) as part_str from dual
    connect by regexp_substr(p_str,'[^'||p_split||']+', 1, level) is not null 
  )
  loop
    v_table.extend(1);
    v_table(v_table.count) := c_pos.part_str;
  end loop;
  RETURN v_table;
end;

(5)测试

select * from test_in;

select * from test_in
where id in (select * from func_str_to_table('1,2,3'));

扫描二维码关注公众号,回复: 11552510 查看本文章

猜你喜欢

转载自blog.csdn.net/u013595395/article/details/107693233