Netezza在SP中有一个单独的提交回滚。因此,如果Netezza SP失败,控件将转到Exception块,在这种情况下,如果有人知道我是否将插入放入错误表或调用另一个SP,即使主卷中的事务被滚动,异常中的事务也会被提交背部?换句话说,我们可以在Netezza中实现自动交易吗?
答案 0 :(得分:1)
简而言之,没有。
Netezza(v7.x及更早版本)不支持子交易,这对于它来说是必要的。更糟糕的是,使用NZPLSQL的唯一方法是将其包装在存储过程中(它不支持匿名的nzplsql块)
这仅适用于自定义异常处理。使用IF或CASE分支工作正常。
在我看来,这种权衡是与Oracle相比的主要差异之一。解决此问题的一种方法是将异常处理逻辑放在外部脚本或应用程序中。
在文档中没有太多强调这一点,但是在整个过程中散布着一些提示和脚注:
BEGIN / COMMIT事务块中禁止某些SQL命令。例如:
开始
[创建| DROP] DATABASE
(+其他一些DDL命令 比如ALTER TABLE,...)这些SQL命令也在Netezza的主体内被禁止 存储过程。如果你在一个中使用这些命令之一 事务块或存储过程,系统显示错误
From the documentation on NZPLSQL:
本节介绍NZPLSQL语言,其结构以及如何使用 使用该语言创建存储过程。
From the documentation on stored procedures:
重要提示:注意不要混淆使用BEGIN / END进行分组 NZPLSQL中的语句,带有BEGIN / END SQL数据库命令 交易控制。 NZPLSQL BEGIN / END关键字仅用于 分组;他们不会开始或结束交易。程序总是如此 在外部查询建立的事务中运行;他们不能 启动或提交事务,因为IBM®Netezza®SQL没有 嵌套交易。