.. FILE1 := UTL_FILE.FOPEN('DIR','cg.csv','w',32000); .. ビューの多くの列の値を連結した csv ファイルを生成しています。Oracle plsqlで32000を超えるデータからcsvを生成するためにutl_fileを使用する方法はありますか?
1267 次
3 に答える
0
関数に関するOracleのドキュメントによるとUTL_FILE.FOPEN
:
FOPEN max_linesize パラメーターは、1 から 32767 の範囲の数値でなければなりません
32767 まで増やすことはできますが、それ以上はできません。
複数のファイルを作成することを検討してください。
于 2015-08-12T13:50:54.753 に答える
0
はい、方法があります -clob
の代わりにデータ型を使用してvarchar2
ください。clob
PL/SQL の最大サイズは 128TB です。
PL/SQL コードでは、最初にデータを一時的な clobに収集します。次に、Clob をチャンクで反復し、それらを にフィードしutl_file
ます。
以下は、任意の clob をユーザー定義ファイルに書き込むランダムなインターネット コード スニペットです。
procedure save (
p_text in clob,
p_path in varchar2,
p_filename in varchar2
) as
v_lob_temp blob;
begin
--
-- exit if any parameter is null
--
if p_text is null
or p_path is null
or p_filename is null then
return;
end if;
--
-- convert a clob to a blob
--
declare
v_dest_offset pls_integer := 1;
v_src_offset pls_integer := 1;
v_lang_context pls_integer := dbms_lob.default_lang_ctx;
v_warning pls_integer := dbms_lob.no_warning;
begin
dbms_lob.createtemporary(lob_loc => v_lob_temp,
cache => true,
dur => dbms_lob.call);
dbms_lob.converttoblob(dest_lob => v_lob_temp,
src_clob => p_text,
amount => dbms_lob.lobmaxsize,
dest_offset => v_dest_offset,
src_offset => v_src_offset,
blob_csid => dbms_lob.default_csid,
lang_context => v_lang_context,
warning => v_warning);
-- TODO raise (what?) when warning
end;
--
-- write a blob to a file
--
declare
v_lob_len pls_integer;
v_fh utl_file.file_type;
v_pos pls_integer := 1;
v_buffer raw(32767);
v_amount pls_integer := 32767;
begin
v_fh := utl_file.fopen(p_path, p_filename, 'wb', 32767);
v_lob_len := dbms_lob.getlength(v_lob_temp);
while v_pos < v_lob_len loop
dbms_lob.read(v_lob_temp, v_amount, v_pos, v_buffer);
utl_file.put_raw(file => v_fh,
buffer =>v_buffer,
autoflush => false);
v_pos := v_pos + v_amount;
end loop;
utl_file.fclose(v_fh);
dbms_lob.freetemporary(v_lob_temp);
end;
end;
于 2015-08-13T05:09:50.123 に答える
0
declare
FILEHANDLE UTL_FILE.FILE_TYPE;
WRITEMESSAGE varchar2(200);
longLine varchar2(32767);
newline char(2) := CHR(13) || CHR(10);
begin
longLine := LPAD('aaaa', 32766,'x');
FILEHANDLE := UTL_FILE.FOPEN('XMLDIR','lonLineFile.txt','wb',32767);
for i in 1 .. 5 loop
UTL_FILE.PUT_RAW (filehandle,UTL_RAW.CAST_TO_RAW (longLine),true);
UTL_FILE.PUT_RAW (filehandle,UTL_RAW.CAST_TO_RAW (longLine),true);
UTL_FILE.PUT_RAW (filehandle,UTL_RAW.CAST_TO_RAW (longLine),true);
UTL_FILE.PUT_RAW (filehandle,UTL_RAW.CAST_TO_RAW (newline),true);
end loop;
UTL_FILE.FCLOSE(filehandle);
end;
/
'wb' 書き込みバイト モードでファイルを開きます。次に raw をファイルに書き込み、行末 char を書き込みます。
于 2015-08-12T14:27:04.980 に答える