我想通过查询数据字典来生成大量的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实例。)
答案 0 :(得分:2)
问题是SQL * Plus正在解释您的第一个;
作为命令的终止符。您可能已经注意到,如果您将命令写入文本文件并执行(或使用SQL * Plus在文本编辑器中编辑它),它就可以工作。
要使其与实时打字一起使用,如果你真的想这样做(如果它们会很长,似乎不太可能!),你可以用SET SQLTERMINATOR off
关闭终结器的自动检测。请注意,您必须告诉SQL * Plus您已完成并且应该使用/
指令执行,因为第二个;
也会被忽略。
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
生成你要输出的输出,只要最后一个文件大小不会超过缓冲区限制。
答案 1 :(得分:1)
当我想在DB中创建脚本时,我更倾向于使用UTL_FILE
包编写文件而不是假脱机SQL * Plus的输出。它不是完全你想要的东西,但我发现控件比尝试编写格式正确的sql脚本要麻烦得多。
答案 2 :(得分:0)
您可以在dbms_metadata包或我的包中使用get_ddl: http://github.com/xtender/XT_SVN
答案 3 :(得分:0)
您需要查看http://download.oracle.com/docs/cd/A97630_01/server.920/a90842/ch13.htm
SET CMDS[EP] {;|c|ON|OFF}
Sets the non-alphanumeric character used to separate multiple SQL*Plus commands entered on one line to c. ON or OFF controls whether you can enter multiple commands on a line. ON automatically sets the command separator character to a semicolon (;).
答案 4 :(得分:0)
为了将来参考我自己,而不是在使用 sql plus 时弄乱SET SQLTERMINATOR off
,请使用下面的代码,这样您就不必担心任何特殊的SQL终止符字符串文字体内的字符。
BEGIN
INSERT INTO SOME_TABLE (q'[
Now;
You;
Can '
Do "'"';' ;;;
any character? *
]');
END;
/