【发布时间】:2013-10-20 10:37:47
【问题描述】:
语义:
我使用 PostGreSql 9.0.3 作为我的 Dbms。实际上,我试图完成分配给我的目标之一,即当我的存储过程中的 IF - Statement 中的某些条件失败时,使用一些预定义的消息引发异常。由于该异常,应该需要回滚流程。
语法:
For r3 in select itemname,stock from stock s,items it where s.itemno=it.itemno and it.itemno=$2[I].itemno and s.stockpointno=$1.stockpointno loop
if xStock > r3.stock then
RAISE EXCEPTION '%', r3.itemname || ' decreased down from the low stock level';
end if;
End Loop;
其中r3 是记录,xStock 是双精度变量。
然后在存储过程结束时,我只包含以下代码以滚动 回溯交易发生。
Exception when raise_exception then rollback transaction;
我面临的问题是,一旦出现手动异常,就会出现以下错误。
DA00014:ERROR: XX000: SPI_execute_plan_with_paramlist failed executing query "rollback transaction": SPI_ERROR_TRANSACTION
虽然发生了上述错误,但在我签入表格时并未发生交易。我不知道回滚正在进行时出现此特定错误的确切原因。谁能告诉我在我的代码中可能犯的错误是什么?并提出解决此问题的解决方案。
【问题讨论】:
-
您不需要显式回滚事务以防出错。事务中任何抛出的异常都会导致回滚。
-
同样的事情可以通过检查条件和/或触发函数来完成。没有循环,没有游标。
-
@IgorRomanchenko Oh.. 那么,在什么情况下我们必须手动使用回滚呢?到目前为止,我错误地认为回滚是由我们手动调用的。
-
@wildplasser 你说的
accomplished with a check condition和No loops, no cursors.是什么意思?实际上我已经通过在我的代码中使用 if 语句来检查条件。 -
我不知道
xStock变量从何而来。如果它是来自一个或多个表的表达式,则 OQ 中函数的全部目的似乎是强制执行某些约束(或者它是业务逻辑?)。 2) ROLLBACK 回滚您在当前事务中所做的更改。它还会关闭所有游标。您的会话实质上已重置为其初始状态。所以循环中的光标不再有效。
标签: sql postgresql exception-handling rollback database