【问题标题】:Dumping CLOB fields into files?将 CLOB 字段转储到文件中?
【发布时间】:2011-11-10 18:48:56
【问题描述】:

假设你有桌子:

Column_name | data_type
Title       | Varchar2
Text        | CLOB

有一些行:

SomeUnkownMovie | A long time ago in a galaxy far, far away....(long text ahead)
FredMercuryBio  | Awesomeness and stuff....(more long text)

有没有办法我可以查询它,以便输出类似的文件

SomeUnkownMovie.txt
FredMercuryBio.txt

(和ofc,里面有各自的文字)

我认为这应该是一个足够简单的 sqlplus 脚本。虽然我不是那个 :(

谢谢!

【问题讨论】:

    标签: oracle sqlplus dump clob


    【解决方案1】:

    这个 pl/sql 代码应该在 oracle 11g 中工作。 它将 clob 的文本转储到 directory 中,标题为文件名。

    BEGIN 
      FOR rec IN (
        select title, text 
        from mytable
      )
      LOOP 
        DBMS_XSLPROCESSOR.clob2file(rec.text, 'DUMP_SOURCES', rec.title ||'.txt'); 
      END LOOP;
    END;
    

    如果 DBMS_XSLPROCESSOR 不可用,那么您可以将 DBMS_XSLPROCESSOR.clob2file 替换为使用 UTL_FILE 的过程。

    例如:

    CREATE OR REPLACE PROCEDURE CLOB2FILE (
        clob_in IN CLOB,
        directory_name IN VARCHAR2,
        file_name IN VARCHAR2
    )
    IS
        file_handle UTL_FILE.FILE_TYPE;
        clob_part VARCHAR2(1024);
        clob_length NUMBER;
        offset NUMBER := 1;
    BEGIN
        clob_length := LENGTH(clob_in);
        file_handle := UTL_FILE.FOPEN(directory_name, file_name, 'W');
    
        LOOP
            EXIT WHEN offset >= clob_length;
            clob_part := DBMS_LOB.SUBSTR (clob_in, 1024, offset);
            UTL_FILE.PUT(file_handle, clob_part);
            offset := offset + 1024;
        END LOOP;
    
        UTL_FILE.FFLUSH(file_handle);
        UTL_FILE.FCLOSE(file_handle);
    
    EXCEPTION
        WHEN OTHERS THEN
            UTL_FILE.FCLOSE(file_handle);
            RAISE;
    
    END;
    

    或者也许用 dbms_advisor.create_file 替换 DBMS_XSLPROCESSOR.clob2file。

    【讨论】:

    • 我的 clob 数据中有单引号,它被转换为 '有什么帮助吗?!
    • 我添加了一个可以替换它的过程clob2file。
    • 您可能想查找 DBMS_XMLGEN.CONVERT 的作用。
    • @MatthewMoisen 据我了解, UTL_FILE.FFLUSH 将文件句柄标识的待处理数据刷新到文件中。如果您想在文件仍处于打开状态时读取文件,则在循环内使用它很有用。例如,tail 在写入文件时调试/记录文件。但是如果你只是想在文件写入后读取文件,那么在循环之外就足够了。
    • @MatthewMoisen 正如你所怀疑的那样。那时出了点问题,所以我不希望 FFLUSH 潜在地引发一个新的不太有意义的异常。转储文件时出现问题,那么为什么要关心从文件缓冲区中摇动最后的 spunk 呢?
    【解决方案2】:

    您是否尝试在数据库服务器文件系统上生成文件?还是在客户端文件系统上?

    如果您尝试在数据库服务器文件系统上生成文件,在另一个 StackOverflow 线程中有一个 exporting a CLOB to a file 示例,该线程基于 Tim Hall 的 LOB export examples(Tim 的站点目前似乎已关闭)。

    如果您尝试在客户端文件系统上生成文件,则会涉及更复杂的 SQLPlus 脚本。您会考虑做一些事情,例如查询表并使用数据为您想要生成的每个文件动态生成一个 SQLPlus 脚本,然后动态调用这些脚本。你会真正推动 SQL*Plus 的脚本功能,所以这不是我通常提倡的架构,但我相信它可以做到。

    如果您确实需要在客户端文件系统上生成文件,我通常更喜欢使用 SQLPlus 以外的其他东西。例如,AskTom 网站上有一个small Java class that reads and writes CLOB and BLOB data to and from files 的示例。我倾向于编写一个在客户端上运行并导出数据的小型 Java 实用程序,而不是尝试在 SQLPlus 脚本中放入太多逻辑。

    【讨论】:

    • 哦.. 好吧.. 以为这样会更容易。好吧,猜猜这将是一些 ruby​​ 脚本的乐趣 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多