Postgresql中动态生成游标

3

我有一个光标,它指向一个SELECT语句,但这个SELECT语句是动态生成的。我想在声明之后分配语句。 我已经做了一个可行的示例和一个不可行的示例。这只是一个简单的示例,仅打印一些数据。 这是表格:

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

这是函数(我已经放置了可工作和不可工作的代码):
CREATE OR REPLACE FUNCTION public.dynamic_table
(
)
RETURNS text AS $$
DECLARE
       v_sql_dynamic varchar;

       --NOT WORKING:
       --db_c CURSOR IS (v_sql_dynamic::varchar);

       --WORKING:
       db_c CURSOR IS (SELECT id, name from public.my_columns);

       db_rec RECORD;

BEGIN
     v_sql_dynamic := 'SELECT id, name from public.my_columns';
    FOR db_rec IN db_c LOOP

        RAISE NOTICE 'NAME: %', db_rec.name;
    END LOOP;
    RETURN 'OK';

EXCEPTION WHEN others THEN

    RETURN 'Error: ' || SQLERRM::text || ' ' || SQLSTATE::text;
END; 
$$ LANGUAGE plpgsql;

有什么想法吗?

谢谢。

1个回答

11

你真的需要显式游标吗?如果你需要迭代动态SQL,则可以使用FOR IN EXECUTE。它循环遍历动态SQL的隐式(内部)游标。

FOR db_rec IN EXECUTE v_sql_dynamic
LOOP
  ..
END LOOP

更加复杂的解决方案在文档中有详细描述 - OPEN FOR EXECUTE

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


我需要执行打开。谢谢。 - Za7pi
我相信你也必须声明rec变量:rec record; - Vesanto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接