OracleCommand Command、ExecutenonQueryの問題
-
28-10-2019 - |
質問
Oracleデータベースの特定のテーブルをクリアする必要がありますが、次のコードの実行に問題がある場合は
public static void ClearDataTables(IList<string> tableNames)
{
string connectionString = "CONNECTIONSTRING";
using (OracleConnection connection = new OracleConnection())
{
connection.ConnectionString = connectionString;
connection.Open();
foreach (string table in tableNames)
{
OracleCommand command = connection.CreateCommand();
string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table);
command.CommandText = sql;
command.ExecuteNonQuery();
}
connection.Close();
}
}
このリストでこの方法を呼び出しています
ClearDataTables(new List<string> { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"});
最初の2つのテーブルは正常に実行されますが、3番目のテーブルでは立ち往生し、アプリケーションは永遠に実行されます...
おもしろいことに、「Group_Report_Email_List」と「Group_Equipment_Group_Stn_xref」を切り替えると、アプリケーションは2番目のテーブル名にヒットした後も永久に実行されます。
したがって、結論として、関数は「group_equipment_group_stn_xref」にヒットすると永久に実行されます。 SQLがヒキガエルでテストすることにより、作業を生成したことを確認しました。
他の誰かがこの問題に出くわしましたか?
編集 - 最初の2つのテーブルは、実行時に実際にクリアされます。
解決
string connectionString = "CONNECTIONSTRING";
using (OracleConnection connection = new OracleConnection(connectionString))
{
connection.Open();
OracleCommand command = connection.CreateCommand();
OracleTransaction trans = connection.BeginTransaction();
command.Transaction = trans;
foreach (string table in tableNames)
{
string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table);
command.CommandText = sql;
command.ExecuteNonQuery();
}
trans.Commit();
}
トランケートは非常に素晴らしい解決策だったでしょうが、私はそうする特権を持っていません!
解決
ヒキガエル(または他のクライアント)で変更を犯すのを忘れましたか?オープントランザクションにより、無期限に待機することができます。
他のヒント
その表に多くのデータがありますか?これは、データを削除するのに非常に時間がかかる理由を説明します。
とにかく、私は使用することをお勧めします TRUNC
テーブルのクリア用。
特に1つのトランザクションで実行する場合、多数の削除が非常に遅くなる可能性があります。トランザクションがまったく必要ない場合は、以下を使用してください。
truncate table YourTable
もしそうなら、分割します delete
小型のトランザクションを超えて。基本的に実行:
delete from YourTable where rownum < 100
テーブルが空になるまで。たとえば、これを参照してください ブログ投稿.
ループクライアント側ではなく、すべての削除または切り捨てを行い、SPを1回呼び出すストアドプロシージャを作成するでしょう。
編集:ループ内にコマンドオブジェクトを作成しない方が良いでしょう。 Table-Nameパラメーターでループの外側に一度作成し、各反復で異なるパラメーター値にフィードするように呼び出します。しかし、SPは好まれます。