迁移过程中将布尔类型转为数值类型(APP)
Posted 瀚高PG实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迁移过程中将布尔类型转为数值类型(APP)相关的知识,希望对你有一定的参考价值。
目录
环境
症状
问题原因
解决方案
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:4.3.4.7
症状
在应用迁移适配过程中,应用测试可能会遇到异常,数据库日志报错如下:
2020-06-18 16:38:35.990 CST,“pmweb”,“pmweb”,19406,“172.16.56.188:58236”,5eeb2495.4bce,516,“PARSE”,2020-06-18 16:23:49 CST,17/237,0,ERROR,42804,“column ““is_carry_forward”” is of type numeric but expression is of type boolean”,“You will need to rewrite or cast the expression.”,"insert into pm_j_acnt
问题原因
出现该问题的原因是表中的列“is_carry_forward”是数值(numeric)类型的,而 insert语句中对应该列值的表达式值却是布尔(boolean)类型。由于瀚高数据库是强类型的,并没有默认自动转换,所以会报错。
解决方案
根据以上问题描述,可以通过自定义数据类型转换来解决。
创建类型转换:
create or replace function boolean_to_numeric( boolean ) returns numeric as $$
select $1::integer::numeric;
$$ language sql strict;
create cast ( boolean as numeric ) with function boolean_to_numeric( boolean ) as implicit;
再打开应用进行测试,就不会报错了。
注意:
如果增加类似的自定义类型转换过多,可能会报以下错误:
ERROR,42725,“operator is not unique: numeric = boolean”,“Could not choose a best candidate operator. You might need to add explicit type casts.”
无法选择最佳候选操作符。您可能需要添加显式类型强制转换。
解决方法:
检查类似的自定义类型转换,去掉繁琐且可能造成转换死循环的,选择最优的留下。
更多解决方案请登录【瀚高技术支持平台】查看https://support.highgo.com/#/index/docContent/74c56ecc05741fc3
以上是关于迁移过程中将布尔类型转为数值类型(APP)的主要内容,如果未能解决你的问题,请参考以下文章