我想通过查询数据字典来生成大量的SQL*Plus脚本,但是我遇到了一些问题,并且怀疑我遗漏了一些明显的东西。
例如,当我在SQL*Plus中执行以下命令时,我得到的是ORA-01756: quoted string not properly terminated
SQL> SPOOL myscript.sql
SQL> SELECT q'[SPOOL log
2 SELECT COUNT(*) FROM DUAL;
ERROR:
ORA-01756: quoted string not properly terminated
我尝试使用行连续字符来避免此错误,但它将连续字符放入输出中:
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实例。)
发布于 2010-11-10 16:53:33
问题是SQL*Plus将您的第一个;
解释为命令的终止符。您可能已经注意到,如果将命令写入文本文件并执行该命令(或使用SQL*Plus在文本编辑器中对其进行编辑),则可以正常工作。
要让它与实时输入一起工作,如果你真的想这样做(如果它们很长,似乎不太可能!),你可以用SET SQLTERMINATOR off
关闭对终止符的自动检测。请注意,您必须告诉SQL您已经完成了,它应该使用/
指令执行,因为第二个;
也被忽略了。
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
生成要假脱机的输出,只要最终文件大小不超过缓冲区限制。
发布于 2010-11-10 13:03:55
当我想从数据库中创建脚本时,我倾向于使用UTL_FILE
包编写文件,而不是假脱机使用SQL的输出。这并不完全是您想要的,但我发现该控件比尝试编写格式正确的sql脚本麻烦得多。
发布于 2010-11-10 12:45:06
您可以在dbms_metada包或我的包中使用getddl:http://github.com/xtender/XT_SVN
https://stackoverflow.com/questions/4141262
复制相似问题