0

これがストアドプロシージャです。私がやろうとしているのは、すべてのデータベースをループして、特定のテーブルの行数を見つけることです。count が 0 の場合、テーブルを出力します。

  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
4

1 に答える 1

1

最初のエラー

DECLARE intCount INT default;

デフォルト値はありません。次のように変更してください。

DECLARE intCount INT default 0;
  • MySQL はエラーが近いと言っています。これは直前を意味します。

2 番目のエラー

2 番目のエラーは、文字列を実行できないために発生します。最初にステートメントを準備する必要があります: PrepareExecute

PREPARE stmt1 FROM @SQL;
EXECUTE stmt1; 
于 2013-02-19T19:14:04.710 に答える