pgAdmin4导入合法SQL函数时出现return type mismatch报错求助
报错原因分析
该报错与返回值声明无关,核心触发原因是pgAdmin图形化创建函数的模板冲突:
- pgAdmin默认的函数创建模板适配
plpgsql语言,会自动生成BEGIN/END语句块,你粘贴的是language sql类型的函数代码,不需要包裹块结构,多余的模板代码会导致函数逻辑识别异常,触发该错误。
解决方案
方案1(推荐)
直接打开pgAdmin的查询工具,将你编写的完整CREATE FUNCTION代码粘贴到查询窗口执行,即可正常创建函数。
方案2(使用图形化向导)
打开创建函数界面后,先将语言下拉选项改为SQL,清空界面自动生成的所有模板代码,再粘贴你编写的函数逻辑后保存即可。
函数使用示例
你编写的函数为JSON对象全匹配删除逻辑,针对你给出的测试数组,执行以下调用即可实现需求:
SELECT remove_element( '[ {"game": "cyberpunk-2077"}, {"game": "new-pokemon-snap"} ]'::jsonb, '{"game": "cyberpunk-2077"}'::jsonb );
返回结果:
[{"game": "new-pokemon-snap"}]
扩展方案(按指定字段值删除)
如果不需要传入完整匹配对象,仅需根据game字段值删除对应元素,可使用以下变体函数:
create function remove_element_by_game(p_input jsonb, p_game_to_remove text) returns jsonb as $$ select coalesce(jsonb_agg(t.item order by t.idx), '[]') from jsonb_array_elements(p_input) with ordinality as t(item, idx) where t.item ->> 'game' <> p_game_to_remove; $$ language sql immutable;
调用示例:
SELECT remove_element_by_game( '[ {"game": "cyberpunk-2077"}, {"game": "new-pokemon-snap"} ]'::jsonb, 'cyberpunk-2077' );
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

