为啥 SPOOL 在 LINESIZE 设置为 32767 的情况下写入我的输出?

Posted

技术标签:

【中文标题】为啥 SPOOL 在 LINESIZE 设置为 32767 的情况下写入我的输出?【英文标题】:Why is SPOOL writing my output with LINESIZE set to 32767?为什么 SPOOL 在 LINESIZE 设置为 32767 的情况下写入我的输出? 【发布时间】:2015-06-18 13:49:27 【问题描述】:

我试图假脱机某些数据,但由于某种原因它被包装到下一行。

这是我用于 SPOOL 的脚本(我正在添加带有 cmets 的完整脚本,以防它有任何意义)

SET SERVEROUTPUT ON FORMAT WRAPPED SIZE UNLIMITED
SET LONG 2000000000
SET LINESIZE 32767
SET VERIFY OFF
SET FEEDBACK OFF
SET TERMOUT OFF
SET HEADING OFF
SET ECHO OFF
SET PAGESIZE 0
SET NEWPAGE NONE
SET TRIMSPOOL ON

/* -------------------------------------------------- COMMENT --------------------------------------------------
COMMENT1
COMMENT2
COMMENT3
COMMENT4
COMMENT5
*/
SPOOL "File_Name_MySYNONYM_SCRIPT-11111111.sql"
  select SCRIPT FROM MY_TABLE_2_UPDATE  where OBJECT_ID =11111;
SPOOL OFF

SCRIPT 是一个 CLOB 列,对于给定的 ID 包含:

  CREATE OR REPLACE PUBLIC SYNONYM "MY_SYNONYM_12345" FOR "MS1"."MY_OBJECT1_SETUP";

这是我在假脱机文件中得到的输出:

  CREATE OR REPLACE PUBLIC SYNONYM "MY_SYNONYM_12345" FOR "MS1"."MY_OBJECT1_SETU
P";

您可以看到 P"; 被换行到第二行。该行实际上是换行的,不是我的编辑器(Notepad ++)显示错误,我有“Word Wrap”停用。

我不知道我需要设置什么其他 SQL PLUS 参数来解决这个问题。

【问题讨论】:

这里可能的答案:dba.stackexchange.com/questions/54149/… create 语句在哪里? @jWeaver - 抱歉,我不明白你的问题?该创建语句是假脱机输出,保存在“File_Name_MySYNONYM_SCRIPT-11111111.sql”文件中。你指的是这个吗? @Rene - 问题不在我的查看器中,脚本实际上已被包装,它在“SETU”之后有一个新行。您可以看到我的“-----COMMENT---”行比输出长,并且没有被包装。 尝试在 SET 命令之后和 SPOOL 之前添加:“COLUMN SCRIPT FORM A3000”。如果 sqlplus 将 SCRIPT 列默认为 80,它将自动换行。 【参考方案1】:

添加我的评论作为答案,因为它似乎有帮助。

尝试在 SET 命令之后和 SPOOL 之前添加:“COLUMN SCRIPT FORM A3000”。如果 sqlplus 将 SCRIPT 列默认为 80,它将自动换行。

但是,进一步阅读,您似乎还有其他格式问题,而且数据似乎来自 DBMS_METADATA.GET_DLL。

我已经编写了许多工具(回到 v7)来将 DDL 提取到脚本中,以便可以重建模式,尽管 DBMS_METADATA.GET_DDL 是一个巨大的帮助,但我仍然发现它并没有像你想要。所以要警告。我的脚本结合了 GET_DDL 和一些自定义提取查询来获得干净可用的脚本。

要删除多余的换行符,试试这是你的会话:

exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',false);

这方面的文档是here

【讨论】:

是的,你很紧张我的查询来自 DMBS.GET_DDL。自定义提取查询是什么意思? @Dzyann - 我所说的自定义提取查询的意思是,我没有使用 GEL_DDL,而是编写了自己的 SQL 来直接从 DBA_SOURCE、DBA_TRIGGERS 等获取 DDL,其中 GET_DDL 不能按我的意愿工作。例如,使用 PLSQL 代码时,我发现代码库中有奇怪的代码(由 TOAD 爱好者及其杂种代码格式引起)混淆了 GET_DDL,因此我直接查询 DBA_SOURCE。必须直接提取同义词和授权以确保脚本完整。 感谢您的澄清。我对 Oracle 的所有这些东西还是很陌生。感谢您的建议。到目前为止,我很幸运,我遇到的唯一问题是额外的空格。

以上是关于为啥 SPOOL 在 LINESIZE 设置为 32767 的情况下写入我的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 echo 设置 LINESIZE ORACLE

转 oracle 开发 第03章 sqlplus

为啥我会得到 SP2-0253

spool

修复 Oracle SQL 命令行 [关闭]

任何人都可以帮助理解 AVFrame.linesize[] 吗?