C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 配列を使用したPL/SQLの呼び出しでエラー


(過去ログ 144 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■84630 / inTopicNo.1)  配列を使用したPL/SQLの呼び出しでエラー
  
□投稿者/ makoto (29回)-(2017/07/24(Mon) 11:59:06)

分類:[データベース全般] 

2017/07/24(Mon) 12:00:17 編集(投稿者)

いつもお世話になります。

VB.Netのプログラム(クラスライブラリ形式)から配列を
使用したPL/SQLの呼び出しでエラーとなってしまいます。
エラーに関する情報を調べても明確が原因がわからず
手詰まりの状態となっています。
コーディングの方法は問題ないと思っているのですが、
何か問題があればご指摘をください。
(下記のエラーはgvOleOraDB.ExecuteNonQuery()にて発生します。)


●環境
OS :Windows Server2012 R2
FrameWork:.Net Framework4.6
TargetCPU:AnyCPU
Oracle関連:
・Oracle.ManagedDataAccess.dll(4.121.2.0)を使用してDBアクセス
・Oracleバージョン:11.2.0.3.0 -64bit Production


●プログラム概要

'■変数
Dim gvOleOraDB = New OracleCommand()
Dim para1 As New OracleParameter
Dim aryValue As ArrayList = New ArrayList

'■接続を開く
gvOleOraDB.Connection = New OracleConnection(ホスト,ユーザ,パスワード))
gvOleOraDB.Connection.Open()

'■パラメータ設定
With gvOleOraDB
With para1
.OracleDbType = OracleDbType.Char
.Direction = ParameterDirection.Input
.ParameterName = "pvhairetsu"
.CollectionType = OracleCollectionType.PLSQLAssociativeArray
aryValue.Clear()
aryValue.Add(値1)
aryValue.Add(値2)
aryValue.Add(値3)
.Value = DirectCast(aryValue.ToArray(GetType(String)), String())
.Size = UBound(wvBmnTbl)
End With
.Parameters.Add(para1)
End If
End With
.Parameters.Add("param1", OracleDbType.Char, 1, pv1 , ParameterDirection.Input)

'-- プロシジャに渡すパラメタ作成(PL/SQL表以外)
.Parameters.Add("prCur" , OracleDbType.RefCursor , ParameterDirection.Output)
.Parameters.Add("prStatus", OracleDbType.Int16, 2, 0 , ParameterDirection.Output)
.Parameters.Add("prErrMsg", OracleDbType.Varchar2, 128, "", ParameterDirection.Output)

End With

'■プロパティ設定
gvOleOraDB.CommandText = 該当のPL/SQL(コンパイル済み)
gvOleOraDB.CommandType = CommandType.StoredProcedure
gvOleOraDB.BindByName = True

'■PL/SQLの実行
gvOleOraDB.ExecuteNonQuery()


●エラーログの内容
Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-00604: 再帰SQLレベル1でエラーが発生しました。ORA-01003: 解析された文がありません。
場所 OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
場所 OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean bFirstIterationDone)
場所 OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, Boolean isFromEF)
場所 Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
場所 AXRefMst.clAXRefMst.gfInit(String pvSubSystemCd, String pvSyainCd, Int16 IniID, String pvSysCd, String pvBmnKbn, String pvBmnSumKbn, String pvYukoKbn, String pvInit, Object pvOleOraDB)

引用返信 編集キー/
■84634 / inTopicNo.2)  Re[1]: 配列を使用したPL/SQLの呼び出しでエラー
□投稿者/ 魔界の仮面弁士 (1354回)-(2017/07/24(Mon) 13:22:56)
2017/07/24(Mon) 13:23:46 編集(投稿者)

No84630 (makoto さん) に返信
> 何か問題があればご指摘をください。

新規投稿時の注意事項に、
  『半角カナは使用しないでください。文字化けの原因になります。』
という注意書きが表示されていたかと思います。次回投稿時以降ご留意ください。


> ORA-01003: 解析された文がありません。

PL/SQL 側のカーソルの扱いに問題があるのではないでしょうか。
処理を単純化した PL/SQL を用意してみて、
それでも現象が再現するか確認してみてください。


> コーディングの方法は問題ないと思っているのですが、

問題ありますよ。

gvOleOraDB.Connection の括弧の数が合わないのはさておき、
少なくとも With と End With の数が一致していないので、
これではビルドエラーになってしまうでしょう。
(そのため、提示頂いたコードの動作をこちらでは確認できていません)


本題と関係ないところで言えば、With を入れ子にする妥当性が無い様に見えます。
また、String 配列を作るために ArrayList.ToArray() を使っているのは何故でしょう。
ボックス化を解除する手間を考えると、最初から List(Of String).ToArray() を
使った方が効率が良いと思うのですが…。
(あるいはせめて StringCollection.CopyTo() を使うとか)


また、コード各行の記述にも統一感が無いようにみえます。
たとえば:

 引数の無いコンストラクタを呼び出す際に
 「New ClassName()」表記と「New ClassName」表記が混在している

 変数宣言の際に
  Dim a As New Class1()
  Dim a As Class1 = New Class1()
  Dim a = New Class1()
 の 3 パターンが混在している。

など。
引用返信 編集キー/
■84636 / inTopicNo.3)  Re[2]: 配列を使用したPL/SQLの呼び出しでエラー
□投稿者/ makoto (30回)-(2017/07/24(Mon) 15:08:31)
魔界の仮面弁士様

回答ありがとうございます。
問題点はPL/SQL自体に問題がありました。
(PL/SQL内で動的SQLを生成しておりその文字列に問題があったため)


>新規投稿時の注意事項に、半角カナは使用しないでください。文字化けの原因になります。』
前回も同様の指摘を受けたためチェックはしたのですが、漏れていました。申し訳ございません。


>問題ありますよ。
ご指摘ありがとうございます。コードの作り自体は見直す予定です。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -