【问题标题】:Oracle MERGE from external data source来自外部数据源的 Oracle MERGE
【发布时间】:2013-02-06 19:06:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# oracle merge bulkinsert


    【解决方案1】:

    我通常上传文件进行合并的方式是,首先使用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)
    

    【讨论】:

    • 一个问题:我必须从 Web 应用程序运行 sql*loader 才能重复使用它。这可能吗?
    • 它可以从命令行运行,但我猜网络服务器也应该是数据库服务器。不是一个好习惯。使用 .NET 批量插入可能更好。提示:如果您在 BEGIN ... END 中有很多插入语句;正文,Oracle 会将其视为单个语句,并且只解析一次。快很多。
    • 不错的建议。我最终使用这篇文章进行批量插入:dotnetslackers.com/articles/ado_net/… 我创建了一个表来保存数据并使用了您的MERGE 语句。它真的很好用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多