请求排查PostgreSQL 9.6中json_object函数报错问题(Zabbix场景)
问题原因分析
这个报错的核心原因是你的PostgreSQL版本过低,不支持json_object(text[], text[])这种双数组参数的函数重载形式。
具体细节:
- PostgreSQL在10版本才新增了
json_object函数的双数组参数重载(也就是接受一个键数组和一个值数组来构建JSON对象)。 - 如果你使用的是PostgreSQL 9.x或更早的版本,
json_object只支持两种调用方式:- 传入交替的键值对参数:
json_object('key1', 'val1', 'key2', 'val2') - 传入一个包含键值对的二维数组:
json_object(array[['key1','val1'], ['key2','val2']])
- 传入交替的键值对参数:
你的SQL语句里用到了json_object(array_agg(name), array_agg(setting)),这正是PostgreSQL 10+才支持的双数组参数写法,低版本数据库找不到匹配的函数,所以抛出42883(函数不存在)的错误。
验证方法:
你可以在你的PostgreSQL实例里执行以下语句确认版本:
SELECT version();
如果版本号低于10.0,就完全符合这个问题的场景。
可选解决方向:
- 升级PostgreSQL到10或更高版本:这是最彻底的解决方案,能直接兼容模板里的SQL语句。
- 修改SQL适配低版本:把双数组参数的写法改成低版本支持的形式,比如用
array_agg(row(name, setting))生成二维数组,再传入json_object:select json_build_object( 'extensions',(select array_agg(extname) from (select extname from pg_extension order by extname) as e), 'settings', (select json_object(array_agg(row(name, setting))) from (select name,setting from pg_settings where name != 'application_name' order by name) as s) );
内容的提问来源于stack exchange,提问作者dzgrt
相关产品推荐
相关产品推荐

