是否可以定义一个可以为同一参数接受多种类型的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
...
答案 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)