但是,当我在运行以下代码时遇到问题时,我必须清除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();
}截断将是一个非常好的解决方案,但是我没有这样做的特权!
发布于 2011-03-22 00:41:49
您是否忘记在Toad (或任何其他客户端)中提交更改?打开的事务将导致它无限期地等待。
发布于 2011-03-22 00:40:49
表中有很多数据吗?这就解释了为什么要花这么长时间才能删除数据。
无论如何,我建议使用TRUNC来清除表。
发布于 2011-03-22 00:46:28
大量的删除可能会非常慢,特别是当您在一个事务中运行它们时。如果您根本不需要事务,请使用:
truncate table YourTable如果这样做,那么将delete拆分到小型事务上。基本上就是运行:
delete from YourTable where rownum < 100直到表为空。例如,请参阅此blog post。
https://stackoverflow.com/questions/5380688
复制相似问题