统一SQL-number/decimal/dec/numeric转换

发布于:2024-04-18 ⋅ 阅读:(115) ⋅ 点赞:(0)

统一SQL介绍

https://www.light-pg.com/docs/LTSQL/current/index.html

源和目标

源数据库:Oracle

目标数据库:Postgresql,TDSQL-MySQL,达梦8,LightDB-Oracle

操作目标

通过统一SQL,将Oracle中的number/decimal/dec/numeric转换到目标库适配的数据类型。

统一SQL转换

Oracle2Posgresql

number类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
number decimal number —– decimal
number(*) decimal number(*) —– decimal
number(*,0) decimal(38,0) number(*,0)—-decimal(38,0)
number(*,s) s > 0 decimal(38,s) number(*,2)—-decimal(38,2)
number(p) / number(p,0) p>0 空 或 0 decimal(p) number(4,0)—–decimal(4)
number(p,s) p>0 s>0 decimal(p,s) number(10,2)—–decimal(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_number_t(c1 NUMBER,c2 NUMBER(*),c3 NUMBER(*,0),c4 NUMBER(*,2),c5 NUMBER(4),c6 NUMBER(4,0),c7 NUMBER(10,2));

-- 转换后PostgreSQL SQL:
CREATE TABLE unisql_number_t (c1 decimal,c2 decimal,c3 decimal(38,0),c4 decimal(38,2),c5 decimal(4),c6 decimal(4),c7 decimal(10,2))

decimal类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
decimal decimal(38,0) decimal —– decimal(38,0)
decimal(*) decimal(38,0) decimal(*) —– decimal(38,0)
decimal(*,0) decimal(38,0) decimal(*,0)—-decimal(38,0)
decimal(*,s) s > 0 decimal(38,s) decimal(*,2)—-decimal(38,2)
decimal(p) / decimal(p,0) p>0 空 或 0 decimal(p) decimal(4,0)—–decimal(4)
decimal(p,s) p>0 s>0 decimal(p,s) decimal(10,2)—–decimal(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_decimal_t(c1 decimal,c2 decimal(*),c3 decimal(*,0),c4 decimal(*,2),c5 decimal(4),c6 decimal(4,0),c7 decimal(10,2));

-- 转换后PostgreSQL SQL:
CREATE TABLE unisql_decimal_t (c1 decimal(38,0),c2 decimal(38,0),c3 decimal(38,0),c4 decimal(38,2),c5 decimal(4),c6 decimal(4),c7 decimal(10,2))

dec类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
dec dec(38,0) dec—– dec(38,0)
dec(*) dec(38,0) dec(*) —– dec(38,0)
dec(*,0) dec(38,0) dec(*,0)—-dec(38,0)
dec(*,s) s > 0 dec(38,s) dec(*,2)—-dec(38,2)
dec(p) / dec(p,0) p>0 空 或 0 dec(p) dec(4,0)—–dec(4)
dec(p,s) p>0 s>0 dec(p,s) dec(10,2)—–dec(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_dec_t(c1 dec,c2 dec(*),c3 dec(*,0),c4 dec(*,2),c5 dec(4),c6 dec(4,0),c7 dec(10,2));

-- 转换后PostgreSQL SQL:
CREATE TABLE unisql_dec_t (c1 dec(38,0),c2 dec(38,0),c3 dec(38,0),c4 dec(38,2),c5 dec(4),c6 dec(4),c7 dec(10,2))

numeric类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
numeric numeric(38,0) numeric—– numeric(38,0)
numeric(*) numeric(38,0) numeric(*) —– numeric(38,0)
numeric(*,0) numeric(38,0) numeric(*,0)—-numeric(38,0)
numeric(*,s) s > 0 numeric(38,s) numeric(*,2)—-numeric(38,2)
numeric(p) / numeric(p,0) p>0 空 或 0 numeric(p) numeric(4,0)—–numeric(4)
numeric(p,s) p>0 s>0 numeric(p,s) numeric(10,2)—–numeric(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_numeric_t(c1 numeric,c2 numeric(*),c3 numeric(*,0),c4 numeric(*,2),c5 numeric(4),c6 numeric(4,0),c7 numeric(10,2));

-- 转换后PostgreSQL SQL:
CREATE TABLE unisql_numeric_t (c1 numeric(38,0),c2 numeric(38,0),c3 numeric(38,0),c4 numeric(38,2),c5 numeric(4),c6 numeric(4),c7 numeric(10,2))

备注:

在Oracle中,对于数据类型NUMBER,DECIMAL,DEC,NUMERIC的精度标度范围:

  • 精度范围(p):1~38

  • 标度范围(s):-84~127

统一SQL转换时支持的精度标度范围如下(且p>=s):

  • 精度范围(p):1~38

  • 标度范围(s):0~38

  • 在使用上述数据类型时,请确保数据类型精度标度范围在支持范围内。

  • 对于目标库数据类型无法处理的数据长度,在运行时会报错。

  • 在处理数字类型数据时,源库和目标库会存在截取或四舍五入的情况,可能会导致精度的损失(参考备注示例内容)

  • 对于decimal/dec/numeric,decimal/dec/numeric(*),number/decimal/dec/numeric(,0),number/decimal/dec/numeric(,s)转换到目标库后默认精度(p=38),对于超过38位的数据,在目标库执行将报错,此种情况下请谨慎使用。

Oracle2TDSQL-MySQL

number类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
number decimal number —– decimal
number(*) decimal number(*) —– decimal
number(*,0) decimal(38,0) number(*,0)—-decimal(38,0)
number(*,s) s > 0 decimal(38,s) number(*,2)—-decimal(38,2)
number(p) / number(p,0) p>0 空 或 0 decimal(p) number(4,0)—–decimal(4)
number(p,s) p>0 s>0 decimal(p,s) number(10,2)—–decimal(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_number_t(c1 NUMBER,c2 NUMBER(*),c3 NUMBER(*,0),c4 NUMBER(*,2),c5 NUMBER(4),c6 NUMBER(4,0),c7 NUMBER(10,2));

-- 转换后TDSQL-MySQL:
CREATE TABLE unisql_number_t (c1 decimal,c2 decimal,c3 decimal(38,0),c4 decimal(38,2),c5 decimal(4),c6 decimal(4),c7 decimal(10,2))

decimal类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
decimal decimal(38,0) decimal —– decimal(38,0)
decimal(*) decimal(38,0) decimal(*) —– decimal(38,0)
decimal(*,0) decimal(38,0) decimal(*,0)—-decimal(38,0)
decimal(*,s) s > 0 decimal(38,s) decimal(*,2)—-decimal(38,2)
decimal(p) / decimal(p,0) p>0 空 或 0 decimal(p) decimal(4,0)—–decimal(4)
decimal(p,s) p>0 s>0 decimal(p,s) decimal(10,2)—–decimal(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_decimal_t(c1 decimal,c2 decimal(*),c3 decimal(*,0),c4 decimal(*,2),c5 decimal(4),c6 decimal(4,0),c7 decimal(10,2));

-- 转换后TDSQL-MySQL:
CREATE TABLE unisql_decimal_t (c1 decimal(38,0),c2 decimal(38,0),c3 decimal(38,0),c4 decimal(38,2),c5 decimal(4),c6 decimal(4),c7 decimal(10,2))

dec类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
dec dec(38,0) dec—– dec(38,0)
dec(*) dec(38,0) dec(*) —– dec(38,0)
dec(*,0) dec(38,0) dec(*,0)—-dec(38,0)
dec(*,s) s > 0 dec(38,s) dec(*,2)—-dec(38,2)
dec(p) / dec(p,0) p>0 空 或 0 dec(p) dec(4,0)—–dec(4)
dec(p,s) p>0 s>0 dec(p,s) dec(10,2)—–dec(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_dec_t(c1 dec,c2 dec(*),c3 dec(*,0),c4 dec(*,2),c5 dec(4),c6 dec(4,0),c7 dec(10,2));

-- 转换后TDSQL-MySQL:
CREATE TABLE unisql_dec_t (c1 dec(38,0),c2 dec(38,0),c3 dec(38,0),c4 dec(38,2),c5 dec(4),c6 dec(4),c7 dec(10,2))

numeric类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
numeric numeric(38,0) numeric—– numeric(38,0)
numeric(*) numeric(38,0) numeric(*) —– numeric(38,0)
numeric(*,0) numeric(38,0) numeric(*,0)—-numeric(38,0)
numeric(*,s) s > 0 numeric(38,s) numeric(*,2)—-numeric(38,2)
numeric(p) / numeric(p,0) p>0 空 或 0 numeric(p) numeric(4,0)—–numeric(4)
numeric(p,s) p>0 s>0 numeric(p,s) numeric(10,2)—–numeric(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_numeric_t(c1 numeric,c2 numeric(*),c3 numeric(*,0),c4 numeric(*,2),c5 numeric(4),c6 numeric(4,0),c7 numeric(10,2));

-- 转换后TDSQL-MySQL:
CREATE TABLE unisql_numeric_t (c1 numeric(38,0),c2 numeric(38,0),c3 numeric(38,0),c4 numeric(38,2),c5 numeric(4),c6 numeric(4),c7 numeric(10,2))

备注:

在Oracle中,对于数据类型NUMBER,DECIMAL,DEC,NUMERIC的精度标度范围:

  • 精度范围(p):1~38

  • 标度范围(s):-84~127

统一SQL转换时支持的精度标度范围如下(且p>=s):

  • 精度范围(p):1~38

  • 标度范围(s):0~38

  • 在使用上述数据类型时,请确保数据类型精度标度范围在支持范围内。

  • 对于目标库数据类型无法处理的数据长度,在运行时会报错。

  • 在处理数字类型数据时,源库和目标库会存在截取或四舍五入的情况,可能会导致精度的损失(参考备注示例内容)。

  • 在TDSQL-MySQL中decimal默认可以处理的整数位为10位,对转换后是decimal且整数位超过10位时,在运行时会报错。推荐使用时根据需要指定精度和标度。

  • 对于decimal/dec/numeric,decimal/dec/numeric(*),number/decimal/dec/numeric(,0),number/decimal/dec/numeric(,s)转换到目标库后默认精度(p=38),对于超过38位的数据,在目标库执行将报错,此种情况下请谨慎使用。

Oracle2TDSQL-LightDB-Oracle

number类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
number decimal number —– number
number(*) decimal number(*) —– number
number(*,0) decimal(38,0) number(*,0)—-number(38,0)
number(*,s) s > 0 decimal(38,s) number(*,2)—-number(38,2)
number(p) / number(p,0) p>0 空 或 0 decimal(p) number(4,0)—–number(4)
number(p,s) p>0 s>0 decimal(p,s) number(10,2)—–number(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_number_t(c1 NUMBER,c2 NUMBER(*),c3 NUMBER(*,0),c4 NUMBER(*,2),c5 NUMBER(4),c6 NUMBER(4,0),c7 NUMBER(10,2));

-- 转换后LightDB-Oracle SQL:
CREATE TABLE unisql_number_t (c1 number,c2 number,c3 number(38,0),c4 number(38,2),c5 number(4),c6 number(4),c7 number(10,2))

decimal类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
decimal decimal(38,0) decimal —– decimal(38,0)
decimal(*) decimal(38,0) decimal(*) —– decimal(38,0)
decimal(*,0) decimal(38,0) decimal(*,0)—-decimal(38,0)
decimal(*,s) s > 0 decimal(38,s) decimal(*,2)—-decimal(38,2)
decimal(p) / decimal(p,0) p>0 空 或 0 decimal(p) decimal(4,0)—–decimal(4)
decimal(p,s) p>0 s>0 decimal(p,s) decimal(10,2)—–decimal(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_decimal_t(c1 decimal,c2 decimal(*),c3 decimal(*,0),c4 decimal(*,2),c5 decimal(4),c6 decimal(4,0),c7 decimal(10,2));

-- 转换后LightDB-Oracle SQL:
CREATE TABLE unisql_decimal_t (c1 decimal(38,0),c2 decimal(38,0),c3 decimal(38,0),c4 decimal(38,2),c5 decimal(4),c6 decimal(4),c7 decimal(10,2))

dec类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
dec dec(38,0) dec—– dec(38,0)
dec(*) dec(38,0) dec(*) —– dec(38,0)
dec(*,0) dec(38,0) dec(*,0)—-dec(38,0)
dec(*,s) s > 0 dec(38,s) dec(*,2)—-dec(38,2)
dec(p) / dec(p,0) p>0 空 或 0 dec(p) dec(4,0)—–dec(4)
dec(p,s) p>0 s>0 dec(p,s) dec(10,2)—–dec(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_dec_t(c1 dec,c2 dec(*),c3 dec(*,0),c4 dec(*,2),c5 dec(4),c6 dec(4,0),c7 dec(10,2));

-- 转换后LightDB-Oracle SQL:
CREATE TABLE unisql_dec_t (c1 dec(38,0),c2 dec(38,0),c3 dec(38,0),c4 dec(38,2),c5 dec(4),c6 dec(4),c7 dec(10,2))

numeric类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
numeric numeric(38,0) numeric—– numeric(38,0)
numeric(*) numeric(38,0) numeric(*) —– numeric(38,0)
numeric(*,0) numeric(38,0) numeric(*,0)—-numeric(38,0)
numeric(*,s) s > 0 numeric(38,s) numeric(*,2)—-numeric(38,2)
numeric(p) / numeric(p,0) p>0 空 或 0 numeric(p) numeric(4,0)—–numeric(4)
numeric(p,s) p>0 s>0 numeric(p,s) numeric(10,2)—–numeric(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_numeric_t(c1 numeric,c2 numeric(*),c3 numeric(*,0),c4 numeric(*,2),c5 numeric(4),c6 numeric(4,0),c7 numeric(10,2));

-- 转换后LightDB-Oracle SQL:
CREATE TABLE unisql_numeric_t (c1 numeric(38,0),c2 numeric(38,0),c3 numeric(38,0),c4 numeric(38,2),c5 numeric(4),c6 numeric(4),c7 numeric(10,2))

备注:

在Oracle中,对于数据类型NUMBER,DECIMAL,DEC,NUMERIC的精度标度范围:

  • 精度范围(p):1~38

  • 标度范围(s):-84~127

统一SQL转换时支持的精度标度范围如下(且p>=s):

  • 精度范围(p):1~38

  • 标度范围(s):0~38

  • 在使用上述数据类型时,请确保数据类型精度标度范围在支持范围内。

  • 对于目标库数据类型无法处理的数据长度,在运行时会报错。

  • 在处理数字类型数据时,源库和目标库会存在截取或四舍五入的情况,可能会导致精度的损失(参考备注示例内容)

  • 对于decimal/dec/numeric,decimal/dec/numeric(*),number/decimal/dec/numeric(,0),number/decimal/dec/numeric(,s)转换到目标库后默认精度(p=38),对于超过38位的数据,在目标库执行将报错,此种情况下请谨慎使用。

Oracle2TDSQL-达梦8

number类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
number decimal number —– number
number(*) decimal number(*) —– number
number(*,0) decimal(38,0) number(*,0)—-number(38,0)
number(*,s) s > 0 decimal(38,s) number(*,2)—-number(38,2)
number(p) / number(p,0) p>0 空 或 0 decimal(p) number(4,0)—–number(4)
number(p,s) p>0 s>0 decimal(p,s) number(10,2)—–number(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_number_t(c1 NUMBER,c2 NUMBER(*),c3 NUMBER(*,0),c4 NUMBER(*,2),c5 NUMBER(4),c6 NUMBER(4,0),c7 NUMBER(10,2));

-- 转换后达梦 SQL:
CREATE TABLE unisql_number_t (c1 number,c2 number,c3 number(38,0),c4 number(38,2),c5 number(4),c6 number(4),c7 number(10,2))

decimal类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
decimal decimal(38,0) decimal —– decimal(38,0)
decimal(*) decimal(38,0) decimal(*) —– decimal(38,0)
decimal(*,0) decimal(38,0) decimal(*,0)—-decimal(38,0)
decimal(*,s) s > 0 decimal(38,s) decimal(*,2)—-decimal(38,2)
decimal(p) / decimal(p,0) p>0 空 或 0 decimal(p) decimal(4,0)—–decimal(4)
decimal(p,s) p>0 s>0 decimal(p,s) decimal(10,2)—–decimal(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_decimal_t(c1 decimal,c2 decimal(*),c3 decimal(*,0),c4 decimal(*,2),c5 decimal(4),c6 decimal(4,0),c7 decimal(10,2));

-- 转换后达梦 SQL:
CREATE TABLE unisql_decimal_t (c1 decimal(38,0),c2 decimal(38,0),c3 decimal(38,0),c4 decimal(38,2),c5 decimal(4),c6 decimal(4),c7 decimal(10,2))

dec类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
dec dec(38,0) dec—– dec(38,0)
dec(*) dec(38,0) dec(*) —– dec(38,0)
dec(*,0) dec(38,0) dec(*,0)—-dec(38,0)
dec(*,s) s > 0 dec(38,s) dec(*,2)—-dec(38,2)
dec(p) / dec(p,0) p>0 空 或 0 dec(p) dec(4,0)—–dec(4)
dec(p,s) p>0 s>0 dec(p,s) dec(10,2)—–dec(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_dec_t(c1 dec,c2 dec(*),c3 dec(*,0),c4 dec(*,2),c5 dec(4),c6 dec(4,0),c7 dec(10,2));

-- 转换后达梦 SQL:
CREATE TABLE unisql_dec_t (c1 dec(38,0),c2 dec(38,0),c3 dec(38,0),c4 dec(38,2),c5 dec(4),c6 dec(4),c7 dec(10,2))

numeric类型

Oracle 数据类型 精度(p) 标度(s) 转换后 PostgreSQL 数据类型 示例
numeric numeric(38,0) numeric—– numeric(38,0)
numeric(*) numeric(38,0) numeric(*) —– numeric(38,0)
numeric(*,0) numeric(38,0) numeric(*,0)—-numeric(38,0)
numeric(*,s) s > 0 numeric(38,s) numeric(*,2)—-numeric(38,2)
numeric(p) / numeric(p,0) p>0 空 或 0 numeric(p) numeric(4,0)—–numeric(4)
numeric(p,s) p>0 s>0 numeric(p,s) numeric(10,2)—–numeric(10,2)

使用案例:

-- 转换前Oracle SQL:
CREATE TABLE unisql_numeric_t(c1 numeric,c2 numeric(*),c3 numeric(*,0),c4 numeric(*,2),c5 numeric(4),c6 numeric(4,0),c7 numeric(10,2));

-- 转换后达梦 SQL:
CREATE TABLE unisql_numeric_t (c1 numeric(38,0),c2 numeric(38,0),c3 numeric(38,0),c4 numeric(38,2),c5 numeric(4),c6 numeric(4),c7 numeric(10,2))

备注:

在Oracle中,对于数据类型NUMBER,DECIMAL,DEC,NUMERIC的精度标度范围:

  • 精度范围(p):1~38

  • 标度范围(s):-84~127

统一SQL转换时支持的精度标度范围如下(且p>=s):

  • 精度范围(p):1~38

  • 标度范围(s):0~38

  • 在使用上述数据类型时,请确保数据类型精度标度范围在支持范围内。

  • 对于目标库数据类型无法处理的数据长度,在运行时会报错。

  • 在处理数字类型数据时,源库和目标库会存在截取或四舍五入的情况,可能会导致精度的损失(参考备注示例内容)

  • 对于decimal/dec/numeric,decimal/dec/numeric(*),number/decimal/dec/numeric(,0),number/decimal/dec/numeric(,s)转换到目标库后默认精度(p=38),对于超过38位的数据,在目标库执行将报错,此种情况下请谨慎使用。


网站公告

今日签到

点亮在社区的每一天
去签到