我有以下代码来创建一个函数,该函数截断表中的所有行 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 $$;
不幸的是我不知道该怎么继续。。。如何执行该功能?
1条答案
按热度按时间ehxuflar1#
tldr公司
要执行postgres函数(返回void),请使用
SELECT
:合适的解决方案
... 我该怎么继续?
再次删除该函数。
它不提供任何模式限定表的方法。使用它可能会截断错误的表。。。
看起来您正在尝试避免表不存在时出现异常。
你只想截断。。。
如果表不是空的
为此,我可以使用如下安全函数:
要执行,请使用
SELECT
:如果没有提供模式,函数将返回遍历
search_path
-就像你原来做的那样。如果这是不可靠的,或者通常是安全的(在截断表时这似乎是谨慎的!)明确提供架构:db<>在这里摆弄
当以字符串形式提供标识符时,需要使用精确的大小写。
为什么选择自定义变量
_row_found
而不是FOUND
? 请参见:动态sql(execute)作为if语句的条件
基础知识:
表名作为postgresql函数参数
如何检查给定模式中是否存在表
pl/pgsql检查行是否存在
搜索路径如何影响标识符解析和“当前模式”
postgresql列名是否区分大小写?