PostgreSQL如何声明变量并将执行结果以表格形式输出
PostgreSQL副本模式下DO块输出表格结果的解决方案
DO匿名代码块本身没有预定义的返回结构,不支持直接返回查询结果集,因此你将RAISE NOTICE替换为SELECT语句时会触发报错,默认只能通过消息通道输出通知内容。
由于你工作在只读副本模式下,不能创建持久化存储对象,可通过两种会话级临时方案实现表格形式输出:
方案1:使用临时返回表函数
创建会话级临时函数,显式定义返回表结构,执行函数即可直接得到表格结果,临时函数会在会话结束后自动删除,不写入持久化存储,兼容副本只读限制。
代码示例:
-- 创建临时函数,定义返回表结构 CREATE OR REPLACE TEMP FUNCTION get_calculate_result() RETURNS TABLE (counter int, size varchar) LANGUAGE plpgsql AS $$ DECLARE _counter int := 0; _max_id int; BEGIN SELECT max(id) INTO _max_id FROM public.customers WHERE country='USA'; WHILE _counter <= _max_id LOOP _counter := _counter + 1; -- 给返回字段赋值 counter := _counter; SELECT size INTO size FROM public.function_calculate_size(_counter, 'type_by_country'); RETURN NEXT; -- 返回当前行 END LOOP; END $$; -- 执行函数获取表格结果 SELECT * FROM get_calculate_result();
方案2:使用临时表中转结果
先创建会话级临时表存储计算结果,在DO块中把结果写入临时表,最后查询临时表得到表格输出,临时表同样会在会话结束后自动销毁。
代码示例:
-- 创建存储结果的临时表 CREATE TEMP TABLE IF NOT EXISTS temp_calculate_result ( counter int, size varchar ); -- 修改后的DO块,将结果插入临时表 DO $do$ DECLARE _counter int := 0; _size varchar; _max_id int; BEGIN SELECT max(id) INTO _max_id FROM public.customers WHERE country='USA'; WHILE _counter <= _max_id LOOP _counter := _counter + 1; SELECT size INTO _size FROM public.function_calculate_size(_counter, 'type_by_country'); INSERT INTO temp_calculate_result VALUES (_counter, _size); END LOOP; END $do$; -- 查询临时表得到表格结果 SELECT * FROM temp_calculate_result;
内容的提问来源于stack exchange,提问作者Gross
相关产品推荐
相关产品推荐

