我正在尝试使用以下功能;
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签名有什么关系吗?如果是的话,我该如何解决?
由于
答案 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);
解决了这个问题。