CREATE OR REPLACE FUNCTION try_cast(_value TEXT,
INOUT _default ANYELEMENT)
AS
$$
BEGIN
EXECUTE FORMAT('SELECT %L::%s', $1, PG_TYPEOF(_default)) INTO _default;
EXCEPTION
WHEN OTHERS THEN
-- do nothing: _out already carries default
END
$$ LANGUAGE "plpgsql";
SELECT try_cast('123', NULL::INT), try_cast('12a', NULL::INT);