- PR -

ODP.NETを利用したPL/SQL配列の型

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/03/14
投稿数: 6
投稿日時: 2006-12-06 16:48
いつもお世話になっております。

VisualBasic2005+ODP.NET(ORACLE10g)で開発を行っているのですが PL/SQLで
PLS_INTEGER型の配列を使用すると次のようなエラーが出て困っています。

「PLS-00418 配列バインドの型は、PL/SQL表の行の型と一致する必要があります。」

コードは以下の通りです。(大分省略しているので見辛いと思いますが・・・)
[VB]
dim Command As New OracleCommand
Dim a() As Integer = {10, 11, 12}
mCommand.Parameters.Add("P_ARRAY" , OracleDbType.Int32, val, ParameterDirection.Input)
mCommand.Parameters.Item("P_ARRAY").CollectionType = OracleCollectionType.PLSQLAssociativeArray

Command.ExecuteNonQuery()

[PL/SQL]
TYPE T_INT IS TABLE OF PLS_INTEGER INDEX BY BINARY_INTEGER;

PROCEDURE prc_PARRAY
(P_ARRAY COMMON.T_INT
)IS
:
:
:
ちなみに上記のコードで VB側のa() をInteger→Decimal、PL/SQL側のT_INTを
PLS_INTEGER→NUMBERに変更すると上手く行きました。
パラメータを配列にしない場合でも上手くいったので配列の場合だけ互換性がないのでしょうか?
ご存知の方教えてください。よろしくお願いします。


[ メッセージ編集済み 編集者: 未記入 編集日時 2006-12-06 17:39 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-12-06 17:39 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-06 17:27
引用:

未記入さんの書き込み (2006-12-06 16:48) より:

「PLS-00418 配列バインドの型は、PL/SQL表の行の型と一致する必要があります。」
(snip)
ちなみに上記のコードで VB側のa() をInteger→Decimal、PL/SQL側のT_INTをPLS_INTEGER→NUMBERに変更すると上手く行きました。
パラメータを配列にしない場合でも上手くいったので配列の場合だけ互換性がないのでしょうか?


配列バインドは、OracleCommand.ArrayBindCount を指定しなければならなかったかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/03/14
投稿数: 6
投稿日時: 2006-12-07 09:15
じゃんぬねっとさん、ありがとうございます。

OracleCommand.ArrayBindCount 指定して実行してみましたが
エラーが出てしまいました。

Oracleに問い合わせたところ
『Oracle Data Provider for .NET開発者ガイド 10g リリース2(10.2)』
 (B19259-01)

 の、「パラメータ・バインド」の「OracleDbTypeの列挙型」の項に、バイ
 ンドする際のDB側のデータ型とOracleDbTypeの組み合わせの表がございま
 す。
 こちらの表にはPLS_INTEGERについて記述がなく、バインド変数として使
 用するためのOracleDbTypeの組み合わせもございません。
 そのため、PLS_INTEGERではなく、NUMBER型をご使用下さいますでしょう
 か。

という返答がきました。
残念ですがNUMBERで対応することにします。
ありがとうございました。
1

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