首页 > 解决方案 > 在 PostgreSQL (plpgsql) 函数中记录已删除的记录

问题描述

我想记录由DELETEplpgsql 函数中的语句删除的行,并且我正在尝试使用该RETURNING *子句来执行此操作。不幸的是,这本身不起作用,因为查询的结果没有目的地。如何捕获这些行并将它们记录下来RAISE NOTICE

例如

-- some plpgsql code
DELETE FROM mytable WHERE x=y RETURNING *; -- this fails
-- some plpgsql code

我尝试了一些变体,... RETURNING * INTO var但没有运气。不知道var变量应该是什么类型。

事务性考虑不是问题——只想记录这些记录。

标签: sqlpostgresqlplpgsql

解决方案


您可以使用光标执行此操作:

create table test (a int, b int);
insert into test VALUES (1, 2), (2, 3), (3, 4);

CREATE OR REPLACE FUNCTION test_delete() RETURNS VOID AS $$
DECLARE
  deleted_row_cursor CURSOR FOR DELETE FROM test WHERE a < 3 RETURNING *;
BEGIN
    FOR deleted_row in deleted_row_cursor LOOP
      RAISE NOTICE '%', deleted_row;
    END LOOP;
END;
$$ LANGUAGE PLPGSQL;

select * from test_delete();
psql: NOTICE:  (1,2)
psql: NOTICE:  (2,3)
 test_delete
-------------

(1 row)

推荐阅读