亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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 關注
  • 1020 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號