Oracleの数値型は「Number」という型で桁数を指定して定義されます。では、「NUMBER(12)」と定義された列の値を、OracleCommand.ExecuteScalar*1で取得してみました。
- NUMBER(12)の値は、中身が1桁だろうがLong型(64bit整数)で返ってくる。
ちなみに、.NETのInt32(VB.NETでのInteger)上限値は2,147,483,647です。これは10桁です。では、NUMBER(10)やNUMBER(9)だとどうなるでしょうか?
- NUMBER(10)の値は、中身が1桁だろうがLong型(64bit整数)で返ってくる。
- NUMBER(9)の値は、中身が1桁だろうがInteger型(32bit整数)で返ってくる。
なるほど。Integerの上限は10桁ですが、かといって10桁フルに9を並べた値が入っていたらオーバーフローしますから、大きめのLongになっているのでしょうね。一方、9桁なら確実にIntegerに収まるので、Integerになっていると。ではでは……NUMBER(30)はどうだ!
- NUMBER(30)の値は、中身が20桁くらいならSystem.Decimal構造体で返ってくる。
なるほどね。
*1:ExecuteScalar: 取得した結果の1行目1列目、1件しか返さないシンプルなデータ取得をするメソッド。戻り値はObject型になるので、中に何が入ってくるかはお楽しみ。