0

我正在构建一个与 Oracle 11g 数据库对话的 .NET 应用程序。我正在尝试从第三方提供的 Excel 文件中获取数据并进行更新(UPDATE如果存在,则记录,INSERT如果不存在),但在性能方面遇到了一些问题。

这些 Excel 文件用于替换关税代码和描述,因此每个文件中有几千条记录。

|   Tariff   |        Description        |
|----------------------------------------|
| 1234567890 | 'Sample description here' |

我对批量插入进行了一些研究,甚至编写了一个在应用程序中打开事务,执行一堆UPDATEorINSERT语句,然后提交的函数。不幸的是,这需要很长时间并且会延长应用程序和数据库之间的会话。

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

我通过 Ask Tom 发现,执行此类操作的一种有效方法是使用 OracleMERGE语句,该语句在 9i 中实现。据我了解,这只能使用 Oracle 中的两个现有表。我已经尝试过但不了解临时表,或者如果可能的话。如果我创建一个只保存我的数据的新表MERGE,我仍然需要一种可靠的批量插入方式。

4

1 回答 1

0

我通常将文件上传到合并的方式是首先使用sql*loader插入加载表,然后从加载表执行合并语句到目标表。

临时表只会在会话期间保留其内容。我希望 sql*loader 在完成后结束会话,因此最好使用在合并后截断的普通表。

merge into target_table t
using load_table l on (t.key = l.key) -- brackets are mandatory
when matched then update
set t.col = l.col
,   t.col2 = l.col2
,   t.col3 = l.col3
when not matched then insert
(t.key, t.col, t.col2, t.col3)
values
(l.key, l.col, l.col2, l.col3)
于 2013-02-06T19:17:28.667 回答