DML fails after updatable cursor is used with trigger returning function

Поиск
Список
Период
Сортировка
От Dharmendra Goyal
Тема DML fails after updatable cursor is used with trigger returning function
Дата
Msg-id f87e6d710710310258o76194ea5x1d7de09e44aa59cb@mail.gmail.com
обсуждение исходный текст
Ответы Re: DML fails after updatable cursor is used with trigger returning function  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
I created one function which updates a table using updatable cursor. I wrote one trigger also on the same table. When i
executethe function it gives expected results.  But after that all DMLs fail. <br /><br /> CREATE TABLE test(i int, j
int);<br /> Drop trigger test_trig; <br /> INSERT INTO test VALUES(1, 100); <br /> INSERT INTO test VALUES(2, 200); <br
/><br/> CREATE OR REPLACE FUNCTION test_func() <br /> RETURNS TRIGGER <br /> AS $$ <br /> DECLARE c CURSOR FOR SELECT i
FROMtest FOR UPDATE; <br /> v_i numeric; <br /> BEGIN <br /> OPEN c; <br /> FETCH c INTO v_i; <br /> UPDATE test SET
i=50WHERE CURRENT OF c; <br /> DELETE FROM test WHERE CURRENT OF c; <br /> RETURN NULL; <br /> END; $$ LANGUAGE
plpgsql;<br /><br /> CREATE TRIGGER test_trig <br /> AFTER INSERT OR UPDATE OR DELETE ON test <br />    FOR EACH ROW
EXECUTEPROCEDURE test_func(); <br /><br /> Now when i execute test_func(), it gives error as expected: <br /> SELECT
test_func();<br /> ERROR:  cursor "c" already in use <br /> CONTEXT:  PL/pgSQL function "test_func" line 4 at open <br
/>SQL statement "UPDATE test SET i=50 WHERE CURRENT OF  $1 " <br /> PL/pgSQL function "test_func" line 6 at SQL
statement<br /><br /> Above error is expected. <br /><br /> But after above if i execute any DML DELETE or UPDATE it
fails:<br /> DELETE FROM test; <br /> ERROR:  cursor "c" is not positioned on a row <br /> CONTEXT:  SQL statement
"UPDATEtest SET i=50 WHERE CURRENT OF  $1 " <br /> PL/pgSQL function "test_func" line 6 at SQL statement <br /><br />
OR<br /> update test set i=i+1; <br /> ERROR:  cursor "c" already in use <br /> CONTEXT:  PL/pgSQL function "test_func"
line4 at open <br /> SQL statement "UPDATE test SET i=50 WHERE CURRENT OF  $1 " <br /> PL/pgSQL function "test_func"
line6 at SQL statement <br /><br /> Comments..?? <br /><br /> Thanks,<br /> Dharmendra<br /><a
href="http://www.enterprisedb.com">www.enterprisedb.com</a><br/> 

В списке pgsql-hackers по дате отправления:

Предыдущее
От: "J. Andrew Rogers"
Дата:
Сообщение: Re: Opportunity for a Radical Changes in Database Software
Следующее
От: "Gokulakannan Somasundaram"
Дата:
Сообщение: Clarification on a Time travel feature