- - PR -
PL/SQL プロシージャ の引数を配列で渡したい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-12-05 15:27
PL/SQL プロシージャ の引数を配列で宣言し、
そのプロシージャをASP.NET側から呼出し、「引数の数または型が正しくありません。」のエラーがでてしまいます。 しかし、その原因が分かりません。 どのようにしたら引数に配列を指定できるのでしょうか。 ============================= ★プロシージャ TYPE t_CODE1 IS TABLE OF VARCHAR2(20)index by INARY_INTEGER; TYPE t_CODE2 IS TABLE OF VARCHAR2(10) index by BINARY_INTEGER; TYPE t_CODE3 IS TABLE OF NUMBER(6) index by pls_integer; TYPE t_DATA IS TABLE OF NUMBER(1) index by pls_integer; TYPE t_NO IS TABLE OF NUMBER(4) index by pls_integer; PROCEDURE MAIN(p_CODE1 IN t_CODE1, p_CODE2 IN t_CODE2, p_CODE3 IN t_CODE3, p_DATA IN t_DATA, p_N IN t_NO, KIJYUN_DATE IN DATE, KIJYUN_RENBAN IN NUMBER, KIJYUN_FLG IN NUMBER, KIJYUN_NAME IN VARCHAR2) <省略> ----------------------- ★ASP.NET Public Function Execute_Check(ByVal dt_data As DataTable, _ ByVal Rireki_flg As Integer, _ ByVal Rireki_name As String, _ ByVal kijyun_date As Date, _ ByVal kijyun_renban As Integer)As Boolean Dim wsvDb As New DR_AGRI_DBService ← DB接続用の共通関数 Dim para_code1 = New OracleParameter("p_CODE1",OracleDbType.Varchar2) Dim para_code2 = New OracleParameter("p_CODE2",OracleDbType.Varchar2) Dim para_code3 = New OracleParameter("p_CODE3", OracleDbType.Decimal) Dim para_Data = New OracleParameter("p_DATA", OracleDbType.Decimal) Dim para_Renban = New OracleParameter("p_NO", OracleDbType.Decimal) Dim para_kijyun_date = New OracleParameter("KIJYUN_DATE",OracleDbType.Date) Dim para_kijyun_renban = New OracleParameter("KIJYUN_RENBAN",OracleDbType.Decimal) Dim para_kijyun_flg = New OracleParameter("KIJYUN_FLG",OracleDbType.Decimal) Dim para_Kijyun_name = New OracleParameter("KIJYUN_NAME",OracleDbType.Varchar2) Dim str_code1() As String Dim str_code2() As String Dim str_code3() As Integer Dim intData() As Integer Dim intRenban() As Integer para_code1.CollectionType = OracleCollectionType.PLSQLAssociativeArray para_code2.CollectionType = OracleCollectionType.PLSQLAssociativeArray para_code3.CollectionType = OracleCollectionType.PLSQLAssociativeArray para_Data.CollectionType = OracleCollectionType.PLSQLAssociativeArray para_Renban.CollectionType = OracleCollectionType.PLSQLAssociativeArray wsvDb.DbOpen() ← 共通関数でDB接続 ReDim str_code1(dt_data.Rows.Count - 1) ReDim str_code2(dt_data.Rows.Count - 1) ReDim str_code3(dt_data.Rows.Count - 1) ReDim intData(dt_data.Rows.Count - 1) ReDim intRenban(dt_data.Rows.Count - 1) para_code1.Direction = ParameterDirection.Input para_code2.Direction = ParameterDirection.Input para_code3.Direction = ParameterDirection.Input para_Data.Direction = ParameterDirection.Input para_Renban.Direction = ParameterDirection.Input para_kijyun_date.Direction = ParameterDirection.Input para_kijyun_renban.Direction = ParameterDirection.Input para_kijyun_flg.Direction = ParameterDirection.Input para_Kijyun_name.Direction = ParameterDirection.Input para_code1.Value = str_code1 para_code2.Value = str_code2 para_code3.Value = str_code3 para_Data.Value = intData para_Renban.Value = intRenban para_kijyun_date.Value = kijyun_date para_kijyun_renban.Value = kijyun_renban para_kijyun_flg.Value = Rireki_flg para_Kijyun_name.Value = Rireki_name .Parameters.Add(para_code1) .Parameters.Add(para_code2) .Parameters.Add(para_code3) .Parameters.Add(para_Data) .Parameters.Add(para_Renban) .Parameters.Add(para_kijyun_date) .Parameters.Add(para_kijyun_renban) .Parameters.Add(para_kijyun_flg) .Parameters.Add(para_Kijyun_name) 'PL/SQL実行 .ExecuteNonQuery() wsvDb.objTxn.Commit() 'コミット Return True ================================= よろしくお願い致します。 [ メッセージ編集済み 編集者: Meta 編集日時 2008-12-05 17:14 ] |
|
投稿日時: 2008-12-05 17:04
> 「引数の数または型が正しくありません。」のエラーがでてしまいます。
> しかし、その原因が分かりません。 > TYPE t_CODE1 IS TABLE OF VARCHAR2(20)index by INARY_INTEGER; VARCHAR2配列の引数に対して、 > Dim para_code1 = New OracleParameter("p_CODE1",OracleDbType.Varchar2) VARCHAR2の値を渡しているからではないですか? この記事を読んでみて下さい。 http://www.atmarkit.co.jp/fdb/rensai/odpdotnet01/odpdotnet04.html [追記]http://otndnld.oracle.co.jp/tech/windows/odpnet/howto/04_arraybind/content.html[/追記] クライアント側で配列を引数にすると、 一回のラウンドトリップでストアドを複数回を呼び出せる。と書いてあります。 ストアドの引数定義は、配列にする必要が無いのかな?と思いました。 あるいは、カーソルを引数にする方法でも良いのかもしれません。 参考になれば幸いです。 [ メッセージ編集済み 編集者: こあら 編集日時 2008-12-05 17:07 ] |
|
投稿日時: 2008-12-10 18:58
こあらさん、回答ありがとうございます。
>VARCHAR2配列の引数に対して、 >VARCHAR2の値を渡しているからではないですか? 下記のプロパティを設定することで配列になるはずだったのですが。。。 para_code1.CollectionType = OracleCollectionType.PLSQLAssociativeArray また、カーソルを引数とする方法ですが添付のURLを参照すると、 引数はカーソルではないように思います。 とりあえず、その方法を真似てみましたが、やっぱり実現させたい動きとだいぶ違いがあり、参考になりませんでした。申し訳ないです。 |
|
投稿日時: 2008-12-10 22:25
配列のサイズを指定する必要があるのかなぁ。
http://www.atmarkit.co.jp/fdb/rensai/odpdotnet03/odpdotnet03_3.html para_code1.Size = str_code1.Length とか? というか、どこでエラーになってます? |
|
投稿日時: 2008-12-10 22:30
> 参考になりませんでした
全然違いましたか。すみませんでした。 Metaさんのコードと、リンク先のコードを見比べると、 多少違いがあるように見えますが、この際関係無いのですね。 知らないのに適当なことを書いて惑わせてしまい申し訳ありませんでした。 |
|
投稿日時: 2008-12-11 10:35
セラフさん、回答ありがとうございました。
配列のサイズを指定しても結果は同じでした。 >というか、どこでエラーになってます? ExecuteNonQuery()でエラーがでています。 |
|
投稿日時: 2008-12-11 11:02
以下の過去スレッドは参考になるかな?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35360&forum=36&2 |
1