精华内容
下载资源
问答
  • 使用存储过程批量修改数据 DELIMITER $$ CREATE PROCEDURE p12() BEGIN DECLARE a BIGINT DEFAULT 3333335811970; DECLARE b BIGINT DEFAULT 32323432424242425; DECLARE c BIGINT DEFAULT 1; WHILE c!=0 DO ...

    前言

    mysql 数据库 表 id 字段类型为 BIGINT,但是返回到 js 页面,由于长度过长,导致 chrome浏览器 preview和response返回Long类型值有差别。BIGINT 值已经足够大了,人为的在表里添加的id值过大,导致问题出现

    具体参考https://blog.csdn.net/sunmerZeal/article/details/80844843

    解决

    使用存储过程,批量修改数据

    DELIMITER $$
    CREATE PROCEDURE p12()
    BEGIN
    DECLARE a BIGINT DEFAULT 3333335811970;
    DECLARE b BIGINT DEFAULT 32323432424242425;
    DECLARE c BIGINT DEFAULT 1;
    WHILE c!=0 DO
    UPDATE t_merchant_business_audit SET id = a WHERE id = b;
    SET a=a+1;
    SET b=b+1;
    SET c=(SELECT COUNT(1) FROM t_merchant_business_audit WHERE id > 9007199254740992);
    END WHILE;
    END$$
    
    CALL p12()

    将过大的数值改小即可

    展开全文
  • 最近做了一个批量更新数据的小程序,采用的是mybatis调用oracle存储过程的方式。1.编写oracle存储过程,--mydept为传入参数create or replace procedure diary_refresh(mydept in varchar2) as--声明变量popAt Date;...

    最近做了一个批量更新数据的小程序,采用的是mybatis调用oracle存储过程的方式。

    1.编写oracle存储过程,

    --mydept为传入参数

    create or replace procedure diary_refresh(mydept in varchar2) as

    --声明变量

    popAt Date;

    lastAt Date;
    duration number;
    prjOn number;
    prjOff number;
    labor1On number;
    labor1Off number;
    labor2On number;

    labor2Off number;

    --cursor 游标  类似 容器 将查询到的结果存储

    cursor cur is select trunc(startsat,'dd') from (select distinct trunc(p.startsat,'dd') as startsat from prj p union select distinct trunc(hf.acceptedat,'dd') from prj hf) order by startsat;

    --开始 循环

    begin

    --防止重名字段插入

      delete from hf_diaryy where dept=mydept;

      commit;

    --查询 表prj中最小时间赋给lastAt

      select min(startsAt) into lastAt from prj;

    --打开 游标

      open cur;

    loop

    -- 循环将 cur中的数据赋给 popAt

      fetch cur into popAt;

    -- 判断 游标是否结果 并跳出循环

      exit when cur %notfound ;

    --循环 查询符合业务条件的数据 赋给变量

      select popAt-lastAt into duration from dual;
      select count(*) into prjOn from prj where startsat<=lastAt and dept=mydept;
      select count(*) into prjOff from prj where acceptedat<lastAt and dept=mydept;
      select sum(labor1) into labor1On from prj where startsat<=lastAt and dept=mydept;
      select sum(labor1) into labor1Off from prj where acceptedat<lastAt and dept=mydept;
      select sum(labor2) into labor2On from prj where startsat<=lastAt and dept=mydept;

      select sum(labor2) into labor2Off from prj where acceptedat<lastAt and dept=mydept;

    --将 变量值 insert到指定的数据表中

      insert into hf_diaryy(dept,popAt,nextOneAt,duration,wip,labor1,labor2) values(mydept,lastAt,popAt,duration,prjOn-prjOff,labor1On-labor1Off,labor2On-labor2Off);

      lastAt:=popAt;

    --结束 循环

    end loop;
    commit;

    end diary_refresh;

    2. java中编写相应实体

    3. mybatis调用,mapper.xml中

    <!-- 调用存储过程,批量插入业务数据 -->
    <select id="upDept" parameterType="java.lang.String" statementType="CALLABLE">
    <![CDATA[{call DIARY_REFRESH(#{mydept,mode=IN,jdbcType=VARCHAR})}]]>

    </select>

    --获取session 执行

    session.selectOne(mapper.upDept, "123");

    展开全文
  • 方法一:使用临时表批量更新数据 (注意操作用户需要有mysql的创建临时表权限)delimiter $$# 删除 已有的 存储过程DROP PROCEDURE IF EXISTS update_user_account_method;# 创建新的存储过程CREATE PROCEDURE ...

    方法一:使用临时表批量更新表数据 (注意操作用户需要有mysql的创建临时表权限)

    delimiter $$

    # 删除 已有的 存储过程

    DROP PROCEDURE IF EXISTS update_user_account_method;

    # 创建新的存储过程

    CREATE PROCEDURE update_user_account_method()

    -- 批量更新HIK+手机号

    BEGIN

    # 批量更新sx_为xs_

    UPDATE sys_user  t

    SET  t.account = REPLACE (t.account,'sx_','xs_');

    # 创建临时表

    -- 不存在则创建临时表

    create temporary table if not exists tmp(id bigint(20) primary key,ac varchar(20) not null) ;

    -- 使用前先清空临时表

    truncate table tmp;

    # 查询HIK的账户数

    SET @num=(SELECT COUNT(1) FROM sys_user WHERE  account like concat('%','HIK','%'));

    # HIK的账户数大于0则执行

    if @num>0 then

    insert into tmp(id,ac)

    SELECT user_id,random_num

    FROM (

    SELECT user_id,concat('xs_',FLOOR(RAND()*50000000 + 50000000)) AS random_num

    FROM sys_user WHERE account like concat('%','HIK','%')

    ) AS ss

    WHERE random_num NOT IN (SELECT account FROM sys_user);

    end if;

    # 根据临时表更新表格对应的字段

    UPDATE sys_user ,  tmp

    SET    sys_user.account = tmp.ac

    WHERE  sys_user.user_id = tmp.id;

    # 使用后删除临时表

    drop table tmp;

    END $$

    delimiter ;

    # 执行存储过程

    CALL update_user_account_method;

    # 删除 已有的 存储过程

    DROP PROCEDURE  update_user_account_method;

    方法二:使用游标批量更新表数据

    delimiter //

    # 删除已有的存储过程

    DROP PROCEDURE IF EXISTS update_user_info;

    -- 定义更新数据表存储过程

    CREATE PROCEDURE update_user_info()

    BEGIN

    -- 定义存储过程变量

    DECLARE userIds BIGINT(20);

    DECLARE accounts VARCHAR(32);

    DECLARE stopCur INT DEFAULT 0;

    -- 定义游标(更新指定部分数据)

    DECLARE cur CURSOR FOR (SELECT user_id,account FROM sys_user ORDER BY user_id LIMIT 60,3);

    -- 定义游标结束,当遍历完成时,将stopCur设置为null ,也可以写成 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stopCur = null;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopCur = null;

    -- 开游标

    OPEN cur;

    -- 游标向下走一步,将查询出来的两个值赋给定义的两个变量

    FETCH cur INTO userIds,accounts;

    -- 循环体

    WHILE( stopCur IS NOT NULL) DO

    -- 更新对应关系表数据

    UPDATE driver SET email=accounts WHERE user_id = userIds ;

    -- 游标向下走一步

    FETCH cur INTO userIds,accounts;

    END WHILE;

    -- 关闭游标

    CLOSE cur;

    END //

    delimiter;

    # 执行存储过程

    CALL update_user_info;

    # 删除 已有的 存储过程

    DROP PROCEDURE update_user_info;

    展开全文
  • 好吧,一直都只知道数据库的增删改查,其他的什么事务、存储过程用的很少,今天开始项目代码编写,数据库中用户表居然一条记录都没有,既然没有记录我还怎么查询呢?想往用户表添加20条记录,难道我要一条一条的手动...

    很久很久没有写篇文章了,主要是找不到写的,还有就是懒得写,但是今天这篇文章必须写的,因为我知道今后肯定还会用到。

    好吧,一直都只知道数据库的增删改查,其他的什么事务、存储过程用的很少,今天开始项目代码编写,数据库中用户表居然一条记录都没有,既然没有记录我还怎么查询呢?想往用户表添加20条记录,难道我要一条一条的手动添加,程序员怎么可以这样?????

    好吧,写个存储过程!代码如下:

    CREATE PROCEDURE InsertUsers()

    BEGIN

    DECLARE userName VARCHAR(50);

    DECLARE userPwd VARCHAR(50);

    DECLARE userTureName VARCHAR(50);

    DECLARE userTelephone VARCHAR(50);

    DECLARE userMobilephone VARCHAR(50);

    DECLARE userQq VARCHAR(50);

    DECLARE userAddress VARCHAR(50);

    DECLARE userEmail VARCHAR(50);

    DECLARE userIsFrezee int;

    DECLARE userParentId int;

    DECLARE userRemark VARCHAR(50);

    DECLARE userSpId int;

    DECLARE i int;

    set userPwd = "123456789";

    set userTureName = "testUser";

    set userTelephone = "123456789";

    set userMobilephone = "123456789";

    set userQq = "123456798";

    set userAddress = "学府路一段24号";

    set userEmail = "asd@qq.com";

    set userIsFrezee = 0;

    set userParentId = 1;

    set userRemark = "test_user";

    set userSpId = 1;

    set i = 1;

    loop1:WHILE(i < 21)

    do

    Set userName=concat('danger',i);

    INSERT into t_user(user_name, user_pwd, user_true_name, user_telephone, user_mobilephone, user_qq_number, user_address, user_email, user_isfrezee, user_parent_id, user_remark, user_sp_id)

    VALUES(userName, userPwd, userTureName, userTelephone, userMobilephone, userQq, userAddress, userEmail, userIsFrezee, userParentId, userRemark, userSpId);

    SET i = i + 1;

    end while loop1;

    END

    存储过程写好了, CALL IsertUsers()即可;

    问题一:SET一个变量的值后,居然不能继续DECLARE另外一个变量,也就是说DECLARE语句不能写在SET语句之后?

    例如:

    CREATE PROCEDURE test()

    BEGIN

    DECLARE a VARCHAR(20);

    set a = "ddd";

    DECLARE b VARCHAR(20);

    END;

    上面的写法居然报错,改一改位置:

    CREATE PROCEDURE test()

    BEGIN

    DECLARE a VARCHAR(20);

    DECLARE b VARCHAR(20);

    set a = "ddd";

    END;

    正确!难道是我哪儿出问题了,对于这样的设计感到很无奈!

    问题二:MySQL连接两个字符居然用“+”,

    还好有

    concat

    函数,多好的,还解决了类型转换。

    展开全文
  • mysql 通过存储过程批量更新数据

    千次阅读 2017-12-09 17:09:41
    方法一:使用临时表批量更新数据 (注意操作用户需要有mysql的创建临时表权限) delimiter $$ # 删除 已有的 存储过程  DROP PROCEDURE IF EXISTS update_user_account_method;  # 创建新的存储过程  ...
  • 功能:实现将表result_good_city_dzl中的字段lat更新为表result_good_city_lh中的lat,条件是两个表中的id一样即:update result_good_city_dzl a set a.lat=(select lat from result_good_city_lh b where a.id=b....
  • 功能:实现将表result_good_city_dzl中的字段lat更新为表result_good_city_lh中的lat,条件是两个表中的id一样 即: update result_good_city_dzl a set a.lat=(select lat from result_good_city_lh b where a.id...
  • mysql 使用存储过程批量更新数据

    千次阅读 2018-06-26 19:49:00
    -- 更新表 update t_users set loan_member_role=1,  ips_loan_acct_no=row_ips_acct_no,  is_loan_bound_bank_card=1,  loan_balance=row_balance,  loan_freeze=row_freeze  where id = row_id;  ...
  • //存储过程名称 is CURSOR temp IS select aa,bb,cc from table_test;--> //temp:查询出来的数据集合,aa,bb,cc:需要查询的字段,table_test:表名 Begin-->//数据库关键字,循环开始的标识 FOR i IN temp ...
  • 采用存储过程的方式批量更新数据,Oracle中也可采用merge-update的方式更新,不过采用如下存储过程的方式会更快些DECLAREMAX_ROWSNUMBERDEFAULT5000;ROW_ID_TABLEDBMS_SQL.UROWID_TABLE;DATE_TIME_TABLEDBMS_SQL....
  • 存储过程批量更新

    2015-08-26 09:12:36
    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 复制代码 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为...
  • 若表数据比较大,直接update会时间很慢,造成锁表,内存不够等问题,可以使用存储过程分批次进行更新提交,where条件最好加上索引,当然也可以批次删除; drop procedure if exists upt_tbl_nm; delimiter // create...
  • MYSQL存储过程批量更新数据

    千次阅读 2016-12-06 19:20:10
    更新jsjh_goods_district表的district_level地区信息 DELIMITER $$ DROP PROCEDURE IF EXISTS update_district_level $$ CREATE PROCEDURE update_district_level() BEGIN DECLARE row_
  • 采用存储过程的方式批量更新数据,Oracle中也可采用merge-update的方式更新,不过采用如下存储过程的方式会更快些DECLARE MAX_ROWSNUMBERDEFAULT5000; ROW_ID_TABLEDBMS_SQL.UROWID_TABLE; DATE_TIME_TABLEDBMS_SQL....
  • 使用环境 Oracle 12c ...动态sql拼接待更新数据过滤条件 实现 自定义类型 -- create base type CREATE OR REPLACE TYPE SPLITSTRINGROW_UNI_TYPE AS OBJECT ( ID NUMBER(5), TOKEN NVARCHAR2(2...
  • 需要批量更新数据库表,但是因为涉及到的数据较多(千万条),如果直接用sql更新,估计会把pl/sql弄垮sql如下:update online_product set online_flag = '0' where status = 'ON'所以,写了一个存储过程,以备忘:...
  • 采用存储过程的方式批量更新数据,Oracle中也可采用merge-update的方式更新,采用批量提交更新方式会更快 DECLARE MAX_ROWS NUMBER DEFAULT 5000; ROW_ID_TABLE DBMS_SQL.UROWID_TABLE; DATE_TIME_TABLE DBMS_...
  • 本文主要讲述了mysql实现查询数据并根据条件更新到另一张表的方法 实现方法 CREATE DEFINER=`root`@`%` PROCEDURE `TaskTaxNumber`() BEGIN #Routine body goes here... -- 需要定义接收游标数据的变量 ...
  • 函数(FUNCTION)和存储过程(PROCEDURE),最大区别在于函数有返回值,存储过程没有返回值。批量创建数据案例:# 创库create database bigData;use bigData;# dept建表create table dept(id int unsigned primary key ...
  • mysql存储过程不支持数组参数,故需要将相关参数转成逗号分隔字符串,通过循环并对每一个循环加上事务以保证数据更新的完整性。 非动态表名 DELIMITER // CREATE PROCEDURE `proc8`(IN orderIdsStr text,IN ...
  • WHILE flag <> 1 DO -- 游标指向下一个位置,可以有多个数据,比如FETCH result INTO tname,ttype,...; FETCH result INTO tname; set @bakTableName = concat(tname, '_bkbk'); -- 备份表数据 set @dropTable ...
  • 更新表 IF row_title IS NULL AND row_base_brand IS NOT NULL THEN INSERT INTO jsjh_goods_property_value(property_id,value,title,showed) values ( 1 ,row_base_brand,row_base_brand...
  • declare begin for i in (select * from person) loop Update person Set xxx...存储过程for in loop 根据括号中的循环条件,来遍历查出的结果,update根据where条件进行更新提交,达到每一次更新都可以利用上一条的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 416
精华内容 166
关键字:

存储过程批量更新数据