我有一个表值函数,它使用一个参数来过滤表并返回结果:
drop table if exists mytbl;
create table mytbl (i int);
insert into mytbl (i) values (1),(2),(3);
CREATE FUNCTION filterer(
_filter int
)
RETURNS TABLE(i_ret int)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
RETURN QUERY SELECT i
FROM mytbl
WHERE i = _filter;
END;
$BODY$;
select * from filterer(1);
它返回:
到目前为止一切顺利。然而,我真正想做的是过滤一个值列表而不是一个值。我认为这样做的方法是使用我使用CREATE TYPE定义的类型创建一个表值参数,但我无法使其工作。这是我到目前为止所做的:
drop table if exists mytbl;
create table mytbl (i int);
DO $$
BEGIN
IF NOT EXISTS (SELECT * FROM pg_type t WHERE t.typname = 'tp') THEN
CREATE TYPE tp AS (i int);
END IF;
END$$;
insert into mytbl (i) values (1),(2),(3);
DROP FUNCTION public.filterer(tp);
CREATE FUNCTION filterer(
_filter tp
)
RETURNS TABLE(i_ret int)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
RETURN QUERY SELECT i
FROM mytbl
WHERE i IN (_filter);
END;
$BODY$;
select * from filterer(1);
当我运行该代码时,它失败了:
错误:函数过滤器(整数)不存在第23行:选择* 来自filterer(1);
如何声明tp
类型的变量并将其传递给我的函数?
答案 0 :(得分:1)
这里有两件事:
WHERE i IN (_filter);
应替换为
WHERE row(i) IN (_filter);
并致电:
select * from filterer(row(1));
我认为这个问题纯粹是学术性的,因为我无法看到这种类型的使用?...
CREATE TYPE tp AS (i int);