6

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

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 签名有关吗?如果是这样,我该如何解决?

谢谢

4

2 回答 2

7

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

解决了这个问题。

于 2014-06-23T19:05:23.343 回答
6

PostgreSQL 支持函数重载

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

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

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

在你的情况下,这个调用是模棱两可的:

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

请注意以下几点:

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

  • 您可能需要对函数名称进行模式限定以使其明确。(也许你最近改变了search_path导致出人意料的结果。

  • 如果您确实有重载函数(并不少见),请添加类型转换以使您的调用明确。

  • 为重载函数定义参数默认值会使以前唯一的调用变得不明确。

于 2012-09-08T16:14:10.320 回答