使用mysql存储过程-统计某个数据库下的所有表的记录数
其中用到了游标(cursor),循环(loop),动态SQL预处理(prepare)等技术,特此记录一下。
[sql] view plain copy
1. CREATE  PROCEDURE statis_rows(in v_schema varchar(50)) 
2. BEGIN 
3.  
4.  
5. DECLARE sql_str VARCHAR (200); 
6. declare no_more_departments integer DEFAULT 0; 
7.  
8.  
9. DECLARE sql_cur CURSOR FOR ( 
10.     SELECT 
11.         CONCAT( 
12.             'select ',"'",table_schema,"'",",'",table_name,"',",'count(1)',' into @v_tab_schema,@v_tab_name,@v_count  from '
13.             TABLE_SCHEMA, 
14.             '.'
15.             TABLE_NAME, 
16.             '' 
17.         ) 
18.     FROM 
19.         information_schema.TABLES 
20.     WHERE table_schema = v_schema 
21.   and table_name <> 'table_rows' 
22. ); 
23. DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1; 
24.  
25.  
26. /* 打开游标,进入循环统计各表的记录 */ 
27. OPEN sql_cur; 
28. myLoop:LOOP 
29. fetch sql_cur into sql_str; 
30.  
31.  
32. if no_more_departments = 1 THEN 
33. leave myLoop; 
34. end if; 
35.  
36.  
37. set @v_sql=sql_str; 
38. prepare stmt from @v_sql; 
39.  
40.  
41.  
42.  
43. EXECUTE stmt; 
44.  
45.  
46. /* 将统计结果保存到表中,以便随时都可以查看 */ 
47. INSERT INTO table_rows 
mysql存储过程使用48. VALUES 
49.     ( 
50.         @v_tab_schema, 
51.         @v_tab_name, 
52.         @v_count, 
53.         sysdate() 
54.     ); 
55.  
56.  
57. DEALLOCATE prepare stmt; 
58. end loop myLoop; 
59.  
60.  
61. close sql_cur; 
62. END 

最后测试一下
call statis_rows('mysql');
call statis_rows('scott');
select * from table_rows;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。