C# OracleCommand命令,ExecuteOnQuery问题
但是,当我在运行以下代码时遇到问题时,我必须清除oracle数据库中的某些表C# OracleCommand命令,ExecuteOnQuery问题,c#,sql,oracle10g,executenonquery,oraclecommand,C#,Sql,Oracle10g,Executenonquery,Oraclecommand,但是,当我在运行以下代码时遇到问题时,我必须清除oracle数据库中的某些表 public static void ClearDataTables(IList<string> tableNames) { string connectionString = "CONNECTIONSTRING"; using (OracleConnection connection = new OracleConnection())
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();
}
}
TRUNCATE将是一个非常好的解决方案,但是我没有这样做的特权 那张表中有很多数据吗?这可以解释为什么删除数据需要这么长时间。
无论如何,我建议使用
TRUNC
来清除表格。您是否忘记在Toad(或任何其他客户机)中提交更改?打开的事务将导致它无限期等待 大量删除可能非常慢,尤其是在一个事务中运行时。如果您根本不需要交易,请使用:
truncate table YourTable
如果是,请将delete
拆分为小型事务。基本运行:
delete from YourTable where rownum < 100
从rownum<100的表中删除
直到桌子空了。请参见此示例。我可能会编写一个存储过程来执行所有删除或截断,并调用SP一次,而不是使用循环客户端
编辑:最好不要在循环中创建命令对象。使用表名参数在循环外部创建一次,然后调用它,并在每次迭代中为其提供不同的参数值。但是SP是首选。您不能确定OP是否确实需要撤消功能,而当使用
trunc
清除表时,该功能不可用。@Mike:在提交后如何撤消删除
?可以通过撤消功能查看恢复场景@迈克:谢谢你的链接。不幸的是,我想我无法理解这与撤消已提交的删除有什么关系。在生产环境中,很可能要在某一点上手动恢复被删除的数据(文档中的flasback)。截断表可以消除这种可能性。您没有提供任何建议截断而不是删除的原因。是否有完整源代码示例的最终解决方案可以解决此问题?
truncate table YourTable
delete from YourTable where rownum < 100