13

如何创建一个函数,该函数将整数 [] 参数作为参数,并在循环中使用此参数执行带有 IN 子句的查询。在循环中我想执行下一个选择和这个查询的结果我想返回。

像这样的东西:

CREATE OR REPLACE FUNCTION function_which_i_want(my_argument integer[]) RETURNS my_schema_and_table[] AS
$BODY$
DECLARE
result my_schema_and_table[];
BEGIN
FOR l IN SELECT * FROM table2 WHERE id in (my_argument) LOOP
SELECT * FROM my_schema_and_table;
END LOOP;
END;
...

我想在循环中获得每个选择的联合。一个巨大的联合结果。这可能吗?请帮忙。

4

2 回答 2

12

PL/pgSQL 函数

填补您问题中的空白,它可能如下所示:

CREATE OR REPLACE FUNCTION func1(_arr integer[])
  RETURNS SETOF target_table LANGUAGE plpgsql AS
$func$
DECLARE
    l record;
BEGIN

FOR l IN
    SELECT *
    FROM   lookup_table
    WHERE  some_id = ANY(_arr)
LOOP
    RETURN QUERY
    SELECT *
    FROM   target_table
    WHERE  link_id = l.link_id;
END LOOP;

END
$func$;
  • 如果要返回结果,SELECT * FROM my_schema_and_table;则必须以不同的方式处理整个函数。将其声明为RETURNS SETOF target_table

  • 假设您实际上想要 a SETof rows from your target_table,而不是数组?

  • IN将构造重写为= ANY(_arr). 这就是直接使用数组参数的方式。在内部,PostgreSQL 将 IN 表达式重写为= ANY()反正。测试EXPLAIN ANALYZE一下自己看看。
    或者使用结构 withunnest()并加入到结果表中,如@Clodoaldo 演示。使用长数组会更快。

简化为普通 SQL 函数

以上仍然是毫无意义的人为。简化为执行相同操作的 SQL 函数:

CREATE OR REPLACE FUNCTION func2(_arr integer[])
  RETURNS SETOF target_table LANGUAGE sql AS
$func$
SELECT t.*
FROM   (SELECT unnest($1) AS some_id) x
JOIN   lookup_table l USING (some_id) 
JOIN   target_table t USING (link_id); -- assuming both tables have link_id
$func$

称呼:

SELECT * FROM func2('{21,31}'::int[]);
于 2012-10-19T18:44:55.717 回答
4
CREATE OR REPLACE FUNCTION function_which_i_want(my_argument integer[])
RETURNS my_schema_and_table[] AS
$BODY$
DECLARE
result my_schema_and_table[];
BEGIN

for l in 
    select t.*
    from
        table2 t
        inner join
        unnest(my_argument) m(id) on m.id = t.id
loop
    SELECT * FROM my_schema_and_table;
END LOOP;
END;
于 2012-10-18T14:04:51.903 回答