No operator matches the given name and argument type(s). You might need to add explicit type casts报错

Posted 老郑头zz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了No operator matches the given name and argument type(s). You might need to add explicit type casts报错相关的知识,希望对你有一定的参考价值。

一、报错信息:

PostgreSQL下数据类型转化报错:No operator matches the given name and argument type(s). You might need to add explicit type casts报错。
正式环境,出现如下问题:


但是公司内网测试环境竟然没有报错(离大谱)!!

二、出现问题原因为:

数据库字段中使用int2,参数类型为String,此时就会报 character varying = bigint错误。

三、解决方案:
(1)修改代码参数类型

有人就直接修改了代码参数类型,修改接口参数即可,然后再使用jenkins构建发布,幸运的话就直接解决问题了,倘如项目有很多诸如类似的问题,全局搜索后绝望无比。。。

(2)使用强转函数
那么有的人说不想修改参数怎么办,另一种方式就是修改xml中表的字段。

(3)创建新的类型转换

那么又有人说,我没有使用xml写sql语句,使用的注解方式(复杂sql不建议使用注解方式)或者说字段太多一个个修改效率太低怎么办?就不能像mysql和Oracle那样默认对数据类型进行转换吗?
pg确实没有实现数据类型的自动转换,但是!pg官方文档中也给出了相应处理方式,可以设置自定义的数据类型转换。如下:(创建类型转换需要注意以下描述)
①创建类型转换:

CREATE CAST (INTEGER AS VARCHAR) WITH INOUT AS IMPLICIT;
CREATE CAST (VARCHAR AS INTEGER) WITH INOUT AS IMPLICIT;
CREATE CAST (BIGINT AS VARCHAR) WITH INOUT AS IMPLICIT;
CREATE CAST (VARCHAR AS BIGINT) WITH INOUT AS IMPLICIT;

–注:创建cast需要有pg_cast系统表的权限
–注:当创建类型转换使用自动隐式转换的话如果出现多个匹配的转换此时pg会因为不知道选择哪一个去处理类型转换而报错。
–如果出现多个隐式自动转换都匹配此时还是需要手动添加转换以达到效果,或者删除多余的类型转换。

这样我们就解决了上述又不想修改参数,也不想修改xml字段类型的问题。

②查询已存在的转换类型:

SELECT
	( SELECT typname FROM pg_type WHERE oid = T.castsource ) AS “ castsource”,
	( SELECT typname FROM pg_type WHERE oid = T.casttarget ) AS “ casttarget”,
	castcontext,
	castmethod 
FROM
	pg_cast AS T

③删除已存在转换类型:

DROP CAST (varchar as bigint);
DROP CAST (bigint as varchar);

上述解决办法适用于一直在pg数据库环境下开发的项目。
四、总结:
开发人员一定要规范开发代码,虽然说有的数据库(指MySQL或Oracle)会给我们优化掉,但是类型还是严格对应,不过PostgregSQL确实和其他两个热门数据库比较还是有很多区别点,开发时需要特别注意,详细区别可见另一篇文章:
《PostgreSQL和MySQL的区别》

以上是关于No operator matches the given name and argument type(s). You might need to add explicit type casts报错的主要内容,如果未能解决你的问题,请参考以下文章

no git.exe found. TortoiseGit requires a git.exe for its operations(e.g.,such as provided by the Gi

VS2012 No exports were found that match the constraint

解决No version of NDK matched the requested version问题

Android studio :No version of NDK matched the requested version

Android studio :No version of NDK matched the requested version

No Operation named [input] in the Graph”错误,同时微调/重新训练 inceptionV1 slim 模型