postgtresql参数有多种类型

时间:2017-12-03 10:16:00

标签: postgresql

是否可以定义一个可以为同一参数接受多种类型的PostgreSQL函数?例如,给定以下功能:

CREATE OR REPLACE FUNCTION foo (
    bar INTEGER
)
RETURNS SETOF RECORD AS
    ...

是否有某种方式可以更改bar以允许数组类型,类似这样(但我知道这不起作用):

CREATE OR REPLACE FUNCTION foo (
    bar INTEGER OR INTEGER[]
)
RETURNS SETOF RECORD AS
    ...

2 个答案:

答案 0 :(得分:2)

您可以使用多态类型anyelement和函数pg_typeof(),例如:

create or replace function test(anyelement)
returns text language plpgsql as $$
begin
    if pg_typeof($1) = 'integer'::regtype then
        return format ('integer: %s', $1);
    elsif pg_typeof($1) = 'integer[]'::regtype then
        return format ('int array: %s', $1);
    else
        return format ('other: %s', $1);
    end if;
end $$;

select test(1), test(array[1,2]), test('text'::text);

    test    |       test       |    test     
------------+------------------+-------------
 integer: 1 | int array: {1,2} | other: text
(1 row) 

请注意,当函数是字符串文字时(与具有常规类型参数的函数相对),函数无法解析参数的类型,例如

select test('1');

ERROR:  could not determine polymorphic type because input has type unknown

在典型情况下,两个重载函数将是更好的方法。多态类型有其局限性。

了解更多关于:

答案 1 :(得分:0)

不,你必须为它创建两个具有相同名称的函数:

t=# create or replace function fi(a int) returns text as $$
begin
return a;
end;
$$ language plpgsql;
CREATE FUNCTION
t=# create or replace function fi(a int[]) returns text as $$
begin
return a;
end;
$$ language plpgsql;
CREATE FUNCTION
t=# select fi(3);
 fi
----
 3
(1 row)
t=# select fi('{3,4}'::int[]);
  fi
-------
 {3,4}
(1 row)