Oracle 不会继承 Kafka Connect 使用的视图中列的数字比例和精度

Oracle doesn't inherit number scale and precision for columns in a view consumed by Kafka Connect

我想强制我的视图中的列具有精确的比例和精度。我目前的预设如下:

create or replace view v1
as
select cast(1 as number(1,0))   as some_val,
       'X'                      as join_val
from dual
/
create or replace view v2
as
select v1.some_val
from dual
left join v1 on dual.dummy = v1.join_val
/

在此示例中,我希望 v2.some_val 列为 NUMBER(1,0)。但是在查询字典时我只得到 NUMBER:

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jul 12 13:02:59 2021
Version 19.9.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password:
Last Successful login time: Mon Jul 12 2021 12:59:02 +03:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL> column data_precision format 99;
SQL> column data_scale format 99;
SQL> column table_name format a5;
SQL> column column_name format a10;
SQL> select d.data_precision, d.data_scale, d.table_name, d.column_name
  2  from dba_tab_cols d
  3  where d.owner = 'STAT_INT'
  4  and d.table_name in ('V1', 'V2');

DATA_PRECISION DATA_SCALE TABLE COLUMN_NAM
-------------- ---------- ----- ----------
             1          0 V1    SOME_VAL
                          V1    JOIN_VAL
                          V2    SOME_VAL

SQL>

我在 V2 视图中更改了连接条件(将连接谓词替换为始终为真):

create or replace view stat_int.v2
as
select v1.some_val
from dual
left join v1 on 1=1
/

并且输出改变了:

SQL> select d.data_precision, d.data_scale, d.table_name, d.column_name
  2  from dba_tab_cols d
  3  where d.owner = 'STAT_INT'
  4  and d.table_name in ('V1', 'V2');

DATA_PRECISION DATA_SCALE TABLE COLUMN_NAM
-------------- ---------- ----- ----------
             1          0 V1    SOME_VAL
                          V1    JOIN_VAL
             1          0 V2    SOME_VAL

SQL>

我不明白为什么 Oracle 决定不从父 table 列继承小数位数和精度,因为即使左连接不起作用,它仍然可以是 NULL 值输入 NUMBER(1,0).

当然,当我在 V2 视图中将 some_val 转换为 NUMBER(1,0) 时它工作正常,但在我的情况下,我将此逻辑保留在 V1 视图中并且它被大量依赖视图使用(V2 是其中之一),我不想为了只转换为所需的类型而更改。

此 scale/precision 要求来自 Kafka Connect,如果未设置适当的比例,它将普通值 01 转换为类似 OxdP6jOQnr/o+UfE4q0zr5p7lMvK0Fh9N+fohbLmyY9Nt9u5ZoAAAAAAAAAAAAAAAAAAAAA= 的值。

如有任何建议,我们将不胜感激。谢谢!

问题不在于 NULL 不能转换为 number(1,0)

问题是视图可以 return 两种可能的 数据类型 ,

number(1,0) 如果连接将 return 一个值或

null casted as number 以防加入失败。

所以这里应用转换规则 here

When manipulating numeric values, Oracle usually adjusts precision and scale to allow for maximum capacity.

这会导致精度和比例损失的最终影响。

您可能会在遭受相同损失的 UNION ALL 查询中观察到类似的效果。

create or replace view v2
as 
select v1.some_val from v1
union  all
select   null  from dual

所以我非常乐意在这里犯错,但我认为,您将不得不退回到内部联接或另外在最终视图中转换值。