Za7*_*7pi 1 postgresql dynamic plpgsql cursor
我有一个光标,它指向一个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');
Run Code Online (Sandbox Code Playgroud)
这是函数(我已经把工作代码和代码不起作用):
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;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢.
你真的需要显式游标吗?如果需要迭代动态SQL,那么您可以使用FOR IN EXECUTE.它是动态SQL的隐式(内部)游标的循环
FOR db_rec IN EXECUTE v_sql_dynamic
LOOP
..
END LOOP
Run Code Online (Sandbox Code Playgroud)
文档中描述了一些更复杂的解决方案- 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 $$;
Run Code Online (Sandbox Code Playgroud)
有了这种光标,就无法使用 FOR IN
| 归档时间: |
|
| 查看次数: |
5091 次 |
| 最近记录: |