我有一个棘手的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中没有任何错误。这甚至可能吗?
替代方案是使安装的其余部分取决于上面脚本的结果。但我不确定如何做到这一点。
关于如何处理好方法,您有什么建议吗?
答案 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
再打开。