Question

Semantics:

I am using PostGreSql 9.0.3 as my Dbms. Actually i was tried to accomplish one of the objectives assigned for me, which is to Raise Exception with some predefined message when some conditions failed in a IF - Statement inside my stored procedure. As a result of that exception, The Process should needs to be rolled back.

Syntax:

 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;

where r3 is a record and xStock is a Double Precision Variable.

Then At the end of the stored procedure i just included the following code in order to roll back the transactions happened.

Exception when raise_exception then rollback transaction;

The problem i am facing is when ever the manual exception getting raised, The following error bumps up.

DA00014:ERROR: XX000: SPI_execute_plan_with_paramlist failed executing query "rollback transaction": SPI_ERROR_TRANSACTION

Though the above error occured, transactions are not happened while i was checking in the tables. I don't know the exact reason why this particular error is raising when rolling back is in progress. Can anybody tell what may be the possible mistake which i was made in my code? And also suggest solutions to fix this issue.

Was it helpful?

Solution

While some database engines allow COMMIT or ROLLBACK inside a function or procedure, PostgreSQL does not. Any attempt to do that leads to an error:

ERROR: cannot begin/end transactions in PL/pgSQL

That includes code inside an exception block.

On the other hand, a RAISE EXCEPTION alone will abort the transaction with the function-supplied error message, so there's no need to trap your own exception. It would work as expected if you just removed your exception block.

As said by the plpgsql documentation in Trapping Errors:

By default, any error occurring in a PL/pgSQL function aborts execution of the function, and indeed of the surrounding transaction as well

You current code raises the exception, then traps it and fails in the exception block itself because of the forbidden ROLLBACK statement, which leads to the SQL engine aborting the transaction.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top