错误信息:function xxx does not exist. No function matches the given name and argument types. You might need to add explicit type casts

函数找不到可能的原因
1、当前schema下不存在对应的函数(例如未增加schema名称,或当前连接的schema非public,且函数创建在public下)
2、传参类型不正确(PG系列的数据库都是有这个强制约束的貌似,数据库不会给你自动转换类型,需要调用者自己格式化类型。例如定义传入Varchar,而你传入了int,就会报错,有想法的同学可以自己验证一下,若我说明错误请回来告诉我)
3、数据库确实没有这个函数(例如未执行创建函数脚本,或者遇到我下面要说的情况)

确认函数是否存在可以使用以下脚本查询(p_inittask换成你需要查询的函数名称)

select proc.proname 函数名称, ns.nspname 所属模式名称, proc.proowner 所有者ID,与pg_autid关联, proc.proargtypes 函数参数列表,与pg_type关联, proc.prosrc 函数实例脚本 from pg_proc proc inner join pg_namespace ns on proc.pronamespace = ns.oid where proc.proname like '%p_inittask%'

应用报错function does not exist

java.sql.SQLSyntaxErrorException: [Pivotal][Greenplum JDBC Driver][Greenplum]function db_task_15.p_inittask(unknown, unknown, unknown, unknown) does not exist. No function matches the given name and argument types. You might need to add explicit type casts.
	at com.pivotal.jdbc.greenplumbase.ddcd.b(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.ddcd.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.ddcc.b(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.ddcc.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplum.wp.dde.m(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplum.ddf.c(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplum.ddf.d(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplum.ddf.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.dddk.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.dddq.b(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.dddk.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.dde2.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.ddfa.a(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.BaseConnection.prepareCall(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at com.pivotal.jdbc.greenplumbase.BaseConnection.prepareCall(Unknown Source) ~[greenplum-5.21.1.jar:na]
	at net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy.prepareCall(ConnectionSpy.java:791) ~[thunisoft-log4jdbc-log4j2-1.17.1-SNAPSHOT.jar:na]
	at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareCall(NewProxyConnection.java:643) [c3p0-0.9.1.2.jar:0.9.1.2]
	at com.thunisoft.export15xml.taskmgr.HybzkTaskInitPolicy$1.createCallableStatement(HybzkTaskInitPolicy.java:129) [classes/:na]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:930) [spring-2.5.6.jar:2.5.6]
	at com.thunisoft.export15xml.taskmgr.HybzkTaskInitPolicy.initAjExpTask(HybzkTaskInitPolicy.java:124) [classes/:na]
	at com.thunisoft.export15xml.taskmgr.HybzkTaskInitPolicy.initTask(HybzkTaskInitPolicy.java:60) [classes/:na]
	at com.thunisoft.export15xml.taskmgr.TaskService.initIncrementTask(TaskService.java:716) [classes/:na]
	at com.thunisoft.export15xml.taskmgr.ScheduledTask$1.initTask(ScheduledTask.java:246) [classes/:na]
	at com.thunisoft.export15xml.taskmgr.ScheduledTask$1.checkAndStart(ScheduledTask.java:212) [classes/:na]
	at com.thunisoft.export15xml.taskmgr.ScheduledTask$1.run(ScheduledTask.java:101) [classes/:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
	at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]

在Navicat中看了一眼,函数p_inittask存在

实际不存在,因为现在的名字叫`p_inittask(expertid int4, qssj varchar, jssj varchar, addprop v`
刚开始我也注意到了这个地方,还以为是greenplum特殊的语法,末尾加个v能代替varchar呢,现在想想真的是弱鸡呀

瞎折腾一番

确认函数所在模式,应用配置的默认模式,函数名称拼写等乱七八糟的试了一堆,然而并没有什么卵用

问问谷歌大神

所有结果都指向函数确实不存在…但是我的函数是存在的呀!这可咋整?

使用系统视图确认函数是否存在

哎呀,貌似发现了个问题,为啥内个`p_inittask`这么特殊?后面咋还有`(expertid int4 xxx`? 来看看函数的创建脚本

CREATE OR REPLACE FUNCTION "db_xxx"."p_inittask(expertid int4, qssj varchar, jssj varchar, addprop v"(expertid int4, qssj varchar, jssj varchar, addprop varchar)
  RETURNS "pg_catalog"."void" AS $BODY$
//省略主体

哦豁!这脚本咋成这样了?函数名为啥这熊样?说别的没用,先修改成正确的试试

CREATE OR REPLACE FUNCTION db_xxx.p_inittask(expertid int4, qssj varchar, jssj varchar, addprop varchar)
  RETURNS "pg_catalog"."void" AS $BODY$
//省略主体

再重新跑,问题解决…原因就是现有的函数不知因为啥不可描述的原因被污染了,导致函数名称变成了一个极其特殊的字符串,原因未定位…怀疑是手工传递执行的过程中出了啥不可描述的异常。

PS:忽略截图中倒数第二个函数,那个是我重新创建后执行的查询脚本,没及时截图,将就看吧。
PSS:不要吐槽函数写的烂,初版不是这样的,后来换了几个团队维护后就这样了,里面还有更烂的就不给你们看了!!!给下个维护团队留个彩蛋吧(已经跟下个团队说了有一堆坑,希望他们能填完吧)。

最后再给你们看个排序后的,比较明显

 

PSSS:把内网的回帖也贴上,原因大概率为Navicat自动格式化脚本导致的

你这个错误9成原因就是navicat引起的,他不是直接把编辑框里的内容交给服务器运行,会先自己解析转换一下(做一些格式化,比如帮你给对象名加上双引号,楼主例子中就给加错了),特别是在abase在处理对象名称与原生pg是有出入的,遇到过类似的好几次问题了。尽量还是推荐使用abase官方提供的客户端abAdmin,而不是兼容pg的这些客户端。

很多人平时写sql时顺手了,会养成习惯把正式sql文件里的内容也复制到sql编辑器里运行,其实是不太推荐的。如上例,可能会被编辑器做二次处理污染,造成执行结果差异。
推荐通过类似psql -f xxx.sql来`直接运行`sql文件。非要用navicat的话,可以使用

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐