语义:
我使用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
虽然发生了上述错误,但在我检查表格时没有发生交易。我不知道回滚过程中出现此特定错误的确切原因。任何人都可以告诉我在我的代码中可能出现的错误吗?并提出解决方案以解决此问题。
答案 0 :(得分:1)
虽然某些数据库引擎允许在函数或过程中使用COMMIT
或ROLLBACK
,但PostgreSQL却不允许RAISE EXCEPTION
或ROLLBACK
。任何尝试这样做都会导致错误:
错误:无法在PL / pgSQL中开始/结束交易
包括异常块内的代码。
另一方面,仅{{1}}将使用函数提供的错误消息中止事务,因此不需要捕获自己的异常。如果您刚删除了异常块,它将按预期工作。
如Trapping Errors中的plpgsql文档所述:
默认情况下,PL / pgSQL函数中发生的任何错误都会中止 执行该功能,实际上是周围的交易 以及
当前代码引发异常,然后陷阱并在异常块本身失败,因为禁止{{1}}语句导致SQL引擎中止事务。