plpgsql 函数中 IF EXISTS 内部标识符的变量

2024-04-16

CREATE OR REPLACE FUNCTION drop_now()
  RETURNS void AS
$BODY$
DECLARE
    row     record;
BEGIN
    RAISE INFO 'in';
    FOR row IN 
        select relname from pg_stat_user_tables
        WHERE schemaname='public' AND relname LIKE '%test%'
    LOOP    
    IF EXISTS(SELECT row.relname.tm FROM row.relname
              WHERE row.relname.tm < current_timestamp - INTERVAL '90 minutes'
              LIMIT 1)              
    THEN
    -- EXECUTE 'DROP TABLE ' || quote_ident(row.relname);
    RAISE INFO 'Dropped table: %', quote_ident(row.relname);

    END IF;

    END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

你能告诉我如何在中使用变量吗SELECT这是里面的IF EXISTS?此刻,row.relname.tm and row.relname按字面意思对待,这不是我想要的。


CREATE OR REPLACE FUNCTION drop_now()
  RETURNS void AS
$func$
DECLARE
   _tbl   regclass;
   _found int;
BEGIN
   FOR _tbl IN 
      SELECT relid
      FROM   pg_stat_user_tables
      WHERE  schemaname = 'public'
      AND    relname LIKE '%test%'
   LOOP
      EXECUTE format($f$SELECT 1 FROM %s
                        WHERE  tm < now() - interval '90 min'$f$, _tbl);
      GET DIAGNOSTICS _found = ROW_COUNT;
      IF _found > 0 THEN
         -- EXECUTE 'DROP TABLE ' || _tbl;
         RAISE NOTICE 'Dropped table: %', _tbl;
      END IF;
   END LOOP;
END
$func$ LANGUAGE plpgsql;

主要观点

  • row is a 保留字 http://www.postgresql.org/docs/current/interactive/sql-keywords-appendix.html在 SQL 标准中。 Postgres 中允许使用它,但仍然不明智。我习惯在 psql 变量前面加上下划线_以避免任何命名冲突。

  • 你不选择整个row无论如何,只是本例中的表名。最好使用类型变量regclass,从而自动避免通过非法表名的方式进行SQL注入。此相关答案中的详细信息:
    表名作为 PostgreSQL 函数参数 https://stackoverflow.com/questions/10705616/table-name-as-a-postgresql-function-parameter/10711349#10711349

  • 你不需要LIMIT in an EXISTS表达式,仅检查是否存在any行。出于同样的原因,您不需要有意义的目标列。写吧SELECT 1 or SELECT *或者其他的东西 https://stackoverflow.com/questions/7710153/what-is-easier-to-read-in-exists-subqueries.

  • 你需要动态SQL用于带有变量标识符的查询。普通 SQL 不允许这样做。即:构建一个查询字符串并EXECUTE它。这个密切相关的答案中的详细信息:
    动态 SQL (EXECUTE) 作为 IF 语句的条件 https://stackoverflow.com/questions/8449011/dynamic-sql-execute-as-condition-for-if-statement/8449341#8449341

  • 对于一个来说也是如此DROP语句,如果您想运行它。我添加了一条评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

plpgsql 函数中 IF EXISTS 内部标识符的变量 的相关文章

随机推荐