Fungsi Anda memiliki beberapa smallint
parameter.
Tetapi dalam panggilan, Anda menggunakan literal numerik yang dianggap sebagai tipe integer
.
String literal atau konstanta string ('123'
) tidak langsung diketik. Itu tetap ketik "tidak diketahui" sampai ditugaskan atau dilemparkan secara eksplisit.
Namun, literal numerik atau konstanta numerik langsung diketik. Panduan:
Konstanta numerik yang tidak mengandung titik desimal maupun eksponen awalnya dianggap bertipe
integer
jika nilainya cocok dengan jenisinteger
(32 bit); jika tidak maka dianggap tipebigint
jika nilainya cocok ketikbigint
(64 bit); jika tidak, dianggap sebagai tipenumeric
. Konstanta yang berisi titik desimal dan/atau eksponen awalnya selalu dianggap bertipenumeric
.
Lihat juga:
- ERROR PostgreSQL:fungsi to_tsvector(karakter bervariasi, tidak diketahui) tidak ada
Solusi
Tambahkan pemeran eksplisit untuk smallint
parameter atau meneruskan literal yang dikutip (tidak diketik).
Demo
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Panggilan salah:
SELECT * FROM f_typetest(1);
Panggilan yang benar:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>main biola di sini
sqlfiddle lama.