【问题标题】:Is it possible to validate sql and pl/sql syntax on compile time?是否可以在编译时验证 sql 和 pl/sql 语法?
【发布时间】:2021-03-14 06:19:44
【问题描述】:

我刚刚杀死了我们的 CI,因为我提交了不正确的 SLQ 文件。但是我用 SQL Developer 检查了它,但忘记复制/粘贴到 IDE。错误只出现在一个符号上。否则 - 否则。并且构建已成功完成,并且仅在 AT 期间失败。

但它是在构建期间执行 sql 语法检查的工具吗?匹配 sql*plus 要求(例如:它也可能由于奇数行而失败)。

【问题讨论】:

  • 据我所知,无效的语法会阻止代码被编译。因此,恐怕我不明白您实际上做了什么以及您要解决哪个问题。
  • execute immediate 'select + fORm..' 之类的东西你会在执行程序时首先看到。所有的 JDBC 都是基于这个概念,所以你在执行时首先解析 SQL。

标签: sql oracle plsql sqlplus


【解决方案1】:

您的构建过程可能没有注意到问题,因为 PL/SQL 编译问题会引发警告,而不是异常。与其单独检查每个对象,不如在构建结束时编写一个简单的脚本来验证所有对象是否有效。 (由于循环依赖问题,有时必须将 PL/SQL 对象创建为暂时无效并稍后验证。)

什么是“失败”取决于您使用的精确工具。但在大多数情况下,下面的 PL/SQL 块会引发一个异常,并被识别为失败:

SQL>--Raise an exception if there are any invalid objects.
SQL>declare
  2      v_count number;
  3  begin
  4      select count(*)
  5      into v_count
  6      from all_objects
  7      where owner in ('JHELLER', 'OTHER_SCHEMAS_YOU_CARE_ABOUT')
  8          and status <> 'VALID';
  9
 10      if v_count >= 1 then
 11          raise_application_error(-20000, 'There are '||v_count||' invalid Oracle objects.'||
 12              ' Check your installation log, DBA_ERRORS, etc.');
 13      end if;
 14  end;
 15  /
declare
*
ERROR at line 1:
ORA-20000: There are 10 invalid Oracle objects. Check your installation log,
DBA_ERRORS, etc.
ORA-06512: at line 11

如果这仍然算作失败,您可能需要告诉 SQL*Plus 退出并通过在脚本顶部添加以下内容来返回失败错误消息:

SQL>whenever sqlerror exit failure

如果这不起作用,您需要发布有关设置的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2022-01-06
    • 2018-07-20
    • 2011-04-22
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多