我正在构建一个与Oracle 11g数据库交谈的.NET应用程序。我试图从第三方提供的Excel文件中提取数据并插入(UPDATE
记录是否存在,INSERT
如果不存在),但是在性能方面存在一些问题。来自外部数据源的Oracle MERGE
这些Excel文件将取代资费代码和说明,因此每个文件中有几千条记录。
| Tariff | Description |
|----------------------------------------|
| 1234567890 | 'Sample description here' |
我做了批量插入一些研究,甚至还写道,在应用程序打开一个交易功能,执行一堆UPDATE
或INSERT
语句,然后提交。不幸的是,这需要很长时间,并延长了应用程序和数据库之间的会话。
public void UpsertMultipleRecords(string[] updates, string[] inserts) {
OleDbConnection conn = new OleDbConnection("connection string here");
conn.Open();
OleDbTransaction trans = conn.BeginTransaction();
try {
for (int i = 0; i < updates.Length; i++) {
OleDbCommand cmd = new OleDbCommand(updates[i], conn);
cmd.Transaction = trans;
int count = cmd.ExecuteNonQuery();
if (count < 1) {
cmd = new OleDbCommand(inserts[i], conn);
cmd.Transaction = trans;
}
}
trans.Commit();
} catch (OleDbException ex) {
trans.Rollback();
} finally {
conn.Close();
}
}
我发现通过向汤姆说做这样的事情的一种有效的方法是使用Oracle MERGE
声明,在9i中实现的。据我所知,这只能使用Oracle中的两个现有表。我尝试过,但不了解临时表,或者如果这是可能的。如果我在MERGE
上创建了一个只包含我的数据的新表,我仍需要一种可靠的批量插入方式。
一个问题:我将不得不从Web应用程序运行sql * loader以便重复使用它。这可能吗? – tedski
它可以从命令行运行,但Web服务器也应该是我猜测的数据库服务器。不是一个好习惯。 可能更适合使用.NET批量插入。提示:如果在BEGIN ... END中有很多插入语句,正文中,Oracle会将其视为单个语句并仅解析一次。快得多。 – winkbrace
不错的建议。我最终使用这篇文章进行批量插入:http://dotnetslackers.com/articles/ado_net/BulkOperationsUsingOracleDataProviderForNETODPNET.aspx 我创建了一个表来保存数据并使用了你的'MERGE'语句。它工作得很好。谢谢! – tedski