Postgres函数内无法获取输入参数值提示列不存在如何解决
错误原因
- 你创建的函数指定了
LANGUAGE 'sql',属于SQL语言函数,本身不支持RAISE NOTICE语法,该语法是PL/pgSQL语言的专属特性。 - 函数体中嵌套的
DO代码块是独立的执行上下文,默认无法访问外层SQL函数的入参sample,DO块作用域内没有该变量,因此执行时会抛出「字段sample不存在」的报错。
修复方案
方案1:将函数改为PL/pgSQL类型(推荐)
直接修改函数的语言类型为plpgsql,移除多余的DO嵌套,可直接访问入参并打印日志:
CREATE OR REPLACE FUNCTION public.test_function( sample integer) RETURNS json LANGUAGE plpgsql COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ BEGIN raise notice 'test: %',sample; return json_agg(1); END $BODY$; select test_function(10);
方案2:保留SQL函数格式,给DO块传参
如果必须使用SQL语言函数,可通过USING关键字将外层参数传入DO块内部使用:
CREATE OR REPLACE FUNCTION public.test_function( sample integer) RETURNS json LANGUAGE 'sql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ DO $$ BEGIN raise notice 'test: %', $1; END $$ USING sample; select json_agg(1); $BODY$; select test_function(10);
内容的提问来源于stack exchange,提问作者Vishnu Babu
相关产品推荐
相关产品推荐

