我在plgpsql函数(postgres 9.4)中执行“perform create index”时遇到问题。例如:

create or replace function foo() returns void language plpgsql as $$
begin
  perform 'create unique index patients_row_id_key on patients(row_id)';
end; $$;

似乎一切顺利:
select foo();

但是,不会创建索引。有什么诊断和解决办法吗?我试过:
alter function foo() VOLATILE;

仍然没有运气。

最佳答案

PERFORMPLPGSQL中的语句,用于执行不返回结果或结果无效的查询。从技术上讲,PLPGSQL块中的PERFORM ...等于普通SQL中的SELECT ...。所以在你的例子中,你试图执行

select 'create unique index patients_row_id_key on patients(row_id)';

忽略结果。
阅读更多:Executing a Command With No Result
不应将DDL语句包装在PLPGSQL中,可以按原样使用它:
create or replace function foo() returns void language plpgsql as $$
begin
  create unique index patients_row_id_key on patients(row_id);
end; $$;

或者如果您想在运行时构造它,那么使用EXECUTE语句:Executing Dynamic Commands如下:
create or replace function foo(p_tablename text) returns void language plpgsql as $$
begin
  execute 'create unique index ' || p_tablename || '_row_id_key on ' || p_tablename || '(row_id)';
end; $$;

关于postgresql - plpgsql中的“执行创建索引”未运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38016764/

10-11 03:09