无法在 oracle 中假脱机行大小 > 32676 的 clob 列
Posted
技术标签:
【中文标题】无法在 oracle 中假脱机行大小 > 32676 的 clob 列【英文标题】:Unable to spool the clob column which is having the line size > 32676 in oracle 【发布时间】:2021-03-10 10:46:12 【问题描述】:我已经尝试过假脱机并且还使用了 dbms_lob。仍然无法导出长度为 45000 的 clob 列
下面是代码:
假脱机文件头
离开 设置验证关闭 关闭回声 设置页面 0 定长20000 设置longc 20000 设置线 32767 设置修剪阀 关闭反馈 关闭期限
--- 实用脚本
SET serveroutput ON
DECLARE
l_file utl_file.file_type;
l_clob CLOB;
l_buffer VARCHAR2(32767);
l_amount binary_integer := 32767;
l_pos INTEGER := 1;
BEGIN
SELECT mo_xml
INTO l_clob
FROM
( SELECT mo_xml, LENGTH(mo_xml) LEN FROM test_xml ORDER BY LEN ASC
)
WHERE rownum =1;
l_file := utl_file.fopen('test', 'TEMP.TXT', 'w', 32767);
LOOP
dbms_lob.read (l_clob, l_amount, l_pos, l_buffer);
utl_file.put(l_file, l_buffer);
utl_file.fflush(l_file);
l_pos := l_pos + l_amount;
END LOOP;
EXCEPTION
WHEN no_data_found THEN
-- Expected end.
IF utl_file.is_open(l_file) THEN
utl_file.fclose(l_file);
END IF;
WHEN OTHERS THEN
IF utl_file.is_open(l_file) THEN
utl_file.fclose(l_file);
END IF;
raise;
END;
/
【问题讨论】:
为什么是SET LONG 20000
? 设置最大宽度(以字节为单位)
我尝试更改值,但问题出在设置行中,无法打印长度 > 32767 的值
啊,你是要写入某个服务器目录的文件吗?这与 SQL*Plus 的spool
命令无关,所以开头的所有选项根本不相关(为什么要包含它们?)。所以检查这个answer
我在此补充说,我已经尝试了两种方式,通过 sql plus 和通过 util script 进行假脱机,但没有任何效果
【参考方案1】:
很抱歉,但即使是官方的documentation utl_file.put 也说“缓冲区参数的最大大小(它是第二个,你的“l_buffer”所在的位置)是 32767 字节”。我相信您必须先拆分行,然后再将它们逐个刷新到文件中
【讨论】:
我无法拆分行,因为我正在构建一个应该转移给第三方的 xml @Balakrishnan 您要将多行中的所有 XML 放入单个文件还是作为不同的文档?或者作为大型 XML 中的一些嵌套结构?【参考方案2】:尝试改用DBMS_LOB.CLOB2FILE。
declare
v_clob clob;
begin
select mo_xml
into v_clob
from (select mo_xml from test_xml order by dbms_lob.getlength(mo_xml))
where rownum = 1;
--In 12.2 and above:
dbms_lob.clob2file(v_clob, flocation => 'test', fname => 'TEMP.TXT');
--In 11.2 and below the procedure is in a different package:
--dbms_xslprocessor.clob2file(v_clob, flocation => 'TEMP_DIR', fname => 'TEST.TXT');
end;
/
【讨论】:
我昨天累了 dbms_xslprocessor.clob2file,它只会处理一行。在我们的表中,我们有 2k 条记录。如果我们只有一条记录,我们可以使用 dbms_lob.clob2file / dbms_xslprocessor.clob2file。感谢您在这方面的时间。 :-) @Balakrishnan 您是否希望每条 2K 记录都位于单独的文件中?还是您想将所有记录连接到一个文件中?以上是关于无法在 oracle 中假脱机行大小 > 32676 的 clob 列的主要内容,如果未能解决你的问题,请参考以下文章