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 は確かにオーバーロードされています。3 つのプロトタイプは次のとおりです。

    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);

(これは 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 に答える