Postgres:使用参数截断psql函数中是否存在


9

我试图获得一个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

现在,我可以使它在一个简单的过程中使用一个统一的名称工作:

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

但是我无法确定如何混合使用两个查询。我在这里做错了什么?


问题是TRUNCATE tableName;。您正在试图截断命名表tableName
ypercubeᵀᴹ

Answers:


7

使用变量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 $$;

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


感谢您的帮助。下划线是为Postgres约定命名的吗?
Stanislasdrg恢复莫妮卡的时间

1
可以使用“ camelCaseIdentifiers”,但是必须将它们用双引号引起来,以区分大小写。因此,identifiers_with_underscores是许多高级Postgres用户首选的约定。在文档中
klin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.