2012-12-05 72 views
1

我需要在使用PL/SQL的UTL_FILE包生成的csv文件中顯示以下內容。Oracle UTL_FILE - 單個單元格在excel中的多行

標題1 Heading2 Heading3 ABCDE 123 987641213 XXX街道 YYYY

對於 '標題1' 的每個值,我得到3行爲地址從特定表。 在輸出csv文件中,我需要在一個單元格中顯示地址,並用新行分隔數據。我嘗試使用遊標和附加數據使用chr(10),chr(12),chr(15)但徒勞。

請幫助我獲得輸出。

回答

1

你要引用你的領域有運輸returnseg

heading1,headiing2,heading3 
abcde,123,"1 street 
town 
90210" 
abcde,124,"13 street 
town 
43245" 
+0

嗨Dazzal, 我試着用回車ASCII值。我正在使用逗號分隔的列表將UTL_FILE輸出寫入一個csv文件。但是,我將這些特定的回車符作爲特殊字符,如每行之間的框。它們也顯示在同一行上。 – Avinash

+0

你使用什麼字符序列來回車?它應該是chr(13)|| chr(10)。 – DazzaL

0

什麼DazzaL提出應該工作,但如果你不能在你的情況下更改輸入文件,您可以使用此代碼:

declare 
    v_line varchar2(2000); 
    v_c1 varchar2(10); 
    v_c2 varchar2(10); 
    v_c3 varchar2(1980); 
    nb_line_per_record integer := 3; 
    v_line_in_record integer; 
    v_seperator varchar2(1) := ','; 
    v_file UTL_FILE.FILE_TYPE; 
begin 
    v_file := utl_file.FOPEN(your_directory, 'your_file','r'); 
    v_line_in_record := 0; 
    --we skip the first line 
    UTL_FILE.GET_LINE(v_file, v_line); 
    loop 
     v_line_in_record := v_line_in_record + 1; 
     begin 
      UTL_FILE.GET_LINE(v_file, v_line); 
     EXCEPTION 
      WHEN no_data_found THEN 
       exit; 
     END; 
     --first line of record we cut by v_seperator 
     if v_line_in_record = 1 then 
      v_c1 := substr(v_line,1,instr(v_line,v_seperator,1,1)-1); 
      v_c2 := substr(v_line,instr(v_line,v_seperator,1,1)+1, 
          instr(v_line,v_seperator,1,2)-         
          instr(v_line,v_seperator,1,1)-1); 
      v_c3 := substr(v_line,instr(v_line,v_seperator,1,2)+1) 
          || char(10);--if you want new line in adresse 
     else 
      --not first line we concatanate to adress with new line 
      v_c3 := v_c3 || v_line || 
        case when v_line_in_record = 2 then char(10) else '' end; 
     end if; 
     if v_line_in_record = 3 then 
      v_line_in_record := 0; 
      --do something with your record 
      insert into yourtable values (v_c1,v_c2,v_c3); 
     end if; 
    end loop; 
    UTL_FILE.FCLOSE(v_file); 
    COMMIT; 
end; 

但是,只有當你確定每條記錄都是3行時,這纔有效。如果我是你,我會在每條記錄後添加一個記錄分隔符,並使用SQLLOADER將此文件加載到表中。您可以定義一個記錄分隔符與SQLLOADER.Here是使用&作爲記錄分隔

options (skip=1) 
    load data 
    infile "yourfile" "str '&'" 
    truncate into table your_table 
    fields terminated by "," 
    trailing nullcols 
    (heading1, heading2, heading3) 

個例CTL和如果使用記錄分隔符,你甚至可以創建文件的External Table

+0

嗨比倫特, 感謝您的奇妙的查詢。但問題是char(10)會使3row輸出的第二行顯示在excel的下一行中......我需要這3行顯示一些東西,比如我們如何在excel中使用ALT + ENTER來輸入單個小區內的數據的多行.... 基本上,它應該是 ALT + ENTER ALT + ENTER 這將允許所有的數據顯示在一個單一的細胞。 – Avinash