misc.log

日常茶飯事とお仕事と

Oracle DB、Number型をExecuteScalarで取ったら…

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型になるので、中に何が入ってくるかはお楽しみ。