VB.NET Oracleのストアドプロシージャを呼ぶと『ORA-06502: PL/SQL: 数値または値のエラーが発生しました』

VB.NETからOracleのストアドプロシージャを呼んだところ、
『ORA-06502: PL/SQL: 数値または値のエラーが発生しました』
が発生。

以下、問題のコード。

■Oracleストアドプロシージャ

  PROCEDURE GETUSERNAME(
    I_ID IN NVARCHAR2,
    I_PW IN NVARCHAR2,
    O_NAME OUT NVARCHAR2
  ) AS
    BEGIN
      SELECT
        NAME
     INTO
        O_NAME
      FROM
        USER
      WHERE
        ID = I_ID
        AND
        PW = I_PW;
    END GETUSERNAME;



■VB.NET

  'ストアドプロシージャの呼び出し
  Dim cmd As New OracleCommand
  cmd.Connection = conn
  cmd.CommandType = CommandType.StoredProcedure
  cmd.CommandText = "GETUSERNAME"
  cmd.Parameters.Add(New OracleParameter("I_ID", OracleDbType.NVarchar2, ParameterDirection.Input))
  cmd.Parameters.Add(New OracleParameter("I_PW", OracleDbType.NVarchar2, ParameterDirection.Input))
  cmd.Parameters.Add(New OracleParameter("O_NAME", OracleDbType.NVarchar2, ParameterDirection.Output))
  cmd.Parameters("I_ID").Value = "ID"
  cmd.Parameters("I_PW").Value = "PASSWORD"
  cmd.ExecuteNonQuery()
  MsgBox(cmd.Parameters("O_NAME").Value.ToString())



これでVBを実行すると、cmd.ExecuteNonQuery() のところで冒頭のエラーが発生。

このエラーで検索しても、「ストアドプロシージャで数値のNULLチェックをきちんとすれば〜」的なことが書いてある。
とはいえ、プロシージャにはそんなチェックが必要そうなところは見当たらない。

で、行き当たったのが以下のブログ(ありがとうございます!)
http://modeverv.hateblo.jp/entry/20081226/1230262620

VARCHARのOUTPUTはサイズ指定が必要…?
試しに以下のように変更。


■VB.NET(新)

  'ストアドプロシージャの呼び出し
  Dim cmd As New OracleCommand
  cmd.Connection = conn
  cmd.CommandType = CommandType.StoredProcedure
  cmd.CommandText = "GETUSERNAME"
  cmd.Parameters.Add(New OracleParameter("I_ID", OracleDbType.NVarchar2, ParameterDirection.Input))
  cmd.Parameters.Add(New OracleParameter("I_PW", OracleDbType.NVarchar2, ParameterDirection.Input))
  Dim p As OracleParameter = New OracleParameter("O_NAME", OracleDbType.NVarchar2)
  p.Direction = ParameterDirection.Output
  p.Size = 200
  cmd.Parameters.Add(p)

  cmd.Parameters("I_ID").Value = "ID"
  cmd.Parameters("I_PW").Value = "PASSWORD"
  cmd.ExecuteNonQuery()
  MsgBox(cmd.Parameters("O_NAME").Value.ToString())



…解決。
OracleのエラーメッセージもVBの仕様も分かりにくく、ハマりました…


posted by へっぽ at 00:20 | TrackBack(0) | VB.NET | このブログの読者になる | 更新情報をチェックする

この記事へのトラックバック