Oracle脚本中的错误处理

问题描述:

我一直试图弄清楚这一点,现在我认为是时候寻求帮助了。我正在构建一个模式配置脚本,我想添加一些脚本输出和错误处理。这个想法是,脚本输出窗口只会显示没有所有噪音的关键信息。Oracle脚本中的错误处理

Create Temporary Error Table 
Begin Transaction 

-- begin work block 
Print "Doing some types of work" 
-- do work here 

If Error and Active Transactions > 0 Then Rollback 
If Active Transactions = 0 Then Insert Error In Temp Error Table and Start Another Transaction 
-- end work block 

-- once all all work complete 
If Active Transactions > 0 Then Commit Transactions 

在SQL Server的世界,我通常只用Red Gate's SQL Packager做到这一点已经想通了(暗示,暗示红门 - 我们需要一个Oracle版本:))。关于从哪里开始获得类似的东西的任何想法?

+2

_I构建一个架构供应脚本_如果你的意思是你正在创建/改变表等,回滚将无济于事。在Oracle中,DDL命令提交当前事务(如果有未完成事务),在事务中运行自己并提交成功,则在失败时进行回滚。因此,在运行DDL命令之后,不会有未完成的事务。唯一的例外是如果存在解析错误,那么数据库不知道它应该运行DDL命令,并且不会执行第一个隐式提交,也不会为DDL启动事务。这与SQL Server非常不同。 – 2010-08-07 04:49:59

+0

我的评论没有提供答案,只是在那里指出你可能会或可能没有意识到的一个陷阱。 – 2010-08-07 04:51:15

+0

@Shannon - 谢谢,这真的很糟糕,你不能做更广泛的范围交易,包括DDL。在配置过程中,如果出现问题,将数据库置于半烧烤状态,这确实会使错误处理变得更加困难。 – 2010-08-09 14:33:39

在Oracle中,可以定义事务边界 - 你提交时,即可大功告成,而每个语句是原子。

如果你使用SQL * Plus和你不希望在所有任何承诺,如果出现任何错误,你可以做放在SQL脚本如下:

SET ECHO ON 
SPOOL /some/path/to/logfile.log 
WHENEVER SQLERROR EXIT SQL.CODE ROLLBACK 

-- run your code or DML statements 

COMMIT; 
EXIT; 

这将弹了出来它第一次遇到错误,所以错误语句将在日志文件的末尾。它还将回滚所有更改,因此只要没有任何COMMIT(或导致它们的语句,如CREATE, ALTER, DROP, GRANTREVOKE),那么整个升级就是全部或全无。

在我看到的大多数情况下,这些(重复)任务都是使用脚本自动执行的。

我们目前做的一种方法是UNIX脚本,它运行给定目录中的所有.sql文件并生成.log文件。在这个过程的最后,我们grep日志文件,看看是否有任何错误。

您不需要手动打印任何错误,因为sqlplus已经打印出错误,并将其记录在日志文件中。

下面是一个非常简单的例子...

.ksh文件

#!/usr/bin/ksh 
echo "Starting provisioning script.." 

sqlplus scott/[email protected] > file1.log << ! 
@file1.sql 
@file1.sql 
! 

echo "end of provisioning script" 

而且file1.sql的内容(这是在同一个目录在这个例子中)

create table test123(
    id number, 
    name varchar2(200) 
); 

当我运行这个脚本,第一次创建成功,第二次失败..日志文件将.. .. .. ..

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 6 20:44:08 2010 

Copyright (c) 1982, 2007, Oracle. All Rights Reserved. 


Connected to: 
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

SQL> 
Table created. 

SQL> create table test123(
      * 
ERROR at line 1: 
ORA-00955: name is already used by an existing object 


SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

您可以沿着这些行准备一个脚本,然后查看日志文件中的任何错误..一旦执行完成。你可以使用各种sqlplus会话命令来摆脱所有不需要的注释等。

我不知道有任何自动化工具可以做到这一点。我之所以一直

希望这有助于...

+0

我试图远离混合shell脚本,如果可能的话。创建太多的依赖关系。 – 2010-08-09 14:32:15