错误:功能addgeometrycolumn不是唯一(ERROR: function addgeom

2019-06-28 00:52发布

我想用下面的函数;

SELECT Assign_vertex_id('ways', 0.00001, 'the_geom', 'gid')

但由于某种原因,它给我下面的错误;

NOTICE:  CREATE TABLE will create implicit sequence "vertices_tmp_id_seq" for serial column "vertices_tmp.id"
CONTEXT:  SQL statement "CREATE TABLE vertices_tmp (id serial)"
PL/pgSQL function "assign_vertex_id" line 15 at EXECUTE statement
ERROR:  function addgeometrycolumn(unknown, unknown, integer, unknown, integer) is not unique
LINE 1: SELECT addGeometryColumn('vertices_tmp', 'the_geom', 4326, '...
               ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.
QUERY:  SELECT addGeometryColumn('vertices_tmp', 'the_geom', 4326, 'POINT', 2)
CONTEXT:  PL/pgSQL function "assign_vertex_id" line 24 at EXECUTE statement

********** Error **********

ERROR: function addgeometrycolumn(unknown, unknown, integer, unknown, integer) is not unique
SQL state: 42725
Hint: Could not choose a best candidate function. You might need to add explicit type casts.
Context: PL/pgSQL function "assign_vertex_id" line 24 at EXECUTE statement

现在,从我发现它是一些与老PostGIS的签名around.Infect当我跑下面的命令;

select proname, proargnames from pg_proc where proname = 'addgeometrycolumn'; 

结果是这一点;

pg_proc returns 6 rows.

Three rows with column proargnames  returning a blank or (null) value

有人能帮我吗? 它是某种与旧的PostGIS signitures办? 如果是这样,我该如何解决?

谢谢

Answer 1:

PostgreSQL支持函数重载

随着重载函数(像你一样有),只有文本文字通话(没有明确的类型转换)可以是不明确的。

通常情况下,加入明确的类型转换为您的参数文本解决了这个问题。 任意例如:

SELECT my_fuc('foo'::text, 0.001::numeric, 123::int);

在你的情况,这个调用含糊:

addGeometryColumn('vertices_tmp', 'the_geom', 4326, 'POINT', 2)

请注意这几点:

  • 所有不带引号的标识符投在Postgres的为小写addGeometryColumn(...)实际上是相同的addgeometrycolumn(...)

  • 您可能需要架构限定函数名,使之明确。 (也许你最近改变了search_path导致令人惊讶的结果。

  • 如果你确实有重载函数 (并不少见),加入类型转换,使您的通话不含糊。

  • 定义参数默认为重载函数可以让一个以前唯一的呼叫暧昧。



Answer 2:

我也遇到过这个问题,我觉得OP可能没有正确地解决它。 首先,AddGeometryColumn确实超载。 这三个原型是:

    AddGeometryColumn(table_name, column_name, srid, type, dimension,
use_typmod=true)
    AddGeometryColumn(schema_name, table_name, column_name, srid, type, dimension, use_typmod=true)
    AddGeometryColumn(catalog_name, schema_name, table_name, column_name, srid, type, dimension, use_typmod=true)

在我的情况下,改变以下查询:

SELECT AddGeometryColumn('public', 'facilities', 'walk_area', 4326, 'POLYGON', 2);

(使用第二形式)到这样的:

SELECT AddGeometryColumn('public', 'facilities', 'walk_area', 4326, 'POLYGON', 2, true);

解决了这个问题。



文章来源: ERROR: function addgeometrycolumn is not unique