zoukankan      html  css  js  c++  java
  • 一条insert语句批量插入多条记录 AND 多条件游标更新 变CASE WHEN更新法提高速度

    一条insert语句批量插入多条记录

    常见的insert语句,向数据库中,一条语句只能插入一条数据:

    insert into persons 

    (id_p, lastname , firstName, city )

    values(204,'haha' , 'deng' , 'shenzhen');

    (如上,仅插入了一条记录)

    怎样一次insert插入多条记录呢?

    使用示例:

    insert into persons 

    (id_p, lastname , firstName, city )

    values

    (200,'haha' , 'deng' , 'shenzhen'),

    (201,'haha2' , 'deng' , 'GD'),

    (202,'haha3' , 'deng' , 'Beijing');

    这样就批量插入数据了, 遵循这样的语法,就可以批量插入数据了。

    执行成功,截图:

    据说,在程序开发中,一次插入多条数据,比逐次一条一条的插入数据,效率高很多

    所以在程序开发的时候,使用此批量插入,也是比较不错的

    此语句在MySQL 5, postgreSQL 9.3执行通过。

    定义个结构体数组

     type ty_parmeter is record
     (
       v_hezuotype number(1),
       v_comefrom  varchar2(50),
       v_regchannel varchar2(50),
       v_newchannel nvarchar2(30)
     ) ;

     type ty_parmeter_table is table of ty_parmeter  index by binary_integer;
     parameter_arry  ty_parmeter_table;

    BEGIN

    parameter_arry(1).F_CHANNEL:=N'财付通';   parameter_arry(1).F_TYPE:=1; parameter_arry(1).F_COME:='cft';     parameter_arry(1).F_REG:='cftwan';
    parameter_arry(2).F_CHANNEL:=N'拍拍';     parameter_arry(2).F_TYPE:=1; parameter_arry(2).F_COME:='paipai';  parameter_arry(2).F_REG:='paipai';
    parameter_arry(7).F_CHANNEL:=N'支付宝';   parameter_arry(7).F_TYPE:=2; parameter_arry(7).F_COME:='zfb';     parameter_arry(7).F_REG:='zfbwan';
    parameter_arry(17).F_CHANNEL:=N'新浪';    parameter_arry(17).F_TYPE:=0; parameter_arry(17).F_COME:='%sina%';parameter_arry(17).F_REG:='NULL';
    parameter_arry(18).F_CHANNEL:=N'搜狐';    parameter_arry(18).F_TYPE:=0; parameter_arry(18).F_COME:='%sohu%';parameter_arry(18).F_REG:='NULL';
    parameter_arry(22).F_CHANNEL:=N'搜索引擎';parameter_arry(22).F_TYPE:=0; parameter_arry(22).F_COME:='SEO%';  parameter_arry(22).F_REG:='NULL';
    parameter_arry(23).F_CHANNEL:=N'主站';    parameter_arry(23).F_TYPE:=0; parameter_arry(23).F_COME:='NULL';  parameter_arry(23).F_REG:='NULL';

       for i in 1..14
        LOOP
          update t_gather_userinfo
           set    F_REG_CHANNEL=parameter_arry(i).f_channel,

                    F_UPDATEDATE=sysdate
           where  F_TYPE = parameter_arry(i).f_type
           AND    F_COME =parameter_arry(i).f_come
           AND    F_REG =parameter_arry(i).f_reg
           and    F_REG_CHANNEL is null;
          v_rownum :=sql%rowcount;
          COMMIT;
        END LOOP;


       for i in 15..22 loop
          update t_gather_userinfo
           set    F_REG_CHANNEL=parameter_arry(i).f_channel,

                    F_UPDATEDATE=sysdate
           where  F_TYPE = parameter_arry(i).f_type
           AND    F_COME like parameter_arry(i).f_come

           AND    F_REG =parameter_arry(i).f_reg
           and    F_REG_CHANNEL is null;
           v_rownum :=sql%rowcount;
          COMMIT;
       end loop;

       update t_gather_userinfo
           set    F_REG_CHANNEL=parameter_arry(23).f_channel,

                    F_UPDATEDATE=sysdate
           where F_REG_CHANNEL is null;
       v_rownum :=sql%rowcount;
       COMMIT;

    这段代码 在8个CPU 32核 30G内存机器上跑 时间 1分钟,16分钟 26,28,30分钟

    要迁到差劲2个CPU  8核的机器上 跑的后果是 分别为 114,116,115,146分钟 update 1万9千条数据

    采用CASE WHEN写法 就全表扫描一次

      UPDATE t_gather_userinfo
          SET f_reg_new_channel =
                 CASE
                    WHEN f_type = 1 AND f_come = 'CFT' AND f_reg = 'cftwan'
                       THEN '财付通'
                    WHEN f_type = 1 AND f_come = 'PAIPAI' AND f_reg = 'paipai'
                       THEN '拍拍频道'
                    WHEN f_type = 2 AND f_come = 'ZFBReg' AND f_reg = 'zfbwan'
                       THEN '支付宝'
                    WHEN f_type = 0 AND f_come LIKE '%sina%'
                       THEN '新浪'
                    WHEN f_type = 0 AND f_come LIKE '%sohu%'
                       THEN '搜狐'
                 ELSE 'MAINWEB'
                 END,
              f_updatedate = SYSDATE
        WHERE f_reg_new_channel IS NULL;    

  • 相关阅读:
    C#数组学习
    关于servlet中要写初始化逻辑应该重载有参还是无参的init
    servlet初识servletConfig
    servlet通过响应头Content-Disposition实现文件下载效果
    response中setCharacterEncoding和setContentType的区别
    通过refresh响应头,定时刷新或隔n秒跳转页面
    通过location响应头实现重定向
    三层交换原理
    什么是CLOS架构?
    Cat8 八类网线是什么?与Cat5、Cat6、Cat7网线的区别?
  • 原文地址:https://www.cnblogs.com/aprils/p/3983375.html
Copyright © 2011-2022 走看看