私は、データを挿入するために機能し、何ヶ月も機能しているストアドプロシージャを持っています。
これが「短い」バージョンです。
procedure saveApplication( in_confirmation_number varchar2 := null
,in_nonstandard_address varchar2 := null
,in_absentee_type varchar2 := null) AS
BEGIN
insert into vr_application (
confirmation_number
,nonstandard_address
,absentee_type )
values ( in_confirmation_number
,in_nonstandard_address
,in_absentee_type
);
END;
私は大量に作業しているので、データテーブルから値を取得した後、データを配列として詰め込みます。繰り返しますが、以下は「短縮」バージョンです。
private static void loadFiles(DataTable dt, string connString, ErrorLogger log)
{
OracleConnection orclconn = null;
OracleCommand cmd = null;
using (orclconn = new OracleConnection(connString))
{
orclconn.Open();
using (cmd = BuildCommand(dt))
{
cmd.Connection = orclconn;
cmd.ExecuteNonQuery();
}
}
}
private static OracleCommand BuildCommand(DataTable dt)
{
OracleCommand cmd = new OracleCommand();
cmd.CommandText = "Applications.saveApplication";
cmd.CommandType = CommandType.StoredProcedure;
cmd.ArrayBindCount = dt.Rows.Count;
cmd.BindByName = true;
string[] CONFIRMATION_NUMBER = dt
.AsEnumerable()
.Select(row => row.Field<string>("CONFIRMATION_NUMBER"))
.ToArray();
OracleParameter in_confirmation_number = new OracleParameter();
in_confirmation_number.OracleDbType = OracleDbType.Varchar2;
in_confirmation_number.Value = CONFIRMATION_NUMBER;
in_confirmation_number.ParameterName = "in_confirmation_number";
cmd.Parameters.Add(in_confirmation_number);
string[] ABSENTEE_TYPE = dt
.AsEnumerable()
.Select(row => row.Field<string>("ABSENTEE_TYPE"))
.ToArray();
OracleParameter in_absentee_type = new OracleParameter();
in_absentee_type.OracleDbType = OracleDbType.Varchar2;
in_absentee_type.Value = ABSENTEE_TYPE;
in_absentee_type.ParameterName = "in_absentee_type";
cmd.Parameters.Add(in_absentee_type);
string[] NONSTANDARD_ADDRESS = dt
.AsEnumerable()
.Select(row => row.Field<string>("NONSTANDARD_ADDRESS"))
.ToArray();
OracleParameter in_nonstandard_address = new OracleParameter();
in_absentee_type.OracleDbType = OracleDbType.Varchar2;
in_absentee_type.Value = NONSTANDARD_ADDRESS;
in_absentee_type.ParameterName = "in_nonstandard_address";
cmd.Parameters.Add(in_nonstandard_address);
return cmd;
}
シナリオ1: nonstandard_addressコードがコメント化されています。すべてが機能します。
シナリオ2: nonstandard_addressコードはコメント化されていません。しかし、元のデータテーブルに値を渡す代わりに、値「null」をハードコーディングします。すべてが機能します。これはそれが何ヶ月も続いているところです。
シナリオ3: 非標準アドレスのデータテーブルに、非標準アドレスの値を持つ単一の行があります。他のすべての行には、この列のnullが含まれています。Oracle.DataAccess.Client.OracleException、#ORA-06550が表示され、次のいずれかが必要な場合に「シンボルに遭遇しました>」というメッセージが表示されます。
問題を特定するために、配列内の値をループするだけです。最後のループ反復で同じエラーが発生します。これは、常にデータテーブルのレコード数(100)より1つ多くなります。しかし、非標準のOracleパラメータを作成しようとせずにループすると、エラーは発生せず、ループの反復は100回だけになります。
シナリオ2を実行し、nonstandard_addressを除くすべてをテーブルに正常に入力すると、Oracleで次のコマンドを実行して、テーブルを正常に更新できます。
update vr_application a
set nonstandard_address = (select nonstandard_address from unprocessed_apps b where b.confirmation_number = a.confirmation_number)
where exists (select 1 from unprocessed_apps where confirmation_number = a.confirmation_number)
誰かがここで間違いを見ることができますか?これを見た人はいますか?私は困惑しています。