调用PostgreSQL返回void的PL/pgSQL函数时出现near "Perform"语法错误
PostgreSQL返回void的PL/pgSQL函数正确调用方案
报错原因说明
- 执行
perform public.perform1(123)语法报错:PERFORM是PL/pgSQL专属关键字,仅能在$$包裹的PL/pgSQL代码块内部使用,直接在SQL交互环境(pgAdmin、SQL Shell的顶层输入)执行时,SQL解析器不识别该关键字,因此触发语法错误。 - 执行
SELECT public.perform1(123)提示无结果接收目标:这个报错只会出现在PL/pgSQL代码块内部执行SELECT语句的场景,PL/pgSQL要求所有SELECT语句的结果必须赋值给变量,不需要保留结果时就需要用PERFORM替代SELECT。
正确调用方式
场景1:在SQL交互环境直接调用
直接执行SELECT语句即可,返回的空结果集不会影响功能执行:
SELECT public.perform1(123);
如果需要显式忽略返回结果,也可以用以下写法:
SELECT * FROM public.perform1(123);
场景2:在PL/pgSQL代码块内部调用
替换为PERFORM关键字调用:
-- 示例:匿名块中调用 DO $$ BEGIN PERFORM public.perform1(123); END $$;
替代方案(更推荐)
如果函数不需要返回值,建议改写为PostgreSQL 11及以上版本支持的存储过程,调用逻辑更统一:
-- 改写为存储过程 create procedure public.perform1(myid integer) language 'plpgsql' volatile security definer as $$ begin delete from tbl where tblid=myid; end; $$; -- 调用方式(交互环境、PL/pgSQL内部都适用) CALL public.perform1(123);
内容的提问来源于stack exchange,提问作者Jeb50
相关产品推荐
相关产品推荐

