当前位置:  开发笔记 > 数据库 > 正文

在Postgresql中动态生成CURSOR

如何解决《在Postgresql中动态生成CURSOR》经验,为你挑选了1个好方法。

我有一个光标,它指向一个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> Pavel Stehul..:

你真的需要显式游标吗?如果需要迭代动态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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有