Postgres:截断如果存在于带有参数的 psql 函数中

Sta*_*ica 10 postgresql functions

我正在尝试获取一个 psql 函数,如果它存在,它将截断给定的表名。我一直在尝试多种功能,但到目前为止都没有奏效。这是代码:

CREATE OR REPLACE FUNCTION truncateIfExists(tableName TEXT)
returns void
as $$
BEGIN
EXECUTE format(
'IF EXISTS (
    SELECT *
    FROM information_schema.tables 
    WHERE table_name =' || tableName || '
    )
THEN
TRUNCATE tableName;
END IF;
');
END;
$$language plpgsql
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用硬编码名称使其在一个简单的过程中工作:

do $$
begin
IF EXISTS (SELECT * 
 FROM information_schema.tables 
 WHERE table_name = genre_epf)
 THEN
 TRUNCATE genre_epf;
END IF;
end
$$;
Run Code Online (Sandbox Code Playgroud)

但是我无法理解如何混合这两个查询。我在这里做错了什么?

kli*_*lin 8

使用变量 FOUND

create or replace function truncate_if_exists(tablename text)
returns void language plpgsql as $$
begin
    perform 1
    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)

请注意,我使用了PERFORM而不是SELECT因为我不需要查询的输出。我想知道查询是否返回任何行 ( FOUND = true) 或不返回( FOUND = false)。