1

PL/SQLのUTL_FILEパッケージを使用して生成されたcsvファイルに以下を表示する必要があります。

見出し 1 見出し 2 見出し 3 ABCDE 123 987641213 xxx 番地 yyyy

「Heading1」の値ごとに、特定のテーブルから住所の 3 つの行を取得します。出力 csv ファイルでは、アドレスを 1 つのセルに表示し、データを改行で区切って表示する必要があります。

カーソルを使用して、chr(10)、chr(12)、chr(15) を使用してデータを追加しようとしましたが、無駄でした。

出力を取得するのを手伝ってください。

4

2 に答える 2

1

改行を含むフィールドを引用する必要がありますeg

heading1,headiing2,heading3
abcde,123,"1 street
town
90210"
abcde,124,"13 street
town
43245"
于 2012-12-05T13:29:00.977 に答える
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 でレコード区切り文字を定義できます。レコード区切り文字として & を使用する ctl の例を次に示します。

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

レコード区切り文字を使用すると、ファイルに外部テーブルを作成することもできます。

于 2012-12-05T16:53:48.290 に答える