取消SQL * PLUS执行而不引发错误

时间:2014-07-03 11:05:34

标签: sql database oracle plsql sqlplus

我有一个棘手的SQL问题:

我们有一个巨大的SQL脚本,可以在数据库服务器上安装我们的应用程序。

如果最新更新没有更改数据库中的任何内容,我们希望跳过数据库安装。

我已经实现了以下检查,该检查在其他SQL命令之前执行:

check_current_version_delta.sql:

DECLARE
  v_deploy_version       VARCHAR2(30) := '&db_deploy_version';
  v_check                BOOLEAN := FALSE;
BEGIN
    DBMS_OUTPUT.PUT_LINE( '--------------------------------------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE( 'Check if we have a new DB version');
    DBMS_OUTPUT.PUT_LINE( '--------------------------------------------------------------------------------');
    FOR cu_version IN (SELECT version FROM &DB_CURRENT_USER..db_deployment WHERE version = v_deploy_version AND ROWNUM = 1) LOOP
      v_check := TRUE;
    END LOOP;
    IF v_check THEN
      RAISE_APPLICATION_ERROR( -20001, 'DB Version: '||v_deploy_version||' is already installed');
    END IF;
END;
/

这项工作非常顺利,但我们的安装团队抱怨日志中存在ORA-XXXXX错误,因为他们有自动错误检查,此安装标记为FAIL(尽管没有实际错误)

现在实际问题是:

我需要取消SQL的执行,而LOG中没有任何错误。这甚至可能吗?

替代方案是使安装的其余部分取决于上面脚本的结果。但我不确定如何做到这一点。

关于如何处理好方法,您有什么建议吗?

2 个答案:

答案 0 :(得分:4)

一种可能的方法是创建三个脚本:第一个检查条件,并调用第二个或第三个。第二个是真正的工作。第三个是空虚拟,通过调用不存在的脚本来避免错误消息

在代码中,它看起来像这样:

col SCRIPT1_COL new_val SCRIPT1

SELECT case
        when version = '&db_deploy_version' then 'dummy.sql'
        else 'upgrade_db.sql'
       end as SCRIPT1_COL
    FROM &DB_CURRENT_USER..db_deployment;

@&SCRIPT1

或者,您可以使用上面显示的方法加载一个不执行任何操作的脚本“dummy.sql”或只包含exit命令的脚本“exit.sql”,并在执行之前执行它真正的工作。

答案 1 :(得分:2)

据推测,您已经在使用whenever sqlerror,因此在您引发该异常时将其终止,并且您将输出重定向到您的日志文件。如果是这样,您只需使用set termout off隐藏例外文本:

whenever sqlerror exit success
set termout off

DECLARE
   ...
BEGIN
    ...
    IF v_check THEN
      RAISE_APPLICATION_ERROR( -20001,
        'DB Version: '||v_deploy_version||' is already installed');
    END IF;
END;
/

set termout on
whenever sqlerror exit failure

... the rest of your script

如果引发异常但脚本将停止但不产生输出。 success表示运行此任何内容的任何内容都不会决定它与日志无关; sqlplus的退出代码为零。

您可能正在假脱机输出;在这种情况下,直到检查完毕后才开始使用。或者,如果您之前有必要使用线轴,请关闭线轴,然后再使用append再打开。