Я думаю, что вы не можете сделать это с Postgres - или вы не можете сделать это без нежелательных побочных эффектов.
Postgres - это система строгого типа - поэтому вся работа с типами должна выполняться Postgres.
Но вы можете перегружать функции для некоторого набора типов параметров:
CREATE OR REPLACE FUNCTION public.f1(numeric)
RETURNS numeric
LANGUAGE plpgsql
AS $function$
begin
return $1;
end;
$function$
CREATE OR REPLACE FUNCTION public.f1(text)
RETURNS text
LANGUAGE plpgsql
AS $function$
begin
raise exception 'only numeric type is supported';
end;
$function$
postgres=# select f1(10);
+----+
| f1 |
+----+
| 10 |
+----+
(1 row)
postgres=# select f1('ahoj');
ERROR: only numeric type is supported
CONTEXT: PL/pgSQL function f1(text) line 3 at RAISE
Но настоятельно не рекомендую использовать этот шаблон.Перегрузка - это дикое оружие - он может быть хорошим или плохим другом, и его следует использовать только тогда, когда это требуется и когда он может выполнять какую-то работу - его не следует использовать просто для вызова исключения.Это работа для системы типов postgres - она работает лучше (хотя с другим и, возможно, на первый взгляд странным сообщением об ошибке).