使用 .sql 文件和 SQL*Plus 报告 SQL 语句成功/失败

Posted

技术标签:

【中文标题】使用 .sql 文件和 SQL*Plus 报告 SQL 语句成功/失败【英文标题】:Reporting on SQL statement success/fail with .sql file and SQL*Plus 【发布时间】:2011-09-13 07:10:49 【问题描述】:

我是同一个人问:

BEGIN/END and CREATE Table in single .sql file

无论如何,我们有几个通过 SQL*Plus 执行的 .sql 脚本。

这些脚本用于创建表、同义词、索引、视图等。

单个 .sql 文件通常包含多个 CREATE 语句。

我们正在寻找一种方法来报告每个 CREATE 语句的通过/失败,以及失败时的错误消息。

Create table foo: Pass
Create index bar: Fail - Reason...
Create synonym foo_1: Pass etc.

目前,我们可以解析 SQL*Plus 输出,但是其中包含很多无关内容,并且像这样解析日志文件并不是最可靠的方法。

有没有更好的方法通过 SQLPlus 以编程方式检查每个 SQL 语句的返回状态以及错误消息(如果有)?这是否可以通过 SQL 实现Plus?

或者我是否需要编写某种包装器(Bash、Python 等)?还是通过其他方式处理这一切?

干杯, 维克多

【问题讨论】:

【参考方案1】:

我个人不喜欢将逻辑嵌入到 DDL 脚本中,除非绝对需要 (脚本很容易变得过于复杂,并且其动作难以预测)

我更喜欢扫描脚本输出是否有错误,例如:grep for the string ORA-

然后检查架构中没有无效的对象

【讨论】:

【参考方案2】:

如果您想在发生错误时继续使用 SQL 脚本,那么您应该在 PL/SQL 块内创建表和索引,因为 PL/SQL 具有良好的异常处理能力:

BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE XY ( ... )';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Creating table XY failed: ' || SQLERRM);
END;
/

如果你想在出错时结束当前的SQL脚本,可以使用下面的SQL*Plus命令,在调用SQL*plus的脚本中进行错误处理:

whenever sqlerror exit sql.sqlcode

【讨论】:

以上是关于使用 .sql 文件和 SQL*Plus 报告 SQL 语句成功/失败的主要内容,如果未能解决你的问题,请参考以下文章

在没有“SQL>”行前缀的文件中获取 SQL*Plus

SQL s-s-rS 从报告中打开 Docx 文件

SQL*Plus - 数字列显示十六进制字符

s-s-rS 2008 报告 SQL 选项

针对 SQL Server 使用 s-s-rS 报告时出错

如何使用 SQL Plus 从 DB 用户获取日志信息?