(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'));