为什么 UNION 运算符会导致 OracleDataAdapter 中的数据类型更改?
Why does UNION operator cause datatype change in OracleDataAdapter?
我在过程中嵌入了以下查询 P_GET_TABLE1
:
SELECT
t1.field1 XXXX
FROM table1 t1
field1
是 NUMBER(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
.
我的问题是:
- 为什么
UNION
运算符会导致 OracleDataAdapter
更改数据类型?
- 我可以强制
OracleDataAdapter
将 XXXX
解释为 long
具体来说,这段代码是用来获取数据的:
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)) ....
我在过程中嵌入了以下查询 P_GET_TABLE1
:
SELECT
t1.field1 XXXX
FROM table1 t1
field1
是 NUMBER(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
.
我的问题是:
- 为什么
UNION
运算符会导致OracleDataAdapter
更改数据类型? - 我可以强制
OracleDataAdapter
将XXXX
解释为long
具体来说,这段代码是用来获取数据的:
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)) ....