我每天使用超过数百万的数据集,我在此阶段所做的大部分工作是编写代码,用于将数据从数据库中提取到文件中,供其他用户在其商业智能部门中使用。 / p>
我目前使用的代码是一个基本的FOR循环,如下所示:
for x in cursor_body
loop
utl_file.put_line(out_file_filename, x.data_line);
end loop;
这个阶段需要几个小时才能完成,我需要一些移动速度更快的东西,因为这将每周运行,我们还有其他unix bash作业也必须运行。
我已经阅读了一些使用一点C或Java来解决更多有效日期提取的解决方案,但我想知道是否有更快的PL / SQL或SQL方法。
您的意见将受到高度赞赏。谢谢。
答案 0 :(得分:0)
将所有内容写入CLOB然后将其写入光盘时,可能效果更好:
DECALRE
UTF8 BOOLEAN TRUE;
BUFFER VARCHAR2(4096 CHAR);
offset PLS_INTEGER := 1;
FileLength PLS_INTEGER;
amount BINARY_INTEGER := 1024;
fhandle UTL_FILE.FILE_TYPE;
TXT CLOB;
BEGIN
FOR aLine IN cursor_body LOOP
DBMS_LOB.WRITEAPPEND(TXT, LENGTH(aLine.data_line), aLine.data_line);
END LOOP;
FileLength := DBMS_LOB.GETLENGTH(TXT);
IF UTF8 THEN
fhandle := UTL_FILE.FOPEN_NCHAR(FolderName, FileName, open_mode => 'w', max_linesize => 32000);
ELSE
fhandle := UTL_FILE.FOPEN(FolderName, FileName, open_mode => 'w', max_linesize => 32000);
END IF;
LOOP
EXIT WHEN offset > FileLength;
DBMS_LOB.READ(TXT, amount, offset, BUFFER);
IF UTF8 THEN
UTL_FILE.PUT_NCHAR(fhandle, BUFFER);
ELSE
UTL_FILE.PUT(fhandle, BUFFER);
END IF;
UTL_FILE.FFLUSH(fhandle);
offset := offset + amount;
END LOOP;
UTL_FILE.FCLOSE (fhandle);
DBMS_LOB.FREETEMPORARY(TXT);
END;