2012-09-08 3 views
3

Я пытаюсь использовать следующую функцию;ОШИБКА: функция addgeometrycolumn не уникальна

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? если да, то как я могу это исправить?

Благодаря

ответ

4

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(...).

  • Возможно, вам понадобится schema-qualify имя функции, чтобы сделать ее однозначной. (Может быть, вы недавно изменили search_path приводят к удивительному результату.

  • Если вы действительно имеете перегруженных функции (не редкость), добавить типа бросает, чтобы сделать ваши звонки однозначны.

  • Определением parameter defaults для перегружен функции могут сделать ранее уникальный вызов неоднозначного.

+0

Вы имеете в виду что-то вроде этого? = SELECT Assign_vertex_id ('ways' :: text, 0.00001 :: numeric, 'the_geom' :: text, 'gid' :: numeric. Извините, но я новичок в этих функциях. –

+1

@Ryan: Ваша функция 'Assign_vertex_id()' явно (прямо или косвенно) вызывает другую функцию: 'addgeometrycolumn()', и проблема заключается в этом вызове функции, - как ясно указано в сообщении об ошибке. Похоже, он вызывается в процессе создания таблицы автоматически. Поэтому вам нужно удалить одну из дополнительных копий 'addgeometrycolumn()' из вашей системы или добавить приведение типов к вызову в 'Assign_vertex_id()', чтобы сделать его однозначным. –

+0

Итак, как я могу исправить проблему, лежащую в вызове функции? Спасибо за ваш ответ –

5

Я также столкнулся с этой проблемой, и я думаю, что ОП может быть решено это неправильно. Во-первыхи, 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); 

решить эту проблему.