【发布时间】:2018-05-21 19:03:40
【问题描述】:
我在过程P_GET_TABLE1 中嵌入了以下查询:
SELECT
t1.field1 XXXX
FROM table1 t1
field1 是 NUMBER(12)。该过程在 .NET 代码中使用 OracleDataAdapter 执行并填充 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'.'
【问题讨论】:
-
在 Oracle 中,数据类型与您通常期望在 Oracle 数据类型上进行谷歌搜索时所期望的不同,它将解释在 Int Decimals Number 等方面的差异......
-
你从
select dump(XXXX, 1016) from (SELECT t1.field1 XXXX FROM table1 t1 UNION SELECT 0 as XXXX FROM table2)得到什么 -
我以前见过类似的问题。解决方案是在所有选择中显式地将字段包装在 CAST 函数中。
-
@WernfriedDomscheit 您要查找哪一栏?
-
“为什么”是一个很好的问题(它并不总是有一个很好的答案;Oracle 的 UNION 实现中存在各种错误)。 “做什么”更容易;正如 OldProgrammer 所说,您可以将数字包含在
cast( ... as number(12) )中 - 并为UNION的两个成员执行此操作,因为 - 与标准相反,也许与 Oracle 自己的文档相反 - 目前尚不清楚 Oracle 将从哪个分支实际读取结果的数据类型。
标签: c# sql oracle oracle10g dataadapter