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版本:))。关于从哪里开始获得类似的东西的任何想法?
在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, GRANT
或REVOKE
),那么整个升级就是全部或全无。
在我看到的大多数情况下,这些(重复)任务都是使用脚本自动执行的。
我们目前做的一种方法是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会话命令来摆脱所有不需要的注释等。
我不知道有任何自动化工具可以做到这一点。我之所以一直
希望这有助于...
我试图远离混合shell脚本,如果可能的话。创建太多的依赖关系。 – 2010-08-09 14:32:15
_I构建一个架构供应脚本_如果你的意思是你正在创建/改变表等,回滚将无济于事。在Oracle中,DDL命令提交当前事务(如果有未完成事务),在事务中运行自己并提交成功,则在失败时进行回滚。因此,在运行DDL命令之后,不会有未完成的事务。唯一的例外是如果存在解析错误,那么数据库不知道它应该运行DDL命令,并且不会执行第一个隐式提交,也不会为DDL启动事务。这与SQL Server非常不同。 – 2010-08-07 04:49:59
我的评论没有提供答案,只是在那里指出你可能会或可能没有意识到的一个陷阱。 – 2010-08-07 04:51:15
@Shannon - 谢谢,这真的很糟糕,你不能做更广泛的范围交易,包括DDL。在配置过程中,如果出现问题,将数据库置于半烧烤状态,这确实会使错误处理变得更加困难。 – 2010-08-09 14:33:39