下面是我写的一个用来清理所有表的测试记录的存储过程,参数是数据库名称。 你可以改造一下,把DELETE FROM改成SELECT COUNT(*),然后把查出来的写到一个临时表里,最后再SELECT出来。这样这个存储过程就实现了你要的功能了。 CREATE PROCEDURE Clear_DB( DB_NAME varchar(50) # 数据库名称 ) BEGIN DECLARE done INT DEFAULT 0; #游标的标志位 DECLARE a varchar(20); DECLARE b varchar(20); DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME ; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1; REPEAT FETCH cur1 INTO a; IF NOT done THEN set b=concat('Delete from ',DB_NAME,'.',a); # 拼删除命令 # set b=concat('TRUNCATE from ',DB_NAME,'.',a); # 拼删除命令 SET @E=b; PREPARE stmt1 FROM @E; EXECUTE stmt1; # 执行命令 DEALLOCATE PREPARE stmt1; #释放对象 END IF; UNTIL done END REPEAT; CLOSE cur1; END;
没有,在MYSQL中,只有用SP ,取得所有表名,打开游标,生成SQL语句,再动态执行
不错,顶了。不过mysql4里不能使用“SELECT table_name FROM information_schema.TABLES”,除了通过程序来完成,有变通的方法实现:获取库中所有表的记录数吗?
除了使用存储过程,mysql有类似pl/sql语句块的概念吗?
目前的MYSQL版本中没有。只能在存储过程中实现。
SELECT table_name,table_rows FROM information_schema.TABLES WHERE table_schema=DB_NAME;
你可以改造一下,把DELETE FROM改成SELECT COUNT(*),然后把查出来的写到一个临时表里,最后再SELECT出来。这样这个存储过程就实现了你要的功能了。
CREATE PROCEDURE Clear_DB(
DB_NAME varchar(50) # 数据库名称
)
BEGIN
DECLARE done INT DEFAULT 0; #游标的标志位
DECLARE a varchar(20);
DECLARE b varchar(20);
DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME ;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
IF NOT done THEN
set b=concat('Delete from ',DB_NAME,'.',a); # 拼删除命令
# set b=concat('TRUNCATE from ',DB_NAME,'.',a); # 拼删除命令
SET @E=b;
PREPARE stmt1 FROM @E;
EXECUTE stmt1; # 执行命令
DEALLOCATE PREPARE stmt1; #释放对象
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END;
没有,在MYSQL中,只有用SP ,取得所有表名,打开游标,生成SQL语句,再动态执行