为了账号安全,请及时绑定邮箱和手机立即绑定

如何在oracle 9i中最佳拆分csv字符串

如何在oracle 9i中最佳拆分csv字符串

侃侃无极 2019-12-04 13:17:55
我希望能够在Oracle 9i中拆分csv字符串我已阅读以下文章 http://www.oappssurd.com/2009/03/string-split-in-oracle.html但我不知道如何使这项工作。这是我有关的一些问题如果没有的话,这在Oracle 9i中行得通吗,为什么不呢?是否有比上面介绍的解决方案更好的拆分csv字符串的方法?我需要创建一个新类型吗?如果是这样,我是否需要特定特权?我可以在函数中声明w /类型吗?
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

这是Oracle的字符串令牌生成器,它比该页面要简单一些,但不知道它是否这么快:


create or replace function splitter_count(str in varchar2, delim in char) return int as

val int;

begin

  val := length(replace(str, delim, delim || ' '));

  return val - length(str); 

end;


create type token_list is varray(100) of varchar2(200);


CREATE or replace function tokenize (str varchar2, delim char) return token_list as

ret token_list;

target int;

i int;

this_delim int;

last_delim int;

BEGIN

  ret := token_list();

  i := 1;

  last_delim := 0;

  target := splitter_count(str, delim);

  while i <= target

  loop

    ret.extend();

    this_delim := instr(str, delim, 1, i);

    ret(i):= substr(str, last_delim + 1, this_delim - last_delim -1);

    i := i + 1;

    last_delim := this_delim;

  end loop;

  ret.extend();

  ret(i):= substr(str, last_delim + 1);

  return ret;

end;

您可以像这样使用它:


select tokenize('hi you person', ' ') from dual;

VARCHAR(hi,you,person)


查看完整回答
反对 回复 2019-12-04
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

我最后用这个


create or replace function split

(

   p_list varchar2


) return sys.dbms_debug_vc2coll pipelined

is

   l_idx    pls_integer;

   l_list    varchar2(32767) := p_list;

   l_value    varchar2(32767);

begin

   loop

       l_idx := instr(l_list,',');

       if l_idx > 0 then

           pipe row(substr(l_list,1,l_idx-1));

           l_list := substr(l_list,l_idx+length(','));


       else

           pipe row(l_list);

           exit;

       end if;

   end loop;

   return;

end split;

declare

CURSOR c IS  select occurrence_num, graphics from supp where graphics is not null and graphics not like ' %';

begin

  FOR r IN c LOOP   

      insert into image (photo_id,report_id, filename) 

      select image_key_seq.nextval   photo_id, r.occurrence_num report_id, 

      t.column_value  filename from table(split(cast(r.graphics as varchar2(1000)))) t where t.column_value is not null;

   END LOOP;  

end ;


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 984 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信