如何在 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
【讨论】:
它还写入文件old
和new
以及命令,然后在行和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 文件时仅记录错误的主要内容,如果未能解决你的问题,请参考以下文章