mysql存储过程批量插入数据

lshfong 2010-12-16 03:55:00
存储过程接收两个参数,第一个参数为ID字符,第二个参数为一个若干个编号组成的长字符,中间用逗号分开,接收到参数后,第二个参数拆分成单独的编号插入到数据库中,求存储过程的写法,谢谢。
...全文
749 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lshfong 2010-12-16
  • 打赏
  • 举报
回复
老大,你太厉害了,感谢ACMAIN_CHM,也感谢WWWWA的热心帮助
ACMAIN_CHM 2010-12-16
  • 打赏
  • 举报
回复
mysql> DELIMITER $$
mysql> create procedure rr(a VARCHAR(10),b VARCHAR(500))
-> begin
-> declare i,j,k,l int;
-> declare x varchar(500);
-> declare s varchar(501);
-> declare c char;
->
-> set s=concat(b,',');
-> set l=length(s);
-> set i=1;
-> set x='';
->
-> while i<=l do
-> set c=mid(s,i,1);
-> if c=',' then
-> if trim(x)!='' then
-> insert into mobile(needCallNumber,caller) values (a,x);
-> end if;
-> set x='';
-> else
-> set x=concat(x,c);
-> end if;
-> set i=i+1;
-> END WHILE;
-> end$$
Query OK, 0 rows affected (0.19 sec)

mysql> DELIMITER ;
mysql> call rr("008","a,b,c,d");
Query OK, 1 row affected (0.07 sec)

mysql>
mysql> select * from mobile;
+----------+----------------+--------+-----------+
| MobileID | needCallNumber | caller | callstate |
+----------+----------------+--------+-----------+
| 1 | 008 | a | 0 |
| 2 | 008 | b | 0 |
| 3 | 008 | c | 0 |
| 4 | 008 | d | 0 |
+----------+----------------+--------+-----------+
4 rows in set (0.00 sec)

mysql>
WWWWA 2010-12-16
  • 打赏
  • 举报
回复
建立临时表lsb2,字段ID,1-10000
CALL aa("008","a,b,c,d");
DELIMITER $$

USE `qq`$$

DROP PROCEDURE IF EXISTS `aa`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `aa`(A1 VARCHAR(10),A2 VARCHAR(50))
BEGIN
SET A2=CONCAT(',',A2,',');
INSERT INTO `mobile`(needCallNumber,caller)
SELECT a1,SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1) AS newco
FROM
(SELECT A2 AS aa) A LEFT JOIN ZZ.lsb2 b ON LENGTH(aa)>=b.id AND
SUBSTR(AA,ID,1)=',' AND SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1)<>'';
END$$

DELIMITER ;
lshfong 2010-12-16
  • 打赏
  • 举报
回复
数据库:5.0
表信息:
mobile CREATE TABLE `mobile` (
`MobileID` int(11) NOT NULL auto_increment,
`needCallNumber` char(255) collate utf8_unicode_ci default NULL,
`caller` char(255) collate utf8_unicode_ci default NULL,
`callstate` int(4) default '0',
PRIMARY KEY (`MobileID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

希望实现的存储过程:
DELIMITER $$

DROP PROCEDURE IF EXISTS `utf-8`.`rr`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `rr`(a VARCHAR(10),b VARCHAR(500)))
BEGIN
怎么样把参数b分割后插入到数据库中
END$$

DELIMITER ;
======================================
调用
call rr("008","a,b,c,d");
插入后的数据就是:
needCallNumber caller
008 a
008 b
008 c
008 d
ACMAIN_CHM 2010-12-16
  • 打赏
  • 举报
回复
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

WWWWA 2010-12-16
  • 打赏
  • 举报
回复
上述代码是拆分字符串的,插入的
insert into tt(f1)
SELECT SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1) AS newco
FROM
(SELECT A2 AS aa) A LEFT JOIN ZZ.lsb2 b ON LENGTH(aa)>=b.id AND
SUBSTR(AA,ID,1)=',' AND SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1)<>'';
lshfong 2010-12-16
  • 打赏
  • 举报
回复
WWWWA,你好,没看见有插入数据的代码啊
WWWWA 2010-12-16
  • 打赏
  • 举报
回复
示例,自行修改
DELIMITER $$

USE `qq`$$

DROP PROCEDURE IF EXISTS `AA`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `aa`(A1 VARCHAR(10),A2 VARCHAR(50))
BEGIN
SET A2=CONCAT(',',A2,',');
SELECT SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1) AS newco
FROM
(SELECT A2 AS aa) A LEFT JOIN ZZ.lsb2 b ON LENGTH(aa)>=b.id AND
SUBSTR(AA,ID,1)=',' AND SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1)<>'';
END$$

DELIMITER ;
rucypli 2010-12-16
  • 打赏
  • 举报
回复
CREATE PROCEDURE sp_test1(b varchar(300))
begin

set @sql = b;

set @sql=concat('insert into test1 select ',replace(b,',',' union all select '));

prepare stmt from @sql;

execute stmt;

end;
lshfong 2010-12-16
  • 打赏
  • 举报
回复
call aa("test","aaa,bbb,ccc,ddd,eeee")
我想在存储过程中,把aaa,bbb,ccc,ddd,eeee拆分后再插入到数据库中
WWWWA 2010-12-16
  • 打赏
  • 举报
回复
将@B修改为你的字段名 OR 传入参数即可
insert into tt(f1)
SELECT SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1) AS newco
FROM
(SELECT CAST(@b AS CHAR) AS aa ) a LEFT JOIN lsb2 b ON LENGTH(aa)>=b.id AND
SUBSTR(AA,ID,1)=',' AND SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1)<>''
WWWWA 2010-12-16
  • 打赏
  • 举报
回复
示例:
建立临时表lsb2,字段ID,1-10000
SET @b=CONCAT(',','-1,-abc,-1,-1,-1,435-1,-1,-1,-1,-1',',');
SELECT SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1) AS newco
FROM
(SELECT CAST(@b AS CHAR) AS aa ) a LEFT JOIN lsb2 b ON LENGTH(aa)>=b.id AND
SUBSTR(AA,ID,1)=',' AND SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1)<>''

将@B修改为你的字段名即可

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧