2

ある場所で私は

CREATE FUNCTION updateGeo2(text, float4, float4) RETURNS float AS $$

後で続く

SELECT updateGeo2('area', 40.88, -90.56);

そして私は得る

error : ERROR:  function updategeo2(unknown, numeric, numeric) does not exist

したがって、テキスト変数、続いてfloat変数、および別のfloat変数を渡そうとしたことはわかりません。これらは、「不明、数値、および数値」と見なされます。渡すタイプを通知するにはどうすればよいですか?

4

2 に答える 2

2

この方法を試してください:

SELECT updateGeo2('area', (40.88)::float4, (-90.56)::float4);
于 2012-12-07T20:05:18.717 に答える
0

誤解を解く

まず第一に、これは型キャストなしでそのまま動作するはずです。PostgreSQL 9.1、9.2、および8.4.15でテストしました。以前のポイント リリースを実行している必要があります。または、その他の誤解 ( wrong などsearch_path) があります。あなたの情報は誤解を招くものです。

アドホック コールを除き、あいまいさを解消するために、明示的な型キャストを常に追加する必要があります。PostgreSQL では、関数のオーバーロードが許可されています。署名を使用して別の関数を作成する必要がある場合:

CREATE FUNCTION updateGeo2(text, numeric, numeric) RETURNS text AS $$ ..

numeric...数値リテラルのデフォルトの型により、他のものよりも優先されます。既存のコードが壊れる可能性があります。

一方、関数を追加すると、次のようになります。

CREATE FUNCTION updateGeo2(char(5), numeric, numeric) RETURNS text AS $$ ..

その後、Postgres は何をすべきかわからなくなり、例外をスローします。

エラー: 関数 updategeo2(不明、数値、数値) は一意ではありません

適切な構文

SELECT updateGeo2('area', '40.88'::float4, '-90.56'::float4);

または、標準 SQL でより詳細に:

SELECT updateGeo2('area', cast('40.88' AS float4), cast('-90.56' AS float4));

または、単一引用符 (およびコロン) を本当に避けたい場合は、次のようにします。

SELECT updateGeo2('area', float4 '40.88', float4 '-90.56');

このようにして、数値リテラルをデータ型float4(= real) に直接キャストします。型キャスト
の 詳細については、マニュアルを参照してください。

(40.88)::float4も機能しますが、微妙に効果が低くなります。まず、40.88は型numeric(ドットを含むこの数値リテラルの既定の型) であると見なされます。次に、値が にキャストされfloat4ます。2 つの型キャストを行います。

数値定数の詳細については、マニュアルを参照してください。

于 2012-12-07T20:37:42.890 に答える