2013-02-19 124 views
0

这里是存储过程。我想要做的是循环遍历所有数据库并查找特定表中的行数。如果count为0,则打印表格。Mysql存储过程。这个问题有什么问题?

DELIMITER $$ 
    CREATE PROCEDURE checkTableData() 
    BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE db VARCHAR(255); 
    DECLARE appDBs CURSOR FOR SELECT schema_name FROM information_schema.schemata WHERE  schema_name LIKE 'db_%'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    DECLARE intCount INT default; 

    OPEN appDBs; 
    REPEAT 
     FETCH appDBs INTO db; 
      IF NOT done THEN 
       SET @SQL = CONCAT('SELECT @intCount = COUNT(1) FROM ', db, '.SMS_CODES'); 
       EXECUTE @SQL; 
       IF @intCount = 0 THEN 
       SELECT db; 
       END IF;  
     END IF;  
    UNTIL done END REPEAT; 

    CLOSE appDBs; 
    END $$ 
    delimiter ; 

的错误是在该行

IF NOT done THEN 

编辑: 试过IF done != 0 THEN。错误消息:

You have an error in your SQL; Check the manual that corresponds to your MySQL server version for the right syntax to use near ; 

    OPEN appDBs; 
    REPEAT 
     FETCH appDBs INTO db; 
       `IF don' at line 7 

编辑: 每@Gerve我更新了proc和移动intCount声明顶部,上面的指针,然后将其设置为0这样的错误已经一去不复返了。现在,另一个错误是:

You have an error in your SQL; Check the manual that corresponds to your MySQL server version  for the right syntax to use near '@SQL 
@SQL = CONCAT('SELECT @intCount = COUNT(1) FROM ', db, '.ECR_SMS_COUNTRY_CODES'); 
      EXECUTE @SQL; 
    END IF;   
UNTIL done END REPEAT; 
    CLOSE appDBs; 
    EN' at line 15 
+0

有什么错误味精? – Drahcir 2013-02-19 19:04:53

+0

'done'是一个int,你尝试完成= 0吗? – Sebas 2013-02-19 19:06:25

+0

试过了。更新了帖子。谢谢! – 2013-02-19 19:10:38

回答

1

第一个错误

DECLARE intCount INT default; 

无缺省值,只是将其更改为:

DECLARE intCount INT default 0; 
  • MySQL的说,错误是接近,这意味着就在之前。

第二个错误是因为你不能执行字符串造成第二个错误,你需要首先准备语句:PrepareExecute

PREPARE stmt1 FROM @SQL; 
EXECUTE stmt1; 
+0

是的,你是对的。那个错误消失了。但是还有一个错误。 '在正确的语法附近使用@SQL' – 2013-02-19 19:19:24

+0

@KevinRave再次更新 – Drahcir 2013-02-19 19:39:09

+0

语句'intCount = count(*)FROM'是否正确?它似乎没有任何回报。 – 2013-02-19 19:44:39