これが Oracle ODP.NET プロバイダーのバグなのかどうか知りたいです。パラメータ化された挿入ステートメントを作成しました。パラメータの 1 つに「:EMPNO」という名前を付けました。テストすると、値は「8000」になりました。データベースでは、EMPNO 列は varchar2(4 バイト) として定義されていました。ただし、挿入により次のエラーメッセージが表示されました
ORA-12899: 列"HR"."HR_DEPARTURE"."EMPNO"の値が大きすぎます(実際: 6、最大: 4)
いくつかのコード スニペットを次に示します。
"INSERT INTO HR.HR_DEPARTURE (EMPNO) ':EMPNO'"
次に、パラメーターを追加します
new OracleParameter(":EMPNO", OracleDbType.Varchar2) {Value = empNo ?? Convert.DBNull}
コマンドを作成し、パラメーターを追加します (複数のパラメーターがあったため、配列)
DbCommand cmd = Connection.CreateCommand();
cmd.Parameters.AddRange(sqlParams.ToArray());
私はいくつかの調査を行い、エンコーディングや、Oracle がデフォルトで (BindByName ではなく) 位置でバインドするという事実について検討しました。ただし、これらのいずれも問題を解決しませんでした。その後、暗闇で撮影し、パラメーター名を「:EMPN」に変更したところ、次のエラー メッセージが表示されました。
ORA-12899: 列"HR"."HR_DEPARTURE"."EMPNO"の値が大きすぎます(実際: 5、最大: 4)
これにより、クエリが機能するときにパラメーター名を「:EMP」に変更するようになりました。プロバイダーが C# のパラメーター名にデータベースの列サイズを適用しているのは非常に奇妙です。データベースのサイズは、値を強制する必要があります (「8000」は、すべてのテストで同じにしました)。