sql - 在 PostgreSQL (plpgsql) 函数中记录已删除的记录
问题描述
我想记录由DELETE
plpgsql 函数中的语句删除的行,并且我正在尝试使用该RETURNING *
子句来执行此操作。不幸的是,这本身不起作用,因为查询的结果没有目的地。如何捕获这些行并将它们记录下来RAISE NOTICE
?
例如
-- some plpgsql code
DELETE FROM mytable WHERE x=y RETURNING *; -- this fails
-- some plpgsql code
我尝试了一些变体,... RETURNING * INTO var
但没有运气。不知道var
变量应该是什么类型。
事务性考虑不是问题——只想记录这些记录。
解决方案
您可以使用光标执行此操作:
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)
推荐阅读
- reactjs - 如何自定义 Highcharts.js 中的条形宽度和条形间距
- javascript - WebAudio API:如何在 AudioWorkletProcessor 中访问时间/采样率?
- chart.js - 无法在图表 js 注释插件中旋转标签
- javascript - 节点js中的击键输入键发送
- c# - 错误:“System.InvalidOperationException:无法找到所需的服务。”如何解决?
- mongodb - 如何在 websphere 中为 mongodb 创建数据源
- html - 媒体查询在电子邮件模板中不起作用
- c# - 如何在 Xamarin Form Android Visual Studio 2019 中设计六边形
- security - 如何解决 Jenkins 中的跨站脚本 (XSS) 漏洞
- php - 如何在 Laravel 中使用 COM 类