如何在oracle中将csv转换为表

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)


APC*_*APC 5

唉,在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博客上找到一些代码的变体.


Sha*_*esh 5

这是另一个完全在 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)