関数にはいくつかのsmallint
があります パラメータ。
ただし、呼び出しでは、タイプinteger
であると推定される数値リテラルを使用しています。 。
文字列リテラルまたは文字列定数('123'
)はすぐには入力されません。明示的に割り当てられるかキャストされるまで、タイプは「不明」のままです。
ただし、数値リテラルまたは数値定数 すぐに入力されます。マニュアル:
小数点も指数も含まない数値定数は、最初はタイプ
integer
であると推定されます。 その値がタイプinteger
に適合する場合 (32ビット);それ以外の場合は、typebigint
であると見なされます。 その値がタイプbigint
に適合する場合 (64ビット);それ以外の場合は、タイプnumeric
と見なされます 。小数点や指数を含む定数は、常に最初はタイプinteger
であると見なされます。 。
参照:
- PostgreSQLエラー:関数to_tsvector(文字が変化する、不明)が存在しません
解決策
smallint
の明示的なキャストを追加します パラメータまたは引用符で囲まれた(型指定されていない)リテラルを渡します。
デモ
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
間違った呼び出し:
SELECT * FROM f_typetest(1);
正しい呼び出し:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>ここでフィドル
古いsqlfiddle。