首页 > 解决方案 > TO_CLOB 切断报告

问题描述

我有一个使用 || 的带有多个 concat 的 select 语句。该语句运行良好,直到数据变得太大,所以我使用 TO_CLOB 进行选择以解决“字符串连接太长”错误。现在生成了报告,但只有部分数据在 1 行和第 2 行的第 3 列之后被删除。

这是我的代码的简短版本:

SET pagesize 0 SET echo off SET feedback off SET verify off PROMPT value1, value2, value3, difference SELECT TO_CLOB('field1' || ',' || num1 || ',' || num2 || ',' || diff || CHR(10) || 'field2' || ',' || num1 || ',' || num2 || ',' || diff || CHR(10) || ....... (这里大约有 80 行这样的行).......)来自表

输出我得到的报告:

值 1、值 2、值 3、差异字段 1、数字 1、数字 2、差异字段 2、数字 1、数字 2

其余为空白。其余约 80 行未生成。

PS:我在 sql developer 上测试了查询,它工作正常,但在 linux 中运行时会这样做。

请让我知道我是否缺少某些东西

标签: sqllinuxoracleunixclob

解决方案


您需要让 Oracle 将各个值连接为CLOB数据类型;将每个字段包装在中TO_CLOB(否则,它将尝试将 then 连接为字符串,然后在连接后将尝试将单个字符串转换为 a CLOB,如果它们总计超过 4000 个字符,这将已经失败):

SELECT TO_CLOB( field1 ) || ',' || TO_CLOB( field2 ) || CHR(10)
       || TO_CLOB( field3 ) || ',' || TO_CLOB( field4 ) AS value
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name ( field1, field2, field3, field4 ) AS
SELECT LPAD( 'A', 4000, 'A' ),
       LPAD( 'B', 4000, 'B' ),
       LPAD( 'C', 4000, 'C' ),
       LPAD( 'D', 4000, 'D' )
FROM   DUAL;

输出:

| 价值 |
| ------------------------------------------------------- |
| AAA ... x4000 ... AAA,BBB ... x4000 ... BBB |
| CCC ... x4000 ... CCC,DDD ... x4000 ... DDD |

只需将列表中的第一个值转换为 a 就足够了CLOB

SELECT TO_CLOB( field1 ) || ',' || field2 || CHR(10)
       || field3 || ',' || field4 AS value
FROM   table_name;

db<>在这里摆弄


推荐阅读