当前位置: 代码网 > it编程>数据库>Oracle > Oracle 临时表 OracleDataAdapter 批量更新的实现思路

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

2024年09月07日 Oracle 我要评论
oracle 临时表 oracledataadapter 批量更新/// <summary> /// 注意,字段名必需大小写保持一致 /// </summ

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 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com