我最近在长时间使用pgAdmin 3后开始使用pgAdmin 4。
我现在遇到的问题是我无法替换引用geometry
个对象的现有函数。我在Windows 10上,当前版本的pgAdmin 4是2.1。
PL / pgSQL函数已存在于数据库中,它是使用flyway,psql或pgAdmin 3创建的,它可以正常工作。 PostGIS扩展已启用。
现在我进入pgAdmin 4并使用相同的登录名,为该功能选择“脚本” - >“创建脚本”,然后单击F5 - “运行脚本”来创建它。
我得到的是一个错误:
ERROR: type "geometry" does not exist
LINE 22: v_location geometry;
pgAdmin 3中的相同操作不会产生错误。
该函数正确设置了search_path
,可以在pgAdmin3和psql中创建。
实际上我可以在pgadmin4的查询工具中创建一个虚函数并编译它。见下文:
set search_path=res_cc_01,public;
create or replace function test() returns text
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100
set search_path=res_cc_01,public
AS
$BODY$
DECLARE
v_g geometry := ST_GeometryFromText('POINT(142.279859 -9.561480)',4326);
begin
return 'xxx'::text;
end;
$BODY$
只有在通过Scripts重新编译时 - >创建脚本然后F5(执行)才会出错。 这有什么问题?
我在网上找不到类似的问题,也找不到手册。但我还没有全部阅读。
答案 0 :(得分:2)
您肯定错过了当前数据库中的postgis
扩展名。如果您已在服务器中安装了它,只需执行以下命令即可创建扩展,因此缺少数据类型:
CREATE EXTENSION postgis;
如果您没有在数据库服务器中安装它,则可以找到许多操作系统的安装说明 here 。
答案 1 :(得分:2)
问题是由pgadmin 4在使用Scripts时显示plpgsql代码的方式引起的 - >创建脚本。 它为search_path指令中的路径添加了不需要的引号,使整个search_path无效。如果search_path无效,编译器将找不到可用的扩展名。 我们实际上有一个带有PGAdmin4的项目,带有Scripts->创建脚本故障。 在PgAdmin 3中,函数中使用的search_path指令显示为alter function语句,但格式正确。 非常感谢Jim Jones对这个问题的宝贵分析。