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

标签 sql oracle

我每天处理的数据集超过数百万个,现阶段我所做的大部分工作是编写代码,将数据库中的数据提取到文件中,供其他用户在其商业智能部门中使用。

我当前使用的代码是一个基本的 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/

相关文章:

mysql查询在使用存储值和实际数计算时返回不同的结果

MYSQL替换成永不替换?

mysql - 对 SQL 查询结果进行数学运算

sql - 在 SELECT 语句中调用函数时的性能

sql - EF Code First回滚数据库表设计

java - 尝试从 oracle 数据库中选择数据并将其插入 sqlite 时内存不足

java - 算法或 SQL : to find where conditions for a set of columns which ensures result set has value in a particular column always > 0

sql - 如何使用 Groovy 从 Oracle 获取光标?

php和oracle OCI查询

excel - 找不到 OleDB 数据提供程序 VBA/Excel