错误:函数addgeometrycolumn不是唯一的

IT_*_*nfo 5 database postgresql postgis pgrouting

我正在尝试使用以下功能;

SELECT Assign_vertex_id('ways', 0.00001, 'the_geom', 'gid')
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它给了我以下错误;

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
Run Code Online (Sandbox Code Playgroud)

现在从我发现它必须是旧的PostGIS签名周围.当我运行以下命令;

select proname, proargnames from pg_proc where proname = 'addgeometrycolumn'; 
Run Code Online (Sandbox Code Playgroud)

结果是这样的;

pg_proc returns 6 rows.

Three rows with column proargnames  returning a blank or (null) value
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?这与旧的postgis签名有什么关系吗?如果是的话,我该如何解决?

谢谢

Fra*_*nry 6

我也遇到过这个问题,我认为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)
Run Code Online (Sandbox Code Playgroud)

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

SELECT AddGeometryColumn('public', 'facilities', 'walk_area', 4326, 'POLYGON', 2);
Run Code Online (Sandbox Code Playgroud)

(使用第二种形式)对此:

SELECT AddGeometryColumn('public', 'facilities', 'walk_area', 4326, 'POLYGON', 2, true);
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.


Erw*_*ter 5

PostgreSQL支持函数重载

使用重载的函数(就像您显然拥有的那样),仅具有文本文字(而没有显式类型强制转换)的调用可能是模棱两可的。

通常,向参数文字添加显式类型强制转换可以解决此问题。任意示例:

SELECT my_fuc('foo'::text, 0.001::numeric, 123::int);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,此调用是不明确的:

addGeometryColumn('vertices_tmp', 'the_geom', 4326, 'POINT', 2)
Run Code Online (Sandbox Code Playgroud)

请注意以下几点:

  • 所有未加引号的标识符在Postgres中都转换为小写addGeometryColumn(...)实际上与相同addgeometrycolumn(...)

  • 您可能需要对功能名称进行模式限定,以使其清晰。(也许您最近将search_path结果更改为令人惊讶的结果。

  • 如果确实有重载函数(并非罕见),请添加类型强制转换以使您的调用明确无误。

  • 为重载函数定义参数默认值会使先前唯一的调用变得am昧。