首页 > 数据库 >Oracle 临时表 OracleDataAdapter 批量更新

Oracle 临时表 OracleDataAdapter 批量更新

时间:2024-07-04 09:10:21浏览次数:20  
标签:newRow OracleDataAdapter 批量 sql myDataAdapter table Oracle new conn

        /// <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 语法进行增删改 操作

 

标签:newRow,OracleDataAdapter,批量,sql,myDataAdapter,table,Oracle,new,conn
From: https://www.cnblogs.com/gxivwshjj/p/18282904

相关文章

  • SQLServer数据库批量kill会话的脚本(慎用!)
    微软大佬提供的一个批量kill会话的脚本,很凶很暴力,慎用慎用慎用!尤其是涉及大事务时。請注意:如果資料庫還在正在Recovery階段無效,因為無法Kill系統Session,必須等候Recovery完畢(或是重建交易紀錄檔案)。/*Function:KillallSPIDonspecificdatabaseandRepairWri......
  • Oracle PL / SQL变量
    变量是PL/SQL程序中特定数据类型的内存中的命名位置。我们必须在PL/SQL块的声明部分声明它们。变量命名PL/SQL变量必须遵循标识符命名规则:变量名称的长度必须小于31个字符。变量名称必须以大写或小写ASCII字母开头:AZ或az。PL/SQL不区分大小写。变量名称可以由1......
  • Oracle PL / SQL文字
    文字是一个显式的数字,字符,字符串或BOOLEAN值。例如,数字14和BOOLEAN FALSE是两个文字。数字字面量我们可以在算术表达式中使用两种类型的数字文字:整数和实数。整数字面值是一个可选的有符号整数,不带小数点。例如:36-141123+32767实数字面值是带小数点的......
  • Oracle PL / SQL数据类型
    PL/SQL是SQL的过程语言扩展,它支持与SQL对数据库相同的数据类型。PL/SQL可以处理任何数据库数据类型,并且还有自己的数据类型。VARCHAR2:我们将使用数据类型VARCHAR2处理PL/SQL中的字符串。PL/SQLVARCHAR2最多可容纳32,767个字符。NUMBER:我们将使用数据类型NUMBER处......
  • Oracle数据库统计信息收集
    Oracle数据库统计信息收集重新收集表统计信息--重新收集表统计信息BEGINDBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'ORCL',TABNAME=>'XXX',ESTIMATE_PERCENT=>100,DEGREE=>4);END;重新收集列统计信息......
  • Oracle临时表on commit preserve rows和on commit delete rows区别
    Oracle临时表:在Oracle中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。Oracle的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放......
  • ubuntu上安装oracle11g的错误解决
    环境:OS:16.04DB:11.2.0.4单机 发现在ubuntu上安装oracle,按照文档都已经安装了想要的包,但是检查还是无法通过,忽略后可以进行安装,但是需要修改很多地方1.安装的依赖包aptupdateapt-getinstallbinutilsapt-getinstalllibcap-devapt-getinstalllibstdc++5apt-get......
  • Oracle归档目录修改
    一.概要Oracle安装好后,把存档终点设置为USE_DB_RECOVERY_FILE_DEST,所以归档日志默认是保存在oracle系统的闪回恢复区(Flashrecoveryarea)的。默认的db_recovery_file_dest是2G,所以一般建议将存档终点修改为操作系统的适当目录查看归档目录SQL>archiveloglist;以上为归......
  • Mybatis使用foreach执行in语句、批量增删改查
    参考:https://www.cnblogs.com/leeego-123/p/10725210.html一、xml文件中foreach的主要属性foreach元素的属性主要有collection,item,index,separator,open,close。collection:表示集合,数据源item:表示集合中的每一个元素index:用于表示在迭代过程中,每次迭代到的位置separator:表示在......
  • 查询分析清理oracle阻塞会话
    1.查询CMS用户当前系统活动的会话selectt.SID,t.SERIAL#,t.STATUS,t.LOGON_TIME,t.LAST_CALL_ET,t.PROGRAM,t.LOCKWAIT,t.BLOCKING_SESSION,t.BLOCKING_SESSION_STATUS,t.BLOCKING_INSTANCE,t.USERNAME,t.PROCESS,t.OSUSER,t.SERVER,t.OSUSER,t.MACHINE,t.TERMINAL,t.PROCESS......