【问题标题】:Validate PL/SQL without permanent changes in database在不永久更改数据库的情况下验证 PL/SQL
【发布时间】:2021-04-22 15:30:23
【问题描述】:

是否可以在不进行永久更改的情况下验证 PL/SQL 代码。
我知道可以commit 然后rollback,但我正在寻找是否有其他解决方案。

例如,如果我编写了一个程序并且我想知道它是否能正确编译。

我正在使用 Oracle SQL Developer,但没有看到任何选项。

【问题讨论】:

  • 没有。将该过程复制到不同的名称,即“test”到“test2”并编译test2,然后将其删除。 commit 和 rollback 用于 DML 语句,而不是 pl/sql 编译,对此没有影响。
  • 为什么不希望创建这种情况下的过程?我很难想到我要开发一个程序但只想看看它是否会编译而不是实际创建它的原因。我能想到的唯一原因是,如果我正在做一些事情,比如在 prod 中而不是在开发环境中编写代码。理论上,您可以将过程转换为匿名块并对其执行dbms_sql.parse 以查看它是否解析。我只是很难理解你为什么要这样做。
  • @JustinCave 也许他正在生产环境中开发;)?
  • @KoenLostrie - 在这种情况下,这是一个经典的 XY 问题meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 否! 您不能回滚编译。此外,编译本身就像一个 DDL 语句。它提交,即使编译有错误。见fiddle。您最好的选择是维护您的版本控制和备份。测试完成后,您可以恢复数据并在需要时恢复程序。

标签: sql oracle plsql oracle-sqldeveloper oracle19c


【解决方案1】:

您可以编译您的程序并检查它是否有效(不返回编译错误)。 但在这种情况下,Oracle 只进行 句法语义 分析。

  • 语法分析 – Oracle 验证关键字、对象名称、运算符、分隔符等是否正确放置在您的 SQL 语句中。因此,像select * foRm dual 这样的查询将在此验证期间失败。例如,我们可以在这里得到这样的错误:
    • ORA-00900:无效的 SQL 语句
    • ORA-00923:在预期的位置找不到 FROM 关键字
    • ORA-00924:缺少 BY 关键字
    • ORA-00933: SQL 命令未正确结束 …
  • 语义分析 - 它验证对主机变量和数据库对象的引用是否有效(包括它们的授权)以及主机变量数据类型是否正确。例如,select * from nonexisting_table 将无法通过此验证。

也就是说,在这些步骤中,您不会收到像 ORA-00979 not a group by expression 这样的错误,因为 Oracle 稍后会在优化阶段。

更多信息: http://orasql.org/2017/05/01/sql-validation-during-plsql-compilation/

【讨论】:

    【解决方案2】:

    另一个答案是尝试已经存在一段时间的版本功能

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 2011-03-20
      • 2022-07-12
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      相关资源
      最近更新 更多