gpt4 book ai didi

postgresql - 在 Postgresql 中动态生成的 CURSOR

转载 作者:行者123 更新时间:2023-11-29 12:29:53 33 4
gpt4 key购买 nike

我有一个游标,它指向一个 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;

有什么想法吗?

谢谢。

最佳答案

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

FOR db_rec IN EXECUTE v_sql_dynamic
LOOP
..
END LOOP

稍微复杂一点的解决方案在documentation 中有所描述。 - 打开执行:

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

关于postgresql - 在 Postgresql 中动态生成的 CURSOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495593/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com