我每天处理的数据集超过数百万个,现阶段我所做的大部分工作是编写代码,将数据库中的数据提取到文件中,供其他用户在其商业智能部门中使用。
我当前使用的代码是一个基本的 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 方法可以更快地完成此操作。
我们将高度赞赏您的意见。谢谢。
最佳答案
也许当您将所有内容写入 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;
关于sql - 更好地执行 SQL 代码以将数据提取到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21041407/