sql - 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 中运行时会这样做。
请让我知道我是否缺少某些东西
解决方案
您需要让 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<>在这里摆弄
推荐阅读
- bash - 在 shell 脚本中实现的快速排序不起作用
- ionic-framework - 如何为选项卡之间的离子选项卡过渡设置动画?离子4
- list - Prolog:反向列表 - 找不到错误
- css - Laravel Mix webpack scss在for循环内乘法编译错误
- c - 用 C 语言编写一个程序,从字符串中删除前导空格和尾随空格
- c - 用c语言打印素数
- z3 - 说明 SMT 类型;变量截断中的错误?允许 Bool*Int
- javascript - 如何将默认值添加到动态下拉列表?
- node.js - 节点console.log() 一行输出数组
- firebase - 将已验证的 firebase 用户的 isEmailVerified 设置为 false