代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Kemp

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

  •  3
  • Jeffrey Kemp  · 技术社区  · 13 年前

    我想通过查询数据字典生成大量的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 11.2.0.1.0版产品,连接到一个11GR2实例。)

    5 回复  |  直到 10 年前
        1
  •  2
  •   Alex Poole    13 年前

    问题是,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 要产生输出,你就得用假脱机,只要最终文件大小不超过缓冲区的限制。

        2
  •  1
  •   No AI now No AI ever    13 年前

    当我想从数据库中创建脚本时,我倾向于使用 UTL_FILE 打包而不是假脱机SQL*PLUS的输出。不是这样的 确切地 你想要什么,但是我发现这个控件远没有试图写正确格式的SQL脚本那么麻烦。

        3
  •  0
  •   Sayan Malakshinov    13 年前

    您可以在dbms-metada包或mine包中使用getddl: http://github.com/xtender/XT_SVN

        4
  •  0
  •   Sayan Malakshinov    13 年前

    你得看看 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 (;).
    
        5
  •  0
  •   Chad    10 年前

    为了将来参考我自己,而不是乱搞 SET SQLTERMINATOR off 使用时 SQL升级版 使用下面的代码,这样就不必担心字符串文本体中的任何特殊SQL终止符字符。

    BEGIN
    INSERT INTO SOME_TABLE (q'[ 
    
    Now;
    You;
    Can '
    Do "'"';' ;;;
    any character? *
    
    ]');
    END;
    /