在Postgres函数

时间:2018-02-06 18:14:57

标签: sql postgresql plpgsql dynamic-sql

我确定之前有人问过这个问题,但是我无法通过搜索来找到它。所以至少如果它被标记为重复,也许在这里找到它会更容易。 Postgres文档没有帮助我。

我有以下SQL:

create table foobar(col1 bool);
create or replace function foo(tablename varchar) returns void as $func$
begin
  alter table tablename add column if not exists bar boolean;
end;
$func$ language plpgsql;
select foo('foobar');

我期待发生的事情:

  • 使用布尔列col1
  • 创建表foobar
  • 创建一个函数foo,它将布尔列栏添加到指定的表
  • 运行函数将此列添加到表foobar

实际发生的是,前两个SQL语句成功执行但第三个失败:

  

错误:关系“tablename”不存在

我的IDE告诉我这应该没问题。我已经讨论了一段时间了,除非使用format()字符串替换,否则无法想出一种合作的方法:

create or replace function foo(tablename varchar) returns void as $func$
begin
  execute(format('alter table %I add column if not exists bar boolean;', tablename));
end;
$func$ language plpgsql;

真的没有办法做到这一点吗?

0 个答案:

没有答案