Oracle 临时表 OracleDataAdapter 批量更新的实现思路

 更新时间:2024年07月04日 09:09:50   作者:後生哥哥  
这篇文章主要介绍了Oracle 临时表 OracleDataAdapter 批量更新的实现思路,实现代码需要注意字段名必需大小写一致,需要的朋友可以参考下

Oracle 临时表 OracleDataAdapter 批量更新

/// <summary>
        /// 注意,字段名必需大小写保持一致
        /// </summary>
        protected static string updateSql = @"
Merge into Table_Name  T 
Using TempTable  S 
ON (T.USER_ID = S.USERID )
WHEN MATCHED 
THEN UPDATE SET T.NICK_NAME = S.NICKNAME,T.PHONENUMBER = S.PHONENUMBER ,T.AVATAR = S.AVATAR,T.JOB = S.JOB
";
        protected static string crateTemplateSql = @"
declare tableExistedCount number;   --声明变量存储要查询的表是否存在
 p_sql varchar(200);
Begin
     select count(1) into tableExistedCount  from user_tables t where t.table_name = upper('TempTable'); --从系统表中查询当表是否存在
DBMS_OUTPUT.PUT_LINE(tableExistedCount);
     if tableExistedCount  >0 then --如果不存在,使用快速执行语句创建新表
     DBMS_OUTPUT.PUT_LINE('删除旧表');
     for r in (select a.table_name from user_tables a where a.table_name =upper('TempTable')) loop
      p_sql:='TRUNCATE TABLE '||r.table_name;
      DBMS_OUTPUT.PUT_LINE(p_sql);
      execute immediate p_sql;
      p_sql:='drop table '||r.table_name;
      DBMS_OUTPUT.PUT_LINE(p_sql);
      execute immediate p_sql;
      end Loop;
     end if;
     execute Immediate
         '
        create global temporary table TempTable (
          userId Varchar(255),
          nickName Varchar(255) NULL,
          phonenumber Varchar(255) NULL,
          avatar Varchar(255) NULL,
          job Varchar(255) NULL
        )
         on commit delete  rows
 ';
end;";
        /// <summary>
        /// SqlBulkCopy 批量更新数据
        /// </summary>
        /// <param name="dataTable">数据集</param>
        /// <param name="crateTemplateSql">临时表创建字段</param>
        /// <param name="updateSql">更新语句</param>
        public static void BulkUpdateData(DataTable dataTable, string crateTemplateSql, string updateSql)
        {
            using (var conn = new Oracle.ManagedDataAccess.Client.OracleConnection(ConfigurationManager.ConnectionStrings["dbCon"].ConnectionString))
            {
                OracleTransaction trans = null;//关键第一步
                using (var command = new Oracle.ManagedDataAccess.Client.OracleCommand("", conn))
                {
                    try
                    {
                        conn.Open();
                        trans = conn.BeginTransaction();
                        //数据库并创建一个临时表来保存数据表的数据
                        command.CommandText = crateTemplateSql;
                        command.ExecuteNonQuery();
                        OracleCommand selectCmd=conn.CreateCommand();
                        //查询表头
                        selectCmd.CommandText = "select userId,nickName,phonenumber,avatar,job from TempTable where rownum=0";
                        OracleDataAdapter myDataAdapter = new OracleDataAdapter(selectCmd);
                        DataTable data = new DataTable();
                        myDataAdapter.Fill(data);
                        foreach (DataRow row in dataTable.Rows) {
                            DataRow newRow = data.NewRow();
                            newRow["userId"] = row["userId"];
                            newRow["nickName"] = row["nickName"];
                            newRow["phonenumber"] = row["phonenumber"];
                            newRow["avatar"] = row["avatar"];
                            newRow["job"] = row["job"];
                            data.Rows.Add(newRow);
                        }
                        //插入语句
                        myDataAdapter.InsertCommand=new OracleCommand("insert into TempTable(userId,nickName,phonenumber,avatar,job) values(:userId,:nickName,:phonenumber,:avatar,:job)", conn);
                        OracleCommandBuilder custCB = new OracleCommandBuilder(myDataAdapter);
                        custCB.ConflictOption = ConflictOption.OverwriteChanges;
                        custCB.SetAllValues = true;
                        foreach (DataColumn c in dataTable.Columns)
                        {
                            OracleParameter oraParameter = new OracleParameter(c.ColumnName, OracleDbType.Varchar2);
                            oraParameter.SourceColumn = c.ColumnName;
                            oraParameter.SourceVersion = DataRowVersion.Current;
                            myDataAdapter.InsertCommand.Parameters.Add(oraParameter);
                        }
                        int count = myDataAdapter.Update(dataTable);
                        dataTable.AcceptChanges();
                        myDataAdapter.Dispose();
                        /*
                        var cmd = new OracleCommand("select count(*) from transaction_temp_tb_lz2 --where user_Id in('615896266','602185346') ", conn);
                        var obj = cmd.ExecuteScalar();
                        */
                        // 执行Command命令 使用临时表的数据去更新目标表中的数据  然后删除临时表
                        command.CommandTimeout = 300;
                        command.CommandText = updateSql;
                        try {
                            int num = command.ExecuteNonQuery();
                            trans.Commit();
                        }
                        catch (Exception ex) {
                            trans.Rollback();
                            throw ex;
                        }
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
        }

整体需求如下:

从外部获取数据,要更新到数据库中的一张表,且每天都需要进行数据同步

实现思路

在数据库中创建一个事务临时表,表结构与外部获得的数据保持,将数据导入到临时表,然后使用 Merge into 语法进行增删改 操作

到此这篇关于Oracle 临时表 OracleDataAdapter 批量更新的文章就介绍到这了,更多相关Oracle 临时表 OracleDataAdapter 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Oracle多库查询方法(分享)

    基于Oracle多库查询方法(分享)

    下面小编就为大家分享一篇Oracle多库查询方法,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 基于oracle中锁的深入理解

    基于oracle中锁的深入理解

    本篇文章是对oracle中的锁进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • ORACLE中常用的几种正则表达式小结

    ORACLE中常用的几种正则表达式小结

    相信大家对正则表达式都不陌生,从linux下的命令到Java等编程语言,正则表达式无处不在,下面这篇文章主要给大家介绍了关于ORACLE中常用的几种正则表达式的相关资料,需要的朋友可以参考下
    2022-09-09
  • Oracle数据库创建存储过程的示例详解

    Oracle数据库创建存储过程的示例详解

    这篇文章主要介绍了Oracle数据库创建存储过程的示例详解,存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作。对此感兴趣可以了解一下
    2020-07-07
  • centos 6.5下安装oracle 11gR2与Oracle自动启动的配置

    centos 6.5下安装oracle 11gR2与Oracle自动启动的配置

    CentOS 下安装 Oracle 是一件比较麻烦的事情,下面这篇文章主要介绍了在 centos 6.5下安装oracle 11gR2的前的配置步骤,以及安装完成后,如何设置为随系统自动启动。配置完成后,启动图形化安装,没有什么可说的,本文就没有一一截图。需要的朋友可以参考借鉴。
    2017-01-01
  • Oralce数据导入出现(SYSTEM.PROC_AUDIT)问题处理方法

    Oralce数据导入出现(SYSTEM.PROC_AUDIT)问题处理方法

    A数据库打开了审计,而导入到B数据库时,B数据库审计没有打开,数据库中没有SYSTEM.PROC_AUDIT对象,本文将此问题的解决方法,需要的朋友可以参考下
    2012-12-12
  • oracle 多个字符替换实现

    oracle 多个字符替换实现

    CSDN上的一个网友,需要一个sql语句的解决方案需求是这样的求写oracle多个字符替换(有测试数据)
    2009-10-10
  • Oracle 临时表空间SQL语句的实现

    Oracle 临时表空间SQL语句的实现

    临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,本文主要介绍了Oracle 临时表空间SQL语句的实现,感兴趣的可以了解一下
    2021-09-09
  • oracle数据库导入.dmp脚本的sql 语句

    oracle数据库导入.dmp脚本的sql 语句

    这篇文章主要介绍了oracle数据库导入.dmp脚本的sql语句,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • 在Oracle表中进行关键词搜索的过程

    在Oracle表中进行关键词搜索的过程

    这篇文章主要介绍了在Oracle表中进行关键词搜索的过程,我们可以通过Oracle SQL Developer或Toad运行PL/SQL块,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论