【问题标题】:I want to create a postgres stored procedure or function that deletes data from 2 tables where data is older than 30 days我想创建一个 postgres 存储过程或函数,从 2 个数据超过 30 天的表中删除数据
【发布时间】:2021-03-08 14:33:51
【问题描述】:
CREATE FUNCTION purge_data(integer) RETURNS int
   LANGUAGE plpgsql AS $$
DECLARE
   row_count int;
Begin
DELETE FROM table_a using table_b
 WHERE  table_a.session_id in (select table_b.id from table_b where cast (started as date) < current_date - ($1::text || '' days'')::interval);
IF found then 
   GET DIAGNOSTICS row_count = ROW_COUNT;
   RAISE NOTICE 'DELETED % row(s) FROM table_a', row_count;
END IF;
RETURN NULL;
END;
$$

我想返回从两个表中删除的行数。天数可能会改变,可能是 30 60 90

【问题讨论】:

  • 嗨,欢迎来到 SO。如果您觉得需要改进您的问题,请考虑阅读this meta post 的 SQL 相关问题。

标签: sql postgresql plpgsql


【解决方案1】:

欢迎来到 SO。

如果我过于简单化了您的问题,请原谅我。但是DELETERETURNING 不够吗?

数据样本

CREATE TEMPORARY TABLE t (id INT);
INSERT INTO t VALUES (generate_series(1,10));

查询

WITH j AS (
  DELETE FROM t WHERE id BETWEEN 1 AND 4
  RETURNING *
) SELECT count(*) FROM j;

 count 
-------
     4

演示:db&lt;&gt;fiddle

如果你必须将它放在 PL/pgSQL 函数中..

CREATE OR REPLACE FUNCTION purge_data(integer) RETURNS int LANGUAGE plpgsql AS $$
DECLARE row_count INT;
BEGIN
  WITH j AS (
    DELETE FROM t WHERE id BETWEEN 1 AND $1
    RETURNING *
) SELECT count(*) FROM j INTO row_count;
  RETURN row_count;
END;
$$;


SELECT purge_data(4);

 purge_data 
------------
      4

演示:db&lt;&gt;fiddle

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 2013-02-21
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多