納得できない。ODPでoracleストアドをキックするときのvarchar2の扱い
varchar2型の戻りがストアドに存在するとき。
入れるときがどうとかはまだわかんない。あとでやる。
実行対象ストアドは以下の通り
CREATE OR REPLACE PROCEDURE GETNAME ( v_EMPNO IN number, v_ENAME out varchar2, v_COUNT out number) IS BEGIN SELECT ENAME INTO v_ENAME FROM EMP WHERE EMPNO = v_EMPNO; SELECT count(*) INTO v_COUNT FROM EMP WHERE EMPNO = v_EMPNO; END;
numberを入れてvarchar2型とnumber型を返すプロシージャです。
コレをVB.netから使用する際には
'コネクションまで oraCon.ConnectionString = ("User ID=id; Password=pass; Data Source=接続しる;") Dim cmd As New OracleCommand() oraCon.Open() 'コマンドに登録 cmd.CommandText = "GETNAME" cmd.CommandType = CommandType.StoredProcedure cmd.Connection = oraCon cmd.BindByName = True 'パラメータの登録 'NUMBER型のinputの場合はセオリーどおりinputとしてパラメータ作成すればOKです。 Dim p1 As OracleParameter = New OracleParameter("v_EMPNO", OracleDbType.Int16) p1.Value = 7369 p1.Direction = ParameterDirection.Input cmd.Parameters.Add(p1) 'varchar型のoutput型はinputoutput型として作成し、かつdummyな文字列を入れておかないとキックする段でエラーになります。 Dim p2 As OracleParameter = New OracleParameter("v_ENAME", OracleDbType.Varchar2) p2.Direction = ParameterDirection.InputOutput 'まず、outputがただとだめ。 p2.Value = "" '空文字でもエラー p2.Value = "dummy文字" 'ちなみにこの文字数がvarchar2戻りの限界長 cmd.Parameters.Add(p2) 'NUMBER型のoutputもセオリーどおりでOKです。 Dim p3 As OracleParameter = New OracleParameter("v_COUNT", OracleDbType.Int16) p3.Direction = ParameterDirection.Output cmd.Parameters.Add(p3) cmd.ExecuteNonQuery() MessageBox.Show(p2.Value.ToString) MessageBox.Show(p3.Value.ToString)
NUMBER型のときは普通にやれば動いてくれるのだけど
VARCHAR2型の時はとりあえずinputoutputでdirectionを決めて
かつ空文字以外を入れないといけないらしい。dummy文字列の長さが戻りの限界長。size指定すれば初期値はいらないけどな。
くそだろ。。。くそだと思った。
要するにこういう事。サイズ指定が必要
Dim p2 As OracleParameter = New OracleParameter("v_ENAME", OracleDbType.Varchar2) p2.Direction = ParameterDirection.Output p2.size = 200 cmd.Parameters.Add(p2)
varcharのinputは問題なく。と言うかインプットに指定している時点でry)