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,6'));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值