将CLOB字段转储到文件中?

fil*_*ppo 4 oracle sqlplus dump clob

说你有桌子:

Column_name | data_type
Title       | Varchar2
Text        | CLOB
Run Code Online (Sandbox Code Playgroud)

有些行:

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

有没有办法可以查询,所以输出文件就像

SomeUnkownMovie.txt
FredMercuryBio.txt
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Luk*_*rms 11

这个pl/sql代码应该在oracle 11g中运行.它将clobs的文本转储到标题为filename 的目录中.

begin 
  for rec in (select title, text from mytable)
  loop DBMS_XSLPROCESSOR.clob2file(rec.text, 'DUMP_SOURCES', rec.title ||'.txt'); end loop;
end;
Run Code Online (Sandbox Code Playgroud)

如果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;
Run Code Online (Sandbox Code Playgroud)

或者用dbms_advisor.create_file替换DBMS_XSLPROCESSOR.clob2file.


Jus*_*ave 6

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

如果您尝试在数据库服务器文件系统上生成文件,则有一个示例 将CLOB导出到另一个基于Tim Hall的LOB导出示例的 StackOverflow线程中的文件(此时Tim的网站似乎已关闭).

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

如果您确实需要在客户端文件系统上生成文件,我通常更喜欢使用SQL Plus之外的其他内容.例如,有一个小型Java类的示例,它可以在AskTom站点上的文件中读取和写入CLOB和BLOB数据.我倾向于编写一个在客户端上运行并导出数据的小型Java实用程序,而不是试图在SQL Plus脚本中放入太多逻辑.