如果psql函数和call函数中存在sql,则截断

bn31dyow  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(419)

我有以下代码来创建一个函数,该函数截断表中的所有行 web_channel2 如果表不是空的:

create or replace function truncate_if_exists(tablename text)
returns void language plpgsql as $$
begin
    select
    from information_schema.tables 
    where table_name = tablename;
    if found then
        execute format('truncate %I', tablename);
    end if;
end $$;

不幸的是我不知道该怎么继续。。。如何执行该功能?

ehxuflar

ehxuflar1#

tldr公司

要执行postgres函数(返回void),请使用 SELECT :

SELECT truncate_if_exists('web_channel2');

合适的解决方案

... 我该怎么继续?
再次删除该函数。

DROP FUNCTION truncate_if_exists(text);

它不提供任何模式限定表的方法。使用它可能会截断错误的表。。。
看起来您正在尝试避免表不存在时出现异常。
你只想截断。。。
如果表不是空的
为此,我可以使用如下安全函数:

CREATE OR REPLACE FUNCTION public.truncate_if_exists(_table text, _schema text DEFAULT NULL)
  RETURNS text
  LANGUAGE plpgsql AS
$func$
DECLARE
   _qual_tbl text := concat_ws('.', quote_ident(_schema), quote_ident(_table));
   _row_found bool;
BEGIN
   IF to_regclass(_qual_tbl) IS NOT NULL THEN   -- table exists
      EXECUTE 'SELECT EXISTS (SELECT FROM ' || _qual_tbl || ')'
      INTO _row_found;

      IF _row_found THEN                        -- table is not empty
         EXECUTE 'TRUNCATE ' || _qual_tbl;
         RETURN 'Table truncated: ' || _qual_tbl;
      ELSE  -- optional!
         RETURN 'Table exists but is empty: ' || _qual_tbl;
      END IF;
   ELSE  -- optional!
      RETURN 'Table not found: ' || _qual_tbl;
   END IF;
END
$func$;

要执行,请使用 SELECT :

SELECT truncate_if_exists('web_channel2');

如果没有提供模式,函数将返回遍历 search_path -就像你原来做的那样。如果这是不可靠的,或者通常是安全的(在截断表时这似乎是谨慎的!)明确提供架构:

SELECT truncate_if_exists('web_channel2', 'my_schema');

db<>在这里摆弄
当以字符串形式提供标识符时,需要使用精确的大小写。
为什么选择自定义变量 _row_found 而不是 FOUND ? 请参见:
动态sql(execute)作为if语句的条件
基础知识:
表名作为postgresql函数参数
如何检查给定模式中是否存在表
pl/pgsql检查行是否存在
搜索路径如何影响标识符解析和“当前模式”
postgresql列名是否区分大小写?

相关问题