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

时间:2021-06-05 00:50:17
怎么循环一张表的所有数据,然后判断插入到另一张表,希望给个例子,最好详细点 谢谢。。

10 个解决方案

#1


直接INSERT INTO SELECT 。。。 FROM 。。 WHERE 不行?

#2


INSERT INTO TB2
SELECT * FROM TB
WHERE ID>100

#3


#2楼 正解。可以直接使用这种简单的方法实现。

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

#4


一定要逐条 就用存储过程+游标 ~

#5


这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

#6


引用 5 楼 hedansun 的回复:
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

插入时指定列名就可以
INSERT INTO TB2(COL1,COL2,COL3)
SELECT * FROM TB(COL1,COL2,COL3)
WHERE ID>100

#7


引用 5 楼 hedansun 的回复:
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

有简单的方法不用?
INSERT INTO Tt2(f1,f2,fL3)
SELECT * FROM Tt1(f2,f3,f1)
WHERE ....

#8


引用
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?

可以不一样, #6楼已经给你例子了。

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

MySQL官方文档  http://dev.mysql.com/doc/refman/5.1/zh/index.html

#9


引用
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
这个语句关闭先前打开的光标。 

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

#10


引用 5 楼 hedansun 的回复:
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

insert 目标表(目标字段列表)
select 源表字段列表
from 源表

#1


直接INSERT INTO SELECT 。。。 FROM 。。 WHERE 不行?

#2


INSERT INTO TB2
SELECT * FROM TB
WHERE ID>100

#3


#2楼 正解。可以直接使用这种简单的方法实现。

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

#4


一定要逐条 就用存储过程+游标 ~

#5


这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

#6


引用 5 楼 hedansun 的回复:
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

插入时指定列名就可以
INSERT INTO TB2(COL1,COL2,COL3)
SELECT * FROM TB(COL1,COL2,COL3)
WHERE ID>100

#7


引用 5 楼 hedansun 的回复:
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

有简单的方法不用?
INSERT INTO Tt2(f1,f2,fL3)
SELECT * FROM Tt1(f2,f3,f1)
WHERE ....

#8


引用
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?

可以不一样, #6楼已经给你例子了。

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

MySQL官方文档  http://dev.mysql.com/doc/refman/5.1/zh/index.html

#9


引用
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
这个语句关闭先前打开的光标。 

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

#10


引用 5 楼 hedansun 的回复:
这样的话是不是2张表的字段一样?不一样呢?是不是会出错?还有存储过程加游标是怎么实现的?希望指点一下?

insert 目标表(目标字段列表)
select 源表字段列表
from 源表