Postgres:如何重载具有单个记录类型输入参数的函数

时间:2018-03-13 06:13:04

标签: postgresql overloading plpgsql

我有一个用户定义的类型:

create type match_input as (
  _values text[],    
  _name text, 
  _norm_fn text, 
  _operator text
);

我用它作为函数的输入参数:

get_matches(mi match_input)

我希望能够调用相同的函数,但为_values传递单个文本值。所以我定义了一个新类型:

 create type match_input_simple as (
  _values text,    
  _name text, 
  _norm_fn text, 
  _operator text
);

如果我尝试使用以下内容重载该函数:

create or replace function get_matches(_mis match_input_simple)
  returns setof contact_index
as $func$
  select get_matches((array[_mis._values], _mis._name, 
_mis._norm_fn, _mis._operator)::match_input);
$func$
language sql strict;

该函数无需抱怨即可编译,但是当我运行该函数时,我收到此错误:

ERROR:  function get_matches(record) is not unique
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

所以看起来postgres在尝试决定运行哪个函数时,无法区分我的两种不同记录类型。 我不希望用户每次调用函数时都必须显式地键入转换记录,因为这样做会使尝试简化接口的目的失败。

2 个答案:

答案 0 :(得分:0)

对类似功能的类型感到困惑。显式类型转换可能有所帮助。像

SELECT get_matches(val::match_input_simple)

或者

SELECT get_matches(val::match_input )

取决于val的类型

答案 1 :(得分:0)

没有施法就无法完成。

请记住,您可以拥有多个具有完全相同内容的类型,并为每个类型创建重载。数据库如何选择正确的类型和功能?