首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SQL*Plus生成SQL*Plus脚本

使用SQL*Plus生成SQL*Plus脚本
EN

Stack Overflow用户
提问于 2010-11-10 12:39:42
回答 5查看 4.7K关注 0票数 3

我想通过查询数据字典来生成大量的SQL*Plus脚本,但是我遇到了一些问题,并且怀疑我遗漏了一些明显的东西。

例如,当我在SQL*Plus中执行以下命令时,我得到的是ORA-01756: quoted string not properly terminated

代码语言:javascript
运行
复制
SQL> SPOOL myscript.sql
SQL> SELECT q'[SPOOL log
  2  SELECT COUNT(*) FROM DUAL;
ERROR:
ORA-01756: quoted string not properly terminated

我尝试使用行连续字符来避免此错误,但它将连续字符放入输出中:

代码语言:javascript
运行
复制
SQL> SELECT q'[SPOOL log
  2  SELECT COUNT(*) FROM DUAL; -
  3  PROMPT Done.
  4  ]' FROM DUAL;
SPOOL log
SELECT COUNT(*) FROM DUAL; -
PROMPT Done.

注意到输出是如何在DUAL;之后有-的吗?我不希望在生成的脚本中出现这种情况。

解决这个问题的一种方法是连接大量的CHR()函数调用来生成分号和换行符;但我希望不必这样做,因为生成的脚本非常长,而且像]'||CHR(59)||CHR(10)||q'[这样的代码分散在代码中会让它看起来非常丑陋,并且很难解决问题。

(我正在使用SQL*Plus Release 11.2.0.1.0 Production,连接到11gR2实例。)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-10 16:53:33

问题是SQL*Plus将您的第一个;解释为命令的终止符。您可能已经注意到,如果将命令写入文本文件并执行该命令(或使用SQL*Plus在文本编辑器中对其进行编辑),则可以正常工作。

要让它与实时输入一起工作,如果你真的想这样做(如果它们很长,似乎不太可能!),你可以用SET SQLTERMINATOR off关闭对终止符的自动检测。请注意,您必须告诉SQL您已经完成了,它应该使用/指令执行,因为第二个;也被忽略了。

代码语言:javascript
运行
复制
SQL> SPOOL myscript.sql
SQL> SET SQLTERMINATOR off
SQL> SELECT q'[SPOOL log
  2  SELECT COUNT(*) FROM DUAL;
  3  PROMPT Done.
  4  ]' FROM DUAL
  5  /
SPOOL log
SELECT COUNT(*) FROM DUAL;
PROMPT Done.

如果要从数据字典构建这些文件,另一种选择是使用PL/SQL执行查询和操作,并使用dbms_output生成要假脱机的输出,只要最终文件大小不超过缓冲区限制。

票数 2
EN

Stack Overflow用户

发布于 2010-11-10 13:03:55

当我想从数据库中创建脚本时,我倾向于使用UTL_FILE包编写文件,而不是假脱机使用SQL的输出。这并不完全是您想要的,但我发现该控件比尝试编写格式正确的sql脚本麻烦得多。

票数 1
EN

Stack Overflow用户

发布于 2010-11-10 12:45:06

您可以在dbms_metada包或我的包中使用getddl:http://github.com/xtender/XT_SVN

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4141262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档