为什么 UNION 运算符会导致 OracleDataAdapter 中的数据类型更改?

Why does UNION operator cause datatype change in OracleDataAdapter?

我在过程中嵌入了以下查询 P_GET_TABLE1:

SELECT 
  t1.field1 XXXX
FROM table1 t1

field1NUMBER(12)。该过程使用 OracleDataAdapter 在 .NET 代码中执行并填充 DataTable,以便 XXXX 转换为 long.

我还有一个程序P_GET_TABLE2:

SELECT 
  t1.field1 XXXX
FROM table1 t1
UNION
SELECT
  0 as XXXX
FROM table2

但是,联合似乎会导致数据类型发生变化,因此 XXXX 无法转换为 long,只能转换为 decimal.

我的问题是:


具体来说,这段代码是用来获取数据的:

OracleDataAdapter da = new OracleDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
foreach(DataRow row in da.Rows)
{
    long value = (long)row["XXXX"]; // works when P_GET_TABLE1; exception when P_GET_TABLE2 is used; 
}

异常:'Object of type 'System.Decimal' cannot be converted to type 'System.Int64'.'

正在为您搜索:

集合操作(​​包括 UNION)的文档链接到 "implicit data conversion" 的更通用的文档部分 - 我们可以在其中阅读:

在处理数值时,Oracle 通常会调整精度和小数位数以允许最大容量。在这种情况下,此类操作产生的数值数据类型可能不同于基础表中的数值数据类型。

在您的示例中,UNION 的第二个分支产生值 0,未明确转换为任何精度和小数位数。因此,默认情况下,0 被视为 NUMBER 类型(精度为 38 且小数位数未定)。当您 UNION 时,数据类型将是 "max capacity",即 NUMBER。

解决方案是将 0 包裹在 CAST 中:cast(0 as number(12)) ....