说你有桌子:
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脚本..虽然我不是那个:(
谢谢!
答案 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脚本中添加太多逻辑。