【问题标题】:Truncate if exists in psql function and call function如果 psql 函数和调用函数中存在则截断
【发布时间】:2020-07-21 12:53:32
【问题描述】:

如果表不为空,我有以下代码来创建一个函数,该函数从表 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 $$;

不幸的是,我不知道我应该如何继续...... 函数如何执行?

【问题讨论】:

  • 有什么问题?
  • 我运行代码,不知道下一步是什么。如何使用正确的参数调用函数。我收到消息:Function truncate_if_exists created Execution time: 0.03s
  • 如果我写 truncate_if_exists(web_channel2) 我得到语法错误
  • 您的代码不会截断“如果表不为空”。如果表存在,它会截断 - 这些是不同的东西。

标签: sql postgresql plpgsql truncate search-path


【解决方案1】:

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小提琴here

当提供标识符作为字符串时,你需要使用精确的大小写。

为什么使用自定义变量_row_found 而不是FOUND?见:

基础知识:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多