当前位置: 首页 > 知识库问答 >
问题:

TO_CLOB截断报告

邓正谊
2023-03-14

我有一个select语句,其中有多个concat,使用| |。该语句工作正常,直到数据变得太大,所以我使用CLOB来避免select出现“字符串串联过长”错误。现在生成报告,但仅部分生成1行和第2行第3列之后的数据。

以下是我的代码的简短版本:

将pagesize 0 SET echo off SET feedback off SET verify off PROMPT value1、value2、value3、difference SELECT设置为| CLOB('field1'| |'、'| | num1 | |'、'| | num2 | |'、'| diff | CHR(10)| |'field2'、'| | num1 | |'、'num2 | | |124;','| | diff | | CHR(10)| |。。。。。。。(这里大约有80条这样的线路)……)来自表

我作为报告获得的输出:

value1、value2、value3、差异字段1、num1、num2、差异字段2、num1、num2

其余为空白。其余约80行没有生成。

PS:我在sql developer上测试了这个查询,它运行得很好,但在linux上运行时可以做到这一点。

如果我错过了什么请告诉我

共有2个答案

梅跃
2023-03-14

如果您打算从命令行生成CSV文件,我强烈建议您尝试SQLcl。它的工作方式与SQLPlus类似,但其功能与SQL Developer中类似,但通过命令行界面。它是基于Java的,所以您至少需要Java 8。

通过设置sqlformat选项,您可以轻松快速地生成CSV文件。由于它与SQLPlus命令99%兼容,您仍然可以假脱机并设置所需的任何其他格式选项。从示例中可以看出,如果选择的列中有一个用于生成结构正确的CSV文件,则它甚至会正确地转义为“代码”。

编辑:Andrew Sayer在评论中指出,自客户端版本12.2以来,此功能也可在普通SQLPlus客户端中使用设置标记csv on命令。

这里有一个快速演示:

SQL> SELECT LEVEL, LEVEL + 1 AS next_level, 'Level: "' || LEVEL || '"' AS level_text
  2        FROM DUAL
  3  CONNECT BY LEVEL <= 10;

   LEVEL    NEXT_LEVEL     LEVEL_TEXT
________ _____________ ______________
       1             2 Level: "1"
       2             3 Level: "2"
       3             4 Level: "3"
       4             5 Level: "4"
       5             6 Level: "5"
       6             7 Level: "6"
       7             8 Level: "7"
       8             9 Level: "8"
       9            10 Level: "9"
      10            11 Level: "10"

10 rows selected.

SQL> set sqlformat csv

SQL> SELECT LEVEL, LEVEL + 1 AS next_level, 'Level: "' || LEVEL || '"' AS level_text
  2        FROM DUAL
  3  CONNECT BY LEVEL <= 10;

"LEVEL","NEXT_LEVEL","LEVEL_TEXT"
1,2,"Level: ""1"""
2,3,"Level: ""2"""
3,4,"Level: ""3"""
4,5,"Level: ""4"""
5,6,"Level: ""5"""
6,7,"Level: ""6"""
7,8,"Level: ""7"""
8,9,"Level: ""8"""
9,10,"Level: ""9"""
10,11,"Level: ""10"""

10 rows selected.
澹台志诚
2023-03-14

您需要让Oracle将各个值连接为数据类型;将每个字段包装到\u CLOB(否则,它将尝试连接为字符串,然后在连接后尝试将单个字符串转换为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;

输出:

| VALUE                                       |
| ------------------------------------------- |
| AAA ... x4000 ... AAA,BBB ... x4000 ... BBB |
| CCC ... x4000 ... CCC,DDD ... x4000 ... DDD |

只需将列表中的第一个值转换为CLOB即可:

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

数据库

 类似资料:
  • 问题内容: 截断->这将重置整个表,是否可以通过截断来重置特定的记录/检查条件。 例如:我想重置所有数据并在表中保留过去30天。 谢谢。 问题答案: 不,是全部还是全部。您可以这样做,但这会失去的速度优势。

  • 命令用于截断表。 如果您截断表,表的所有行将永久删除。 语法: 示例: 我们有一个名为“”的表具有以下数据(创建表并插入数据): 现在,我们使用命令: 现在表已经被截断了,您可以使用SELECT命令验证它。 如下图所示 - 您可以看到表现在被截断。

  • 在MariaDB数据库中,语句用于从表中删除所有记录。它与没有子句的语句相同。 注意:如果使用表语句,该表将被永久删除,无法回滚。 语法 示例: 假设我们想要截断表,那么可以参考以下语句 - 上面查询成功执行。可以看到表的记录已被永久删除。下面来查询表中的数据,应该不会看到任何数据 - 注意 语句相当于,然后再,或者等效于,然后再设置自动增长值为:,也就是执行语句:

  • 主要内容:Oracle TRUNCATE TABLE语句简介,Oracle TRUNCATE TABLE示例在本教程中,您将学习如何使用Oracle 语句更快更有效地从表中删除所有数据(也叫截断表)。 Oracle TRUNCATE TABLE语句简介 如果要从表中删除所有数据,可以使用不带子句的语句,如下所示: 对于有少量行记录的表,语句做得很好。 但是,当拥有大量行记录的表时,使用语句删除所有数据效率并不高。 Oracle引入了语句,用于删除大表中的所有行。 以下说明了Oracle 语句的语

  • 截断类将删除定义为类的一部分的所有簇的记录。 在OrientDB中,每个类都有一个具有相同名称的关联群集。 如果还想从类层次结构中删除所有记录,则需要使用关键字。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 定义要截断的类。 - 定义命令是否也截断层次结构。 - 定义命令在顶点或边界类上强制截断。 示例 以下查询截断类。 如果上述查询成功执行,您将得到以下输出。

  • 截断群集(命令)删除群集的所有记录。 以下语句是命令的基本语法。 其中是集群的名称。 示例 尝试以下查询以截断名的集群。 如果上述查询成功执行,您将得到以下输出。