如何在 sqlplus 中执行 .sql 文件时仅记录错误

Posted

技术标签:

【中文标题】如何在 sqlplus 中执行 .sql 文件时仅记录错误【英文标题】:How to log only error while executing .sql file in sqlplus 【发布时间】:2019-07-05 10:37:24 【问题描述】:

如何创建一个.log 文件,该文件仅在通过 sqlplus 执行 .sql 文件期间发生异常时创建。

WHENEVER SQLERROR EXIT SQL.SQLCODE

ALTER PRODUCT IDENTIFIED BY &1;
ALTER CUSTOMER IDENTIFIED BY &1;

EXIT;

这个脚本是通过sqlplus执行的,我在命令行中添加参数,当参数不正确或发生ORA错误时执行。我怎样才能将它记录到这个.sql所在的文件中。我不想跟踪所有执行只是创建一个包含错误 ORA 的日志文件

【问题讨论】:

顺便说一下,虽然EXIT SQL.SQLCODE 在 Windows 上是可以的,但在 Linux 上不是一个好主意,因为它的退出代码最多只能达到 255。 【参考方案1】:

为了避免命令输出,添加

SET ECHO OFF

要记录消息,

你可以使用spool

spool /path/yourlogfile.log

如果您在 Unix 环境中运行 sqlplus 命令行,您可以重定向输出。

sqlplus usr/pwd@db @file.sql >/path/yourlogfile.log

为了防止替换消息,添加

SET VERIFY OFF

【讨论】:

它还写入文件oldnew 以及命令,然后在行和ORA 处出错。我只是想写ORA错误是否可能,没有错误时不要写文件。 @Gorgio : SET VERIFY OFF 它帮助我处理旧的和新的,但即使它成功了,文件也是用改变的方式创建的。我想要得到的是执行这个改变,如果它成功什么都不做,但是当出现异常时,然后创建一个包含内容的日志文件,是可能还是不可能? Gorgio : 这样的事情可以从运行 SQL * Plus 的外部程序/shell 脚本中实现,并且不能在 sqlplus 中进行控制,sqlplus 是基本的 SQL 客户端,而不是成熟的编程/脚本语言。 在开始异常结束块中执行它怎么样?当一个异常创建一个假脱机文件?可以做还是不做?【参考方案2】:

可以在 Unix 机器中创建日志文件,但使用 utl_file。 因为这段代码应该写在开始结束块中。 SQlPlus 本身没有根据条件创建假脱机文件的能力。

可以这样写:-

declare
  filehandle utl_file.file_type;
begin

  execute immediate 'ALTER PRODUCT IDENTIFIED BY &1';
  execute immediate 'ALTER CUSTOMER IDENTIFIED BY &1';

exception

when others 
then

  filehandle := utl_file.fopen('/unixpath/test', 'outputfile.log', 'W');
  utl_file.put_line(filehandle, 'test error '||sqlerrm);
  utl_file.fclose(filehandle);

end;
/

【讨论】:

以上是关于如何在 sqlplus 中执行 .sql 文件时仅记录错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在shell中调SQLPLUS 执行SQL语句

sqlplus执行sql文件出错后继续

使用 sqlplus 命令在批处理文件中执行 sql 脚本

windows下使用SQLPLUS制作BAT执行SQL文件

在 windows 10 powershell 中使用 sqlplus 执行 sql 文件

如何在shell中调SQLPLUS 执行SQL语句