plpgsql函数的动态部分

dim*_*r91 3 sql postgresql plpgsql

我有一个循环遍历所有点并将它们与其他点进行比较的函数(是的,我知道这不需要在plpgsql中完成 - 这是一个玩具MWE).该函数返回具有最大x坐标的点:

create type point as (x integer, y integer);
create or replace function test() returns set of Point as
$$
declare
    p1 point;
    p2 point;
    bool integer;
begin
for p1 in select * from table loop
    bool := 0;
    for p2 in select * from table loop
        if p2.x > p1.x then bool :=1;
        exit;
        end if;
    end loop;
    if bool = 0 then return next p1;
    end if;
end loop;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

哪个有效.我想要做的是能够将表名作为函数的参数,我对于放置execute语句的位置感到困惑.

Vao*_*sun 6

https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html:

FOR-IN-EXECUTE语句是迭代行的另一种方法:

t=# do
$$
declare
  _t text := 'pg_tables';
  _r record;
begin
  for _r in execute format('select * from %I limit 4',_t) loop
    raise info '%',_r.tablename;
  end loop;
end;
$$
;
INFO:  s141
INFO:  events
INFO:  tg_rep_que
INFO:  t4
DO
Run Code Online (Sandbox Code Playgroud)