4

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();
            }

TRUNCATEは非常に優れたソリューションでしたが、私にはそうする特権がありません。

4

4 に答える 4

10

Toad(または他のクライアント)で変更をコミットするのを忘れましたか?開いているトランザクションにより、無期限に待機します。

于 2011-03-21T16:41:48.627 に答える
3

多数の削除は、特に1つのトランザクションで実行する場合、非常に遅くなる可能性があります。トランザクションがまったく必要ない場合は、次を使用します。

truncate table YourTable

その場合は、delete小規模なトランザクションに分割してください。基本的に実行します:

delete from YourTable where rownum < 100

テーブルが空になるまで。たとえば、このブログ投稿を参照してください。

于 2011-03-21T16:46:27.943 に答える
3

そのテーブルにはたくさんのデータがありますか?これは、データの削除に非常に時間がかかる理由を説明します。
とにかく、私はTRUNCテーブルをクリアするために使用することをお勧めします。

于 2011-03-21T16:40:49.030 に答える
2

クライアント側でループするのではなく、すべての削除または切り捨てを実行し、SPを1回呼び出すストアドプロシージャを作成する可能性があります。

編集:ループ内にコマンドオブジェクトを作成しない方がよいでしょう。table-nameパラメーターを使用してループの外側で一度作成し、それを呼び出して、反復ごとに異なるパラメーター値をフィードします。ただし、SPが優先されます。

于 2011-03-21T16:52:12.540 に答える