无法在 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 列的主要内容,如果未能解决你的问题,请参考以下文章

linux环境下oracle如何选择特殊字符

从 pl/sql 块内立即执行的数据假脱机

在 SQLPlus 中使用 SPOOL 时,数据行之间会出现空白行

由于管理员设置的策略,该磁盘处于脱机状态

测试oracle数据库的脱机备份和恢复

Oracle SQL 自动并行假脱机