将 oracle 转换为 PostgreSQL 时出现数字溢出

Posted

技术标签:

【中文标题】将 oracle 转换为 PostgreSQL 时出现数字溢出【英文标题】:Numeric Overflow while converting oracle to PostgreSQL 【发布时间】:2020-07-12 09:09:16 【问题描述】:

我正在将一个非常旧的 Oracle DB 转换为 Postgres,其中大多数数字列的精度都丢失了,但是,在 Postgres 表结构中,存在相同列的精度,我收到过多的数字溢出错误,而将数据从 Oracle DB 移动到 Postgres。

现在,我想将所有超出精度的值更新为 oracle 数据库中的最大精度数,因此,我正在尝试使用 Postgres 表结构创建一个更新脚本,它可以帮助我找到所有oracle 中损坏的行。

我的查询如下(要在 Postgres 上运行),我想修改它以获取可以在 oracle DB 上运行以获取损坏值的更新脚本。

select 'update ' ||table_name || 'set ' || column_name || '=' || (numeric_precision - numeric_scale) || ' where column_name > ' || (numeric_precision - numeric_scale) from information_schema.columns where table_schema='test' and data_type='numeric';

现在在这里 (numeric_precision - numeric_scale) 如果它返回值 3 那么我想用 999 替换它 如果是 4,那么我希望它是 9999。

请有人告诉我这是怎么可能的,我想在 Postgres DB 上运行此查询,然后在 Oracle DB 上运行生成的脚本?

【问题讨论】:

【参考方案1】:

您可以使用 (numeric_precision - numeric_scale) 结果的长度来添加您喜欢使用 LPAD 的模式

LPAD('', length((numeric_precision - numeric_scale)), '9' )

【讨论】:

谢谢,成功了,只是我去掉了长度函数,LPAD('', (numeric_precision - numeric_scale), '9')

以上是关于将 oracle 转换为 PostgreSQL 时出现数字溢出的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套解码转换为等效的 CASE 语句(需要从 Oracle 转换为 PostgreSQL)

将 oracle 转换为 PostgreSQL 时出现数字溢出

将 Oracle upsert 转换为 PostgreSQL 准备好的语句

如何将此代码从 oracle 转换为 redshift?

PostgreSQL - 我有啥办法可以定义一个在插入或更新时将空字符串转换为 null 的列?

postgresql 将数字转换为日期和格式