Twoja funkcja ma kilka smallint
parametry.
Ale w wywołaniu używasz literałów numerycznych, które przypuszczalnie są typu integer
.
Literał ciągu lub stała ciąg ('123'
) nie jest wpisywany od razu. Pozostaje wpisz „nieznane”, dopóki nie zostanie przypisane lub rzucone jawnie.
Jednak literał numeryczny lub stała numeryczna jest wpisywany natychmiast. Instrukcja:
Stała numeryczna, która nie zawiera ani kropki dziesiętnej, ani wykładnika, jest początkowo integer
jeśli jego wartość mieści się w typie integer
(32 bity); w przeciwnym razie zakłada się, że jest to typbigint
jeśli jego wartość mieści się w typie bigint
(64 bity); w przeciwnym razie należy wpisać numeric
. Zawsze początkowo zakłada się, że stałe zawierające kropki dziesiętne i/lub wykładniki są typu numeric
.
Zobacz także:
- BŁĄD PostgreSQL:funkcja to_tsvector(znak zmienny, nieznany) nie istnieje
Rozwiązanie
Dodaj wyraźne rzutowania dla smallint
parametry lub przekaż cytowane (bez typu) literały.
Demo
CREATE OR REPLACE FUNCTION f_typetest(smallint)
RETURNS bool AS 'SELECT TRUE' LANGUAGE sql;
Nieprawidłowe połączenie:
SELECT * FROM f_typetest(1);
Prawidłowe połączenia:
SELECT * FROM f_typetest('1');
SELECT * FROM f_typetest(smallint '1');
SELECT * FROM f_typetest(1::int2);
SELECT * FROM f_typetest('1'::int2);
db<>graj tutaj
Stary sqlfiddle.