Мои пользователи и я не используем перегрузку функций в PL/pgSQL. У нас всегда есть одна функция для (схема, имя) кортежа. Таким образом, мы хотели бы отказаться от функции только по имени, изменить ее подпись, не отбрасывая ее сначала и т.д. Рассмотрим, например, следующую функцию:
CREATE OR REPLACE FUNCTION myfunc(day_number SMALLINT)
RETURNS TABLE(a INT)
AS
$BODY$
BEGIN
RETURN QUERY (SELECT 1 AS a);
END;
$BODY$
LANGUAGE plpgsql;
Чтобы сэкономить время, мы хотели бы вызвать его следующим образом, без квалификации 1 с ::SMALLINT
, потому что есть только одна функция с именем myfunc, и она имеет ровно один параметр с именем day_number:
SELECT * FROM myfunc(day_number := 1)
Нет двусмысленности, а значение 1 соответствует типу SMALLINT
, но PostgreSQL жалуется:
SELECT * FROM myfunc(day_number := 1);
ERROR: function myfunc(day_number := integer) does not exist LINE 12: SELECT * FROM myfunc(day_number := 1); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Когда мы вызываем такие функции из Python, мы используем оболочку, которая ищет сигнатуры функций и определяет параметры с типами. Этот подход работает, но, похоже, есть потенциал для улучшения.
Есть ли способ полностью отключить перегрузку функций?