更好地执行sql代码以将数据提取到文件?

时间:2014-01-10 10:08:47

标签: sql oracle

我每天使用超过数百万的数据集,我在此阶段所做的大部分工作是编写代码,用于将数据从数据库中提取到文件中,供其他用户在其商业智能部门中使用。 / 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方法。

您的意见将受到高度赞赏。谢谢。

1 个答案:

答案 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;