PostgreSQL整数返回型PL/pgSQL函数报无结果目的地错误的原因
PL/pgSQL函数裸SELECT报错的原因解析
为什么会触发「query has no destination for result data」报错
PL/pgSQL 对执行语句的结果流转有明确的语法约束:
- 所有会产生查询输出的语句,必须显式指定结果的存放位置
- 如果确实只需要执行查询逻辑、不需要保留结果,官方要求必须用
PERFORM替代SELECT,明确传递「丢弃结果」的意图 - 你写的裸
SELECT postid语句,既没有绑定接收结果的变量,也没有被标记为函数的返回内容,解释器无法判定这行查询的结果要流向哪里,因此直接触发语法校验错误。
为什么函数不能直接通过裸SELECT返回查询结果
首先需要明确:PL/pgSQL函数不是不能返回SELECT的查询结果,而是不能用“写完裸SELECT就结束”的方式直接返回。
PL/pgSQL属于过程化编程语言,函数的返回值必须通过显式的RETURN语句传递,过程块内的普通SELECT语句默认属于中间执行逻辑,不会自动成为函数的返回值出口——这和纯SQL编写的函数可以直接把SELECT结果作为返回值的逻辑有明显区别。
要正确返回SELECT的查询结果,只需要把查询结果和返回动作绑定即可,适配你这个单整数返回场景的常用写法有两种:
- 写法1:通过
INTO把查询结果存入声明的变量,再显式返回变量
CREATE OR REPLACE FUNCTION validate(_identityid integer, _postid integer) RETURNS integer LANGUAGE plpgsql AS $$ DECLARE v_target_postid integer; BEGIN SELECT postid INTO v_target_postid FROM post WHERE postid = _postid AND identityid = _identityid; RETURN v_target_postid; END; $$;
- 写法2:单值查询场景下,可以直接把SELECT子查询作为RETURN的参数,写法更简洁
CREATE OR REPLACE FUNCTION validate(_identityid integer, _postid integer) RETURNS integer LANGUAGE plpgsql AS $$ BEGIN RETURN ( SELECT postid FROM post WHERE postid = _postid AND identityid = _identityid ); END; $$;
注:如果查询不到匹配的记录,上述写法都会返回NULL,刚好匹配身份校验类函数的预期逻辑。
内容的提问来源于stack exchange,提问作者volume one
相关产品推荐
相关产品推荐

