- - PR -
ストアド実行エラー(ORA-24338)
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-08-01 16:54
いつもお世話になっています。 オラクルのPL/SQLを実行しているのですが、今まで正常に行えていた ストアド実行が、リビルド後「ORA-24338文字の処理が実行されません」と いうエラーが発生するようになりました。 ただ、ストアド自体は正常に終了できているようで、戻り値に値が 帰ってきています。 色々調べたのですが、検討がつきません。 おなじ様な現象に遭遇した方いらっしゃいませんか? <ストアドCall> OraCmd = new OracleCommand("PK_XXX.FC_YYY","オラクルコネクション"); OraCmd.CommandType = CommandType.StoredProcedure; pMaker = "1000"; pTaid = "1"; OraCmd.Parameters.Clear(); Parameters.Add(new OracleParameter("rVal", OracleType.Int16,1)).Direction= ParameterDirection.ReturnValue; OraCmd.Parameters.Add(new OracleParameter("IN_MAKER", OracleType.VarChar)).Value = pMaker; OraDBCmd.OraCmd.Parameters.Add(new OracleParameter("IN_TAID", OracleType.VarChar)).Value = pTaid; OraCmd.Parameters.Add(new OracleParameter("OUT_MSG", OracleType.VarChar,2000)).Direction = ParameterDirection.Output; OraCmd.Parameters.Add(new OracleParameter("OUT_CURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output; OracleDataAdapter MyDA = new OracleDataAdapter(OraDBCmd.OraCmd); OraDBCmd.OraCmd.ExecuteNonQuery(); <----ここでエラー発生 | ||||
|
投稿日時: 2005-08-01 17:17
こんにちは、じゃんぬ です。
そういう時は、C# 側のソースではなくて、PL/SQL 側のソースを疑った方が良いです。 エラーが起きた時のパラメータを渡して、Oracle 側で実行してみてください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-08-01 17:35
じゃんぬ さん 返信ありがとうございます。 エラーが出た際、Oracleのストアドも疑ったので、PL/SQL Developerを使って 検証してみました。その結果正常に終了できていたので C#側のソースなんだろうと思ったのですが。。。 ちなみに Oracmd.Parameters["rVal"].Value.ToString() としてやると、値は入っているのです。。 いったいなんなのでしょうか・・・。 | ||||
|
投稿日時: 2005-08-01 17:44
こんにちは、じゃんぬ です。
うーん、ORA-24338 ですから PL/SQL 側だと思うのですが... ORA-24338: 文の処理が実行されません。 原因: 文ハンドルを実行する前に、フェッチまたは記述が実行されようとしました。 処置: 文を実行してからデータをフェッチまたは記述してください。 全く心当たりはありませんか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-08-01 18:00
参考になりますでしょうか?
http://www.orafaq.com/forum/t/4521/0/ http://support.microsoft.com/default.aspx?scid=kb;ja;321715 | ||||
|
投稿日時: 2005-08-02 10:15
夏椰さん、じゃんぬさん
返信ありがとうございます。 エラーの原因が判明しました。 OracleのPL/SQLでカーソルをOpen後、 戻り値変数にカーソルを設定し、その後すぐCloseしていました。 そのCloseを外したら、正常に実行されました。 (リビルドしたからエラーが出たのでは無く、ストアドも修正したあとで リビルドし、実行したらエラーがでた為、エラー原因を勘違いしてしまいました) カーソルをCloseしてしまっているから、ソース側でデータが取得 できないのでしょうが、その場合、カーソルはCloseしないまま 終わっていることにならないのでしょうか? 引き続き調べてみます。 <ストアド> FUNCTION FC_XXXXX ( IN_MAKER IN VARCHAR2 ,IN_TAID IN VARCHAR2 ,OUT_MSG OUT VARCHAR2 ,OUT_CURSOR OUT type_cursor ) RETURN SMALLINT IS BEGIN SQL文 --カーソルオープン OPEN W_CURSOR FOR SQL文; -- OUT引数にカーソルを渡す OUT_CURSOR := W_CURSOR; CLOSE W_CURSOR; <--これをコメントにすると正常に終了 /* 正常終了 */ return(0) ; <ストアドCall側> DataSet ds = new DataSet(); OraDBCmd.OraCmd.Parameters.Clear(); OraDBCmd.OraCmd.Parameters.Add(new OracleParameter("rVal", OracleType.Int16)).Direction= ParameterDirection.ReturnValue; OraDBCmd.OraCmd.Parameters.Add(new OracleParameter("IN_MAKER", OracleType.VarChar)).Value = pMaker; OraDBCmd.OraCmd.Parameters.Add(new OracleParameter("IN_TAID", OracleType.VarChar)).Value = pTaid; OraDBCmd.OraCmd.Parameters.Add(new OracleParameter("OUT_MSG", OracleType.VarChar,2000)).Direction = ParameterDirection.Output; OraDBCmd.OraCmd.Parameters.Add(new OracleParameter("OUT_CURSOR", OracleType.Cursor)).Direction = ParameterDirection.Output; OracleDataAdapter MyDA = new OracleDataAdapter(OraDBCmd.OraCmd); OraDBCmd.OraCmd.ExecuteOracleScalar(); rVal = OraDBCmd.OraCmd.Parameters["rVal"].Value.ToString(); if(rVal=="0") { MyDA.Fill(ds); rFlg=true; } | ||||
|
投稿日時: 2005-08-02 10:29
http://otndnld.oracle.co.jp/document/products/oracle10g/101/doc_v6/win.101/B15519-01/featRefCursor.htm#sthref277 を読まれたことはありますでしょうか? | ||||
|
投稿日時: 2005-08-02 13:14
夏椰 さん
参考サイトありがとうございました。 やはり、Closeしてはダメなんですね。 |
1