错误:函数addgeometrycolumn不是唯一的

时间:2012-09-08 15:20:43

标签: database postgresql postgis pgrouting

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

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签名。当我运行以下命令时感觉完好;

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签名有什么关系吗?如果是的话,我该如何解决?

由于

2 个答案:

答案 0 :(得分:5)

PostgreSQL支持function overloading

使用重载函数(就像你显然那样),只调用文本文字(并且没有显式类型转换)的调用可能不明确。

通常,在参数文字中添加显式type casts可以解决问题。任意的例子:

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

在你的情况下,这个电话是不明确的:

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

请注意以下几点:

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

  • 您可能需要架构限定函数名称才能使其明确无误。 (也许您最近更改了search_path,导致了令人惊讶的结果。

  • 如果确实有重载功能(并非罕见),请添加类型转换以使您的通话明确无误。

  • 为重载函数定义parameter defaults可能会使先前唯一的调用不明确。

答案 1 :(得分:5)

我也遇到过这个问题,我认为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);

解决了这个问题。