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

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

如何將csv轉換為oracle中的表

如何將csv轉換為oracle中的表

神不在的星期二 2019-11-04 10:03:37
當傳入csv值時,如何制作一個以表格式返回結果的包。select * from table(schema.mypackage.myfunction('one, two, three'))應該回來onetwothree我嘗試了來自問湯姆的東西,但僅適用于sql類型。我正在使用oracle 11g。有內置的東西嗎?
查看完整描述

3 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

以下工作將它作為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;

/


查看完整回答
反對 回復 2019-11-04
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

為了獲得最佳性能,最好避免在拆分器功能中使用分層(CONNECT BY)查詢。


將以下拆分器功能應用于更大的數據量時,其性能會更好


CREATE OR REPLACE FUNCTION row2col(p_clob_text IN VARCHAR2) 

   RETURN sys.dbms_debug_vc2coll PIPELINED 

IS

     next_new_line_indx PLS_INTEGER;

     remaining_text VARCHAR2(20000);

     next_piece_for_piping VARCHAR2(20000);

  BEGIN


    remaining_text := p_clob_text;

    LOOP

       next_new_line_indx := instr(remaining_text, ','); 

       next_piece_for_piping :=

          CASE

             WHEN next_new_line_indx <> 0 THEN

                TRIM(SUBSTR(remaining_text, 1, next_new_line_indx-1))

             ELSE

                TRIM(SUBSTR(remaining_text, 1))

          END;


       remaining_text := SUBSTR(remaining_text, next_new_line_indx+1 );

       PIPE ROW(next_piece_for_piping);

       EXIT WHEN next_new_line_indx = 0 OR remaining_text IS NULL;

    END LOOP;

    RETURN;

  END row2col;

/

可以在下面觀察到這種性能差異(我使用了本討論前面給出的功能分配器)。


SQL> SET TIMING ON

SQL>

SQL> WITH SRC AS (

  2  SELECT rownum||',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'||rownum txt

  3  FROM DUAL

  4  CONNECT BY LEVEL <=10000

  5  )

  6  SELECT  NULL

  7  FROM SRC, TABLE(SYSTEM.row2col(txt)) t

  8  HAVING MAX(t.column_value) > 'zzz'

  9  ;


no rows selected


Elapsed: 00:00:00.93

SQL>

SQL> WITH SRC AS (

  2  SELECT rownum||',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'||rownum txt

  3  FROM DUAL

  4  CONNECT BY LEVEL <=10000

  5  )

  6  SELECT  NULL

  7  FROM SRC, TABLE(splitter(txt)) t

  8  HAVING MAX(t.column_value) > 'zzz'

  9  ;


no rows selected


Elapsed: 00:00:14.90

SQL>

SQL> SET TIMING OFF

SQL>


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 694 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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