使用表值参数

时间:2018-02-08 16:27:30

标签: sql postgresql plpgsql

我有一个表值函数,它使用一个参数来过滤表并返回结果:

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);

它返回:

enter image description here

到目前为止一切顺利。然而,我真正想做的是过滤一个值列表而不是一个值。我认为这样做的方法是使用我使用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类型的变量并将其传递给我的函数?

1 个答案:

答案 0 :(得分:1)

working example

这里有两件事:

 WHERE   i IN (_filter);

应替换为

 WHERE   row(i) IN (_filter);

并致电:

select * from filterer(row(1));

我认为这个问题纯粹是学术性的,因为我无法看到这种类型的使用?...

CREATE TYPE tp AS (i int);