You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java代码执行PostgreSQL自定义函数提示不存在问题求助

问题根因排查

  • 函数参数类型不匹配:PostgreSQL要求调用函数时传入的参数类型和定义时的参数类型严格匹配。你的报错显示第二个参数被识别为unknown类型,说明Java运行时JDBC驱动没有正确推断出第二个参数的date类型,而DBeaver自带的客户端类型解析规则更宽松,能自动匹配到正确的函数签名。
  • Schema搜索路径不匹配:你创建的自定义函数可能不在Java数据库连接用户默认的search_path中,DBeaver登录的用户配置了包含函数所在Schema的搜索路径,因此可以正常找到函数,Java连接用户无相关配置就会提示函数不存在。
  • 函数签名定义不符:你实际定义的函数名是get_my_function还是my_function?报错里的函数名是my_function,但你SQL里调用的是get_my_function,如果是Java侧拼接SQL时写错了函数名也会触发该报错。

解决方案

  • 显式强转参数类型:调用函数时给第二个参数加上明确的类型声明,避免JDBC识别为unknown类型,修改后的SQL如下:
select * from my_table where my_id = (select get_my_function(1223, TO_DATE('2021-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:DD')::date) as my_id)

如果函数定义的第二个参数是timestamp类型,就改成::timestamp强转即可。

  • 显式指定函数所在Schema:调用函数时加上Schema前缀,例如你的函数存在于public schema下,就写成:
select * from my_table where my_id = (select public.get_my_function(1223, TO_DATE('2021-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:DD')) as my_id)

也可以在Java建立数据库连接后先执行一次设置搜索路径的语句:set search_path to 你的函数所在Schema, public;

  • 核对函数签名:确认函数的实际名称、参数数量、参数顺序和类型和调用时完全一致,你可以在PostgreSQL中执行\df get_my_function查看函数的完整定义,和调用时的参数逐一比对。

额外注意点

你当前使用的日期转换格式串'YYYY-MM-DD HH24:MI:DD'存在错误,最后一位的DD代表日期,如果需要转换到秒维度请改为'YYYY-MM-DD HH24:MI:SS',避免出现日期转换结果不符合预期的问题。

内容的提问来源于stack exchange,提问作者Avinash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:08