PostgreSQL调用plpgsql函数出现query has no destination for result data错误如何解决
错误原因
在PL/pgSQL的语法规则中,执行SELECT查询时必须为返回的结果指定存储目的地,否则PostgreSQL无法处理无去向的查询数据,就会抛出query has no destination for result data错误。
你代码中未做结果处理的两条查询语句是直接触发原因:
select 'werewwer';select * from test_data where t_first_name='Shahbaz@gmail.com';
解决方案
根据你实际的业务需求选择对应修改方式即可:
方案1:不需要获取查询结果,仅需执行查询逻辑
直接将SELECT关键字替换为PL/pgSQL专属的PERFORM关键字即可,PERFORM的作用就是执行查询并主动丢弃返回结果,修改后的函数代码如下:
CREATE OR REPLACE FUNCTION public.tester01() RETURNS text LANGUAGE plpgsql AS $function$ DECLARE students text; BEGIN students:='success'; PERFORM 'werewwer'; PERFORM * from test_data where t_first_name='Shahbaz@gmail.com'; RETURN students; END; $function$ ;
修改后正常执行select tester01()即可得到返回值success。
方案2:需要获取查询结果做后续处理
使用SELECT ... INTO ...语法将查询结果赋值给提前声明的变量即可,示例如下(假设需要把test_data表的匹配行的某个text字段赋值给students变量):
CREATE OR REPLACE FUNCTION public.tester01() RETURNS text LANGUAGE plpgsql AS $function$ DECLARE students text; BEGIN -- 将查询结果赋值给students变量,添加LIMIT 1避免单值变量接收多行结果报错 SELECT t_column_name INTO students from test_data where t_first_name='Shahbaz@gmail.com' LIMIT 1; -- 无匹配结果时设置默认值 IF students IS NULL THEN students := 'success'; END IF; RETURN students; END; $function$ ;
如果查询需要返回多行结果,需要调整函数返回值类型为SETOF 对应类型/表结构,配合RETURN NEXT/RETURN QUERY语法返回结果。
内容的提问来源于stack exchange,提问作者Shahbaz Khan
相关产品推荐
相关产品推荐

