2017-12-07 17 views
0

私は手順P_GET_TABLE1に埋め込まれて、次のクエリを持っている:UNION演算子がOracleDataAdapterでデータ型の変更を引き起こすのはなぜですか?

SELECT 
    t1.field1 XXXX 
FROM table1 t1 

field1NUMBER(12)です。この手順は、OracleDataAdapterを使用して.NETコードで展開され、XXXXlongに変換されるようにDataTableを埋め込みます。

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

組合は、しかし、XXXXlongに変換することができないように、データ型の変更、のみdecimalを引き起こしているようだ:

は、私は別の手順P_GET_TABLE2を持っています。

私の質問は以下のとおりです。

  • UNIONオペレータがデータ型を変更するOracleDataAdapterが発生しないのはなぜ?
  • 私は具体的には、このコードは、データを取得するために使用されlong

としてXXXXを解釈するOracleDataAdapterを強制することができます:

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'.'

+0

あなたは、通常のOracleデータ型のGoogle検索を行うに期待するものとは異なっており、それはなどのInt小数数、に関しての違いを説明します... – MethodMan

+0

何から '選択ダンプ(XXXX、1016)から入手できます(UNION TABLE1 T1から t1.field1 XXXX を選択すると、table2のFROM XXXX として 0を選択 )' –

+0

私は前に同様の問題を見てきました。解決策は、すべての選択でCAST関数でフィールドを明示的に折り返すことです。 – OldProgrammer

答えて

2

あなたのために:

(UNIONを含む)集合演算のためのドキュメントは、「暗黙的なデータ変換」のためのより一般的なドキュメントのセクションにリンクする - 私たちが読むことができます:

数値を操作すると、Oracleは通常、最大可能にするために精度とスケールを調整し

容量。そのような場合、そのような操作の結果生じる数値データ型は、基礎となる表にある数値データ型と異なる場合があります。

例では、UNIONの2番目の枝は、明示的に任意の精度と位取りにキャストされない値0を生成します。したがって、デフォルトでは、0はNUMBER型(精度は38でスケールは未定義)とみなされます。 UNIONの場合、データ型は「最大容量」になります。これはNUMBERです。

ソリューションは、CAST内0をラップすることです:Oracleデータ型でcast(0 as number(12)) ....

関連する問題