[转]MySQL存储过程示例

转载自: http://www.itpub.net/thread-1212446-1-1.html

mysql> CREATE TABLE TEST1(ID INT);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TEST1 VALUES(1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE TEST2(ID INT);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TEST2 VALUES(1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE TEST3(ID INT);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TEST3 VALUES(1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT table_name  FROM information_schema.tables WHERE table_name LIKE  '%TEST%';
+------------+
| table_name |
+------------+
| TEST1      | 
| TEST2      | 
| TEST3      | 
| testha     | 
+------------+
4 rows in set (0.00 sec)



mysql> DELIMITER //
mysql> CREATE PROCEDURE pro_test()
    -> BEGIN
    -> DECLARE done INTEGER DEFAULT 0;
    -> DECLARE v_tname VARCHAR(20);
    -> DECLARE v_sql VARCHAR(400);
    -> DECLARE v_Id INTEGER;
    -> DECLARE v_Total INTEGER;
    -> DECLARE result INTEGER;
    -> DECLARE v_cursor CURSOR FOR SELECT table_name  FROM information_schema.tables WHERE table_name LIKE  'TEST%';
    -> DECLARE l_cur    CURSOR FOR SELECT id FROM tmp;
    -> DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    -> SET v_total=0;
    -> DROP TABLE IF EXISTS tmp;
    -> CREATE TEMPORARY TABLE tmp 
    -> (id INT(11));
    -> OPEN v_cursor;
    -> FETCH v_cursor INTO v_tname;
    -> WHILE done<>1 DO
    -> BEGIN
    -> SET @SQL=CONCAT('insert into tmp select id from ',v_tname, ' where id>1');
    -> PREPARE st FROM @SQL;
    -> EXECUTE st;
    -> DEALLOCATE PREPARE st;
    -> OPEN l_cur;
    -> FETCH l_cur INTO v_id;
    -> WHILE done<>1 DO
    -> SET v_total=v_total+v_id;
    -> FETCH l_cur INTO v_id;
    -> END WHILE;
    -> TRUNCATE TABLE tmp;
    -> END;
    -> FETCH v_cursor INTO v_tname;
    -> END WHILE;
    -> CLOSE v_cursor;
    -> SELECT v_total;
    -> END;
    -> 
    -> 
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> call pro_test();
    -> //
+---------+
| v_total |
+---------+
|      14 | 
+---------+
1 row in set (0.02 sec)

Query OK, 0 rows affected, 1 warning (0.02 sec)

posted on 2011-08-28 14:25  DavidYanXW  阅读(148)  评论(0)    收藏  举报