存储过程,怎么循环一张表的所有数据,然后判断插入到另一张表

hedansun 2010-08-11 10:10:38
怎么循环一张表的所有数据,然后判断插入到另一张表,希望给个例子,最好详细点 谢谢。。
...全文
384 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hedansun 的回复:]
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?
[/Quote]
insert 目标表(目标字段列表)
select 源表字段列表
from 源表
ACMAIN_CHM 2010-08-11
  • 打赏
  • 举报
回复
[Quote]20.2.11. 光标
20.2.11.1.声明光标

20.2.11.2. 光标OPEN语句

20.2.11.3. 光标FETCH语句

20.2.11.4. 光标CLOSE语句

简单光标在存储程序和函数内被支持。语法如同在嵌入的SQL中。光标当前是不敏感的,只读的及不滚动的。不敏感意为服务器可以活不可以复制它的结果表。

光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。

例如:

CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;

REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;

CLOSE cur1;
CLOSE cur2;
END
20.2.11.1.声明光标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

SELECT语句不能有INTO子句。

20.2.11.2. 光标OPEN语句
OPEN cursor_name
这个语句打开先前声明的光标。

20.2.11.3. 光标FETCH语句
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。

20.2.11.4. 光标CLOSE语句
CLOSE cursor_name
这个语句关闭先前打开的光标。

如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。

[/Quote]
ACMAIN_CHM 2010-08-11
  • 打赏
  • 举报
回复
[Quote]这样的话是不是2张表的字段一样?不一样呢?是不是会出错?[/Quote]
可以不一样, #6楼已经给你例子了。

至于存储过程,建议你参考一下MYSQL手册中的例子。

MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
WWWWA 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hedansun 的回复:]
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?
[/Quote]
有简单的方法不用?
INSERT INTO Tt2(f1,f2,fL3)
SELECT * FROM Tt1(f2,f3,f1)
WHERE ....
guguda2008 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hedansun 的回复:]

这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?
[/Quote]
插入时指定列名就可以
INSERT INTO TB2(COL1,COL2,COL3)
SELECT * FROM TB(COL1,COL2,COL3)
WHERE ID>100
hedansun 2010-08-11
  • 打赏
  • 举报
回复
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?
feixianxxx 2010-08-11
  • 打赏
  • 举报
回复
一定要逐条 就用存储过程+游标 ~
ACMAIN_CHM 2010-08-11
  • 打赏
  • 举报
回复
#2楼 正解。可以直接使用这种简单的方法实现。

如果你的判断条件很复杂,一定需要用程序来解决的话,则需要用存储过程打开游标然后逐一判断。

guguda2008 2010-08-11
  • 打赏
  • 举报
回复
INSERT INTO TB2
SELECT * FROM TB
WHERE ID>100
wwwwb 2010-08-11
  • 打赏
  • 举报
回复
直接INSERT INTO SELECT 。。。 FROM 。。 WHERE 不行?

56,687

社区成员

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

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