2012-02-29 19 views
5

私はここで、.net 4.0 c#、IBatisNetおよびCSLAフレームワークのエンタープライズ・プロジェクトを持っています。"ORA-01084:OCIコールで無効な引数"を追い越す

パッケージでinsert procを呼び出すと、プロジェクトジョブの1つがORA-01084: invalid argument in OCI callで失敗しています。返されるエラーメッセージは最高ですが、格納されたprocには名前でバインドされていない83個の入力パラメータがあります(IBatisのおかげで)。

好奇心は何ですか:私はOrderOrderItemsという一連のレコードを持っています。 Orderには28件の注文アイテムがあります。ジョブは、別のOrderを作成し、すべてOrderItemsレコードをコピーして注文を更新する必要があります。新しいオーダーアイテムは、古いオーダーアイテムをParentOrderItemIdフィールドで参照しています。これは、更新予定のOrdersの選択基準です。

初めて実行するとOrderItemId: 12345にプロセスが吹き込み、ORA-01084というエラーが表示されます。しかし、次回に再実行すると、OrderItemId: 12345が正常に処理されます。そして、OrderItemId: 12444で爆破する。その後、再実行してOrderItemId: 12444などを正しく処理していきます。

私は両方のケースで同じDbParametersのログを持っています。

私はociクライアントトレースを持っていますが、それは役に立ちません。

私はデータベースレイヤーにログを記録しましたが、これまでは何も与えていません。

これらのタイプのエラーをトレースする方法はありますか?

+1

漠然とした考え方:OCIコールに渡されたパラメータが最初の失敗と2番目の成功した実行で同じである場合(DbParametersのログに表示されているように)、何らかの初期化エラーが発生する可能性があります。値。 –

+0

「データベースレイヤーにログオンしています」と言えば、ストアドプロシージャが入力パラメータを記録するので、カラム値の不一致がどこかで起きたことを確認できますか? –

+0

ええ、どこにでも徹底したロギングを追加して、何が入ったり来たりしているかを詳細に確認できます。 – b0rg

答えて

1

私はこれらの年の後に、私は答えを提供する必要があると思います。

問題は、Oracle .Netドライバの深いところにあります。 QtyフィールドをINTとして定義しました。内部アーキテクチャのために、Qtyは負またはヌルになる可能性があります。ケースの95%Qtyは正の整数である必要がありますが、調整やその他の要因によってはnullまたは負の値があります。

だから最後に私はあなたがデータベースにあなたの記録を置く方法のためにそれをトレースさ:

数量1 数量0 数量のヌル 数量-1

正しく動作

しかし、この場合は

数量のヌル 数量1 数量-1

"-1" 値のOCI無効な引数を指定して爆破します。

私はOracleでチケットを作成し、製品チームに送って修正しました。それ以来、私は動いていました。

+1

ちょうど12c ODP.Netを試しても、そのバグはまだそこにあるようです。だから、彼らはそれを修正していないようだ、私たちのアプリケーションで一貫してそれを複製することができます。 – dcp

+1

私のプロジェクトは当時はかなり小さかったので、私はOracleでそれを追いかけることはありませんでした。皆さんが時間とOracleのサポート計画を持っていれば、それを押し進めることができます。どちらか、またはQTYがヌル値ではないクルージング。 – b0rg

+1

私たちは時間がありません:)。とにかく、新しいManaged Oracle dllを使用すると、このバグは発生しません(Oracle.ManagedDataAccess.dllなど)。そのため、問題はdllのアンマネージバージョン(Oracle.DataAccess.dllなど)に限定されているようです。とにかく、これにあなたの記事のおかげで、それはあなたが同じ問題を抱えている誰かを知ることは常に良いです:)。 – dcp

0

これは価値がありますが、このエラーが発生しました。私のパラメータの1つに、問題が正しくないOracleTypeでした。タイプはNVarcharに設定され、データベース列はClobに変更されました。

パラメータOracleTypeを明示的に定義してください。

OracleParameter(string name, OracleType oracleType) 
3

私はこの同じエラーメッセージを受け取りました。私の場合、CLOB列に空の文字列を渡していたからです。通常は大きなXML文書を渡しますが、文書がないことがあります。今、私は空の文字列をチェックし、 "空"と書いています。

-1

データ型がnchar(2)のnull可能な列が問題でした。 nullを受け付けませんが、データの挿入時に渡す値が必要です。

+0

例を挙げておけば、これはおそらくもっと良い答えでした。 – Nae