Postgresql中动态生成的游标

Postgresql中动态生成的游标,postgresql,dynamic,cursor,plpgsql,Postgresql,Dynamic,Cursor,Plpgsql,我有一个光标,它指向一个选择,但这个选择是动态生成的。我想在宣布后分配对账单。 我已经做了一个工作的例子和另一个不工作的例子。这是一个只打印一些数据的简单示例。 这是表格: CREATE TABLE public.my_columns ( id serial NOT NULL, "name" varchar(30) NOT NULL, /* Keys */ CONSTRAINT my_columns_pkey PRIMARY KEY (id) ) WITH (

我有一个光标,它指向一个选择,但这个选择是动态生成的。我想在宣布后分配对账单。 我已经做了一个工作的例子和另一个不工作的例子。这是一个只打印一些数据的简单示例。 这是表格:

CREATE TABLE public.my_columns (
  id      serial NOT NULL,
  "name"  varchar(30) NOT NULL,
  /* Keys */
  CONSTRAINT my_columns_pkey
    PRIMARY KEY (id)
) WITH (
    OIDS = FALSE
  );

CREATE INDEX my_columns_index01
  ON public.my_columns
  ("name");


INSERT INTO public.my_columns
    ("name")
VALUES
    ('name1'),
    ('name2'),
    ('name3'),
    ('name4'),
    ('name5'),
    ('name6');
这是函数(我已经输入了工作代码和不工作代码):

有什么想法吗


谢谢。

您真的需要显式光标吗?如果您需要迭代动态SQL,那么您可以使用
FOR IN EXECUTE
。它是动态SQL的隐式(内部)游标上的循环

FOR db_rec IN EXECUTE v_sql_dynamic
LOOP
  ..
END LOOP
稍复杂一点的解决方案在-
openforexecute
中描述:

do $$
declare r refcursor; rec record;
begin 
  open r for execute 'select * from pg_class'; 
  fetch next from r into rec;
  while found 
  loop
    raise notice '%', rec; 
    fetch next from r into rec; 
  end loop;
  close r; 
end $$;

有了这种游标,您就不能使用
FOR IN

OPEN FOR EXECUTE是我需要的。谢谢,我相信您还必须声明rec变量:rec record;
do $$
declare r refcursor; rec record;
begin 
  open r for execute 'select * from pg_class'; 
  fetch next from r into rec;
  while found 
  loop
    raise notice '%', rec; 
    fetch next from r into rec; 
  end loop;
  close r; 
end $$;