【问题标题】:create large objects in oracle via sqlplus通过 sqlplus 在 oracle 中创建大对象
【发布时间】:2011-09-29 00:45:18
【问题描述】:

我有一个视图,其 DDL 定义长达数千行。我们 CI 过程的一部分是使用从命令行脚本调用的 SQLPlus 从 DDL 中删除和重新创建视图。

这适用于数据库中的数百个视图,但从未在目标架构中创建非常大的视图。我总是手动将视图创建脚本粘贴到 Toad 中,并在自动化过程完成后手动运行它。这是一个拖累。

运行 DDL 脚本的大视图部分时,SQLPlus 没有发出有意义的错误消息,但我怀疑它会因为它的大小而失败。

我可以在我的 DDL 顶部包含一个“set”命令来告诉 SQLPlus 创建大视图是可以的,还是我永远注定要在其他自动 CI 过程中包含一个愚蠢的手动步骤?

【问题讨论】:

    标签: oracle continuous-integration oracle11g sqlplus ddl


    【解决方案1】:

    首先,使用最新版本的 SQLPlus。很久以来,我有一段代码太大而无法通过 SQLPlus 执行。您可以使用 InstantClient

    我还会考虑重构视图。看看WITH 子句,因为它相对较新,如果视图经过很长时间演变,很有可能可以对其进行修改以利用它

    【讨论】:

      【解决方案2】:

      视图 SQL 中是否有空行,或者任何行的字符数超过 2499?其中任何一种都可能导致 SQL*Plus 出现意外行为,但实际上并未失败。

      如果有一个空行,Oracle 将忽略它之前的所有内容并尝试运行它之后的所有内容。 (这只适用于 SQL,不适用于 PL/SQL。)例如,如果您在 create view 行之后有一个空行,则查询将运行:

      SQL> create or replace view newline_in_the_middle as
        2
      SQL> select * from dual;
      
      D
      -
      X
      

      超过 2499 个字符的行将被忽略,但 Oracle 仍会尝试处理没有它的语句。这可能会导致问题,但仍可能导致有效的语句:

      SQL> create or replace view long_line as
        2  select '...[enter 2500 characters]...' asdf from dual union all
      SP2-0027: Input is too long (> 2499 characters) - line ignored
        2  select '1' asdf from dual;
      
      View created.
      

      您可能需要非常仔细地检查脚本输出才能发现这些问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        相关资源
        最近更新 更多