【问题标题】: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.
您可能需要非常仔细地检查脚本输出才能发现这些问题。