質問

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は好まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top