【问题标题】:Deleting old rows in a schema using stored procedure使用存储过程删除架构中的旧行
【发布时间】:2022-01-01 07:24:01
【问题描述】:

有没有办法在一个过程中选择架构中的所有表并删除不符合条件(早于某个日期)的行?我可以使用 2 个单独的查询来做同样的事情, 它看起来像:SELECT table_name FROM information_schema.tables WHERE table_schema = 'schemaName',然后是 DELETE FROM table_name WHERE time < now()-'12 months'::interval;",但我无法思考如何使用一个存储过程来做同样的事情,我想我应该在某种类型的选择查询上使用 for 循环,但因为我从来没有真正工作过在 postgres 中使用循环时,我总是会遇到某种类型的异常来尝试执行此操作。 任何帮助都非常感谢

【问题讨论】:

  • 您应该能够在不使用循环的情况下将您的 sql 语句嵌入到过程中。你有你的 SELECT 语句的准确描述吗?
  • 问题中的查询是我使用的查询(仅更改了表/shema 名称),我使用的方法是运行第一个查询,然后使用一些 java 代码获取表的名称,然后对列表中的每个表名使用第二个查询。无法真正了解如何将它们组合在一个过程中

标签: postgresql psql


【解决方案1】:

您通常可以使用 CTE 组合 SELECT 和 DELETE 语句:

WITH list AS
( SELECT ...
    FROM ...
   WHERE ...
RETURNING ...
)
DELETE FROM ...
USING list
WHERE ...

除了在您的情况下,SELECT 语句的返回参数对应于必须删除行的表的名称。这意味着在运行时之前不知道表名,这意味着在 plpgsql FUNCTION 中使用 dynamic sql command

CREATE OR REPLACE FUNCTION delete_rows_from_table(table_name text)
RETURNS void LANGUAGE plpgsql AS
$$
BEGIN
EXECUTE E'
DELETE FROM ' || quote_ident(table_name) || E'
 WHERE time < now()- \'12 months\':: interval' ;
END ;
$$ ;

然后您可以在您的SELECT 语句中使用FUNCTION delete_rows_from_table :

SELECT delete_rows_from_table(table_name)
  FROM information_schema.tables
 WHERE table_schema = 'schemaName'

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多