将CLOB字段转储到文件中?

时间:2011-09-05 17:25:01

标签: oracle sqlplus dump clob

说你有桌子:

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脚本..虽然我不是那个:(

谢谢!

2 个答案:

答案 0 :(得分:11)

这个pl / sql代码应该在oracle 11g中运行。 它将clobs的文本转储到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。

答案 1 :(得分:5)

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

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

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

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