Meh*_*hur 10 csv string oracle plsql tokenize
在csv值中传递时,如何创建以表格格式返回结果的包.
select * from table(schema.mypackage.myfunction('one, two, three'))
Run Code Online (Sandbox Code Playgroud)
应该回来
one
two
three
Run Code Online (Sandbox Code Playgroud)
我试过问汤姆但是只适用于sql类型.
我正在使用oracle 11g.内置有什么东西吗?
jos*_*989 13
以下作品将其作为select*from table(splitter('a,b,c,d'))调用
create or replace function splitter(p_str in varchar2) return sys.odcivarchar2list
is
v_tab sys.odcivarchar2list:=new sys.odcivarchar2list();
begin
with cte as (select level ind from dual
connect by
level <=regexp_count(p_str,',') +1
)
select regexp_substr(p_str,'[^,]+',1,ind)
bulk collect into v_tab
from cte;
return v_tab;
end;
/
Run Code Online (Sandbox Code Playgroud)
唉,在11g中我们仍然需要使用SQL类型来处理我们自己的PL/SQL标记器.在11gR2中,Oracle为我们提供了一个聚合函数,用于将结果连接成CSV字符串,因此在12i中它们可以提供反向功能.
如果你不希望创建一个SQL类型特别是你可以使用内置的SYS.DBMS_DEBUG_VC2COLL,就像这样:
create or replace function string_tokenizer
(p_string in varchar2
, p_separator in varchar2 := ',')
return sys.dbms_debug_vc2coll
is
return_value SYS.DBMS_DEBUG_VC2COLL;
pattern varchar2(250);
begin
pattern := '[^('''||p_separator||''')]+' ;
select trim(regexp_substr (p_string, pattern, 1, level)) token
bulk collect into return_value
from dual
where regexp_substr (p_string, pattern, 1, level) is not null
connect by regexp_instr (p_string, pattern, 1, level) > 0;
return return_value;
end string_tokenizer;
/
Run Code Online (Sandbox Code Playgroud)
这是在行动:
SQL> select * from table (string_tokenizer('one, two, three'))
2 /
COLUMN_VALUE
----------------------------------------------------------------
one
two
three
SQL>
Run Code Online (Sandbox Code Playgroud)
致谢:此代码是我在Tanel Poder博客上找到的一些代码的变体.
这是另一个完全在 sql 中使用正则表达式匹配器的解决方案。
SELECT regexp_substr('one,two,three','[^,]+', 1, level) abc
FROM dual
CONNECT BY regexp_substr('one,two,three', '[^,]+', 1, level) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14579 次 |
| 最近记录: |