回滚,但错误仍然存​​在

时间:2013-10-12 11:16:48

标签: sql postgresql exception-handling rollback database

语义:

我使用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

虽然发生了上述错误,但在我检查表格时没有发生交易。我不知道回滚过程中出现此特定错误的确切原因。任何人都可以告诉我在我的代码中可能出现的错误吗?并提出解决方案以解决此问题。

1 个答案:

答案 0 :(得分:1)

虽然某些数据库引擎允许在函数或过程中使用COMMITROLLBACK,但PostgreSQL却不允许RAISE EXCEPTIONROLLBACK。任何尝试这样做都会导致错误:

  

错误:无法在PL / pgSQL中开始/结束交易

包括异常块内的代码。

另一方面,仅{{1}}将使用函数提供的错误消息中止事务,因此不需要捕获自己的异常。如果您刚删除了异常块,它将按预期工作。

Trapping Errors中的plpgsql文档所述:

  

默认情况下,PL / pgSQL函数中发生的任何错误都会中止   执行该功能,实际上是周围的交易   以及

当前代码引发异常,然后陷阱并在异常块本身失败,因为禁止{{1}}语句导致SQL引擎中止事务。