- PR -

PL/SQL プロシージャ の引数を配列で渡したい

1
投稿者投稿内容
Meta
常連さん
会議室デビュー日: 2005/11/24
投稿数: 31
投稿日時: 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 ]
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 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 ]
Meta
常連さん
会議室デビュー日: 2005/11/24
投稿数: 31
投稿日時: 2008-12-10 18:58
こあらさん、回答ありがとうございます。

>VARCHAR2配列の引数に対して、
>VARCHAR2の値を渡しているからではないですか?

下記のプロパティを設定することで配列になるはずだったのですが。。。
para_code1.CollectionType = OracleCollectionType.PLSQLAssociativeArray

また、カーソルを引数とする方法ですが添付のURLを参照すると、
引数はカーソルではないように思います。
とりあえず、その方法を真似てみましたが、やっぱり実現させたい動きとだいぶ違いがあり、参考になりませんでした。申し訳ないです。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2008-12-10 22:25
配列のサイズを指定する必要があるのかなぁ。

http://www.atmarkit.co.jp/fdb/rensai/odpdotnet03/odpdotnet03_3.html

para_code1.Size = str_code1.Length

とか?

というか、どこでエラーになってます?
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-12-10 22:30
> 参考になりませんでした

全然違いましたか。すみませんでした。

Metaさんのコードと、リンク先のコードを見比べると、
多少違いがあるように見えますが、この際関係無いのですね。
知らないのに適当なことを書いて惑わせてしまい申し訳ありませんでした。
Meta
常連さん
会議室デビュー日: 2005/11/24
投稿数: 31
投稿日時: 2008-12-11 10:35
セラフさん、回答ありがとうございました。

配列のサイズを指定しても結果は同じでした。

>というか、どこでエラーになってます?

ExecuteNonQuery()でエラーがでています。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-12-11 11:02
以下の過去スレッドは参考になるかな?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35360&forum=36&2
1

スキルアップ/キャリアアップ(JOB@IT)