【问题标题】:Why does UNION operator cause datatype change in OracleDataAdapter?为什么 UNION 运算符会导致 OracleDataAdapter 中的数据类型发生变化?
【发布时间】:2018-05-21 19:03:40
【问题描述】:

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

SELECT 
  t1.field1 XXXX
FROM table1 t1

field1NUMBER(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 更改数据类型?
  • 我可以强制OracleDataAdapterXXXX 解释为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


【解决方案1】:

为你寻找这个:

集合操作(​​包括 UNION)的文档链接到“隐式数据转换”的更通用文档部分 - 我们可以在其中阅读:

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

在您的示例中,UNION 的第二个分支产生值 0,而不是显式转换为任何精度和比例。因此,默认情况下,0 被认为是 NUMBER 类型(精度为 38 和未确定的小数位数)。当你 UNION 时,数据类型将是“最大容量”,即 NUMBER。

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

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2012-09-23
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多