如果 psql 函数和调用函数中存在则截断

Zol*_*kos 6 sql postgresql truncate plpgsql search-path

我有以下代码来创建一个函数,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 $$;
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 10

总长DR

要执行 Postgres函数(返回 void),请使用以下命令调用它SELECT

SELECT truncate_if_exists('web_channel2');
Run Code Online (Sandbox Code Playgroud)

正确的解决方案

……我该怎么继续?

再次删除该功能。

DROP FUNCTION truncate_if_exists(text);
Run Code Online (Sandbox Code Playgroud)

它不提供任何对表进行模式限定的方法。使用它可能会截断错误的表......

如果表不存在,您似乎正在尝试避免异常。

而你只想截断......

如果表不为空

为此,我可能会使用这样的安全函数:

SELECT truncate_if_exists('web_channel2');
Run Code Online (Sandbox Code Playgroud)

要执行,使用以下命令调用它SELECT

SELECT truncate_if_exists('web_channel2');
Run Code Online (Sandbox Code Playgroud)

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

SELECT truncate_if_exists('web_channel2', 'my_schema');
Run Code Online (Sandbox Code Playgroud)

db<>在这里摆弄

当以字符串形式提供标识符时,您需要使用精确的大小写。

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

基本: