- PR -

VB.NETからOracleのDBMS_ALERT.WAITANYを使用するとエラーが発生する

1
投稿者投稿内容
aoi
会議室デビュー日: 2004/09/16
投稿数: 16
投稿日時: 2004-09-17 14:19
お世話になります。

VB.NETから、OracleのDBMS_ALERTを使用して、
テーブルに更新があった場合にアプリケーション側にアラートを送信する
処理を作成しています。

テーブルに更新が無い間の受信待ちでは、エラーは発生しないのですが、
テーブルを更新すると、下記のようなエラーが発生します。
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.DBMS_ALERT", line 252
ORA-06512: at line 1

ORA-06502にて「PL/SQL:数値または値エラーが発生しました」といわれているようなのですが、
トリガのパラメータには、アラートの名前と1800バイト以下のメッセージを渡しています。

VB.NETの方からWAITANYに渡しているのも、inputはtimeoutだけなので、
こちらもエラーになっているとは考えにくい状態であり、行き詰まってしまいました。

解りにくい説明で申し訳ありませんが、何かご指摘いただければ幸いです。

*******以下にコードを記載します。************
<トリガー>
CREATE OR REPLACE TRIGGER TRIGGER_TEST AFTER
INSERT OR UPDATE OR DELETE
OF "TEST_CD", "TEST_NAME" ON "TEST" BEGIN
DBMS_ALERT.SIGNAL('TEST','UPDATED');
END;


<VB.NET>
※conはOracleConnectionです。

'DBMS_ALERT.WAITANY
'メッセージの受信待ち
Dim waitCmd As OracleCommand
waitCmd = New OracleCommand
waitCmd.CommandType = CommandType.StoredProcedure
waitCmd.CommandText = "DBMS_ALERT.WAITANY"
waitCmd.Connection = con
Dim waitReader As OracleDataReader
regCmd.BindByName = True

Dim waitparam1 As OracleParameter
Dim waitparam2 As OracleParameter
Dim waitparam3 As OracleParameter
Dim waitparam4 As OracleParameter

waitparam1 = New OracleParameter
waitparam1.ParameterName = "name"
waitparam1.OracleDbType = OracleDbType.Varchar2
waitparam1.Direction = ParameterDirection.Output
waitCmd.Parameters.Add(waitparam1)

waitparam2 = New OracleParameter
waitparam2.ParameterName = "message"
waitparam2.OracleDbType = OracleDbType.Varchar2
waitparam2.Direction = ParameterDirection.Output
waitCmd.Parameters.Add(waitparam2)

waitparam3 = New OracleParameter
waitparam3.ParameterName = "status"
waitparam3.OracleDbType = OracleDbType.Int32
waitparam3.Direction = ParameterDirection.Output
waitCmd.Parameters.Add(waitparam3)

waitparam4 = New OracleParameter
waitparam4.ParameterName = "timeout"
waitparam4.OracleDbType = OracleDbType.Int32
waitparam4.Direction = ParameterDirection.Input
waitCmd.Parameters.Add(waitparam4)
waitCmd.Parameters("timeout").Value = 10

'無限ループ
While (1)
Try
waitCmd.ExecuteNonQuery()
If waitCmd.Parameters("status").Value = 1 Then

Else
'dicttype = waitReader.GetString(1)
dicttype = waitCmd.Parameters("name").Value
If dicttype = "TEST" Then
MsgBox("変更されました")
Exit While
End If
End If
Catch oex As OracleException
MsgBox(oex.Message)
Exit While
Catch ex As Exception
MsgBox(ex.Message)
Exit While
End Try

End While


以上、よろしくお願いいたします。

環境:
VB.NET
Oracle10g
Windows2000
Windows2003server



[ メッセージ編集済み 編集者: aoi 編集日時 2004-09-17 14:19 ]

[ メッセージ編集済み 編集者: aoi 編集日時 2004-09-17 17:57 ]
1

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