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

它可以很好地运行前两个表,但是在第三个表上,它被卡住并且应用程序永远运行......

有趣的是,当我切换“GROUP_REPORT_EMAIL_LIST”和“GROUP_EQUIPMENT_GROUP_STN_XREF”时,应用程序会在遇到第二个表名后永远运行。

因此,总而言之,该函数在命中“GROUP_EQUIPMENT_GROUP_STN_XREF”时将永远运行。我已经通过在 toad 上测试它来验证生成的 SQL 是否有效。

还有其他人遇到这个问题吗?

编辑 - 前两个表在运行时确实被清除了。

解决方案

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

那张表里有很多数据吗?这可以解释为什么删除数据需要这么长时间。
无论如何,我建议TRUNC用于清理表格。

于 2011-03-21T16:40:49.030 回答
3

大量删除可能会非常慢,尤其是在一个事务中运行它们时。如果您根本不需要交易,请使用:

truncate table YourTable

如果这样做,请拆分delete过小规模的交易。基本上运行:

delete from YourTable where rownum < 100

直到桌子空了。例如见这篇博文

于 2011-03-21T16:46:27.943 回答
2

我可能会编写一个存储过程来执行所有删除或截断并调用 SP 一次,而不是有一个循环客户端。

编辑:最好不要在循环内创建命令对象。使用 table-name 参数在循环外创建一次,然后在每次迭代时调用它为它提供不同的参数值。但是首选SP。

于 2011-03-21T16:52:12.540 回答