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

时间:2010-11-10 04:39:42

标签: oracle sqlplus

我想通过查询数据字典来生成大量的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实例。)

5 个答案:

答案 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;
/