您的直接錯誤是由格式錯誤的SELECT
聲明。你必須適當SELECT INTO
語法
變化
SELECT COUNT(*)as @a from _time
到
SELECT COUNT(*) INTO @a FROM _time
^^^^
現在有你的代碼其他幾個問題:
- 沒有必要使用用戶(會話)變量,您可以使用本地變量而不是
- 你不希望獲得所有行的總數,只是爲了告訴你表中是否有行。如果你這樣做,你會付出性能損失(如果你當然不使用MyISAM)。您可以利用
NOT EXISTS()
或LIMIT 1
條款。
話雖這麼說,你的程序的簡化版本,可能看起來像
DELIMITER $$
CREATE PROCEDURE `go`()
BEGIN
DECLARE d_z CONDITION FOR SQLSTATE '35241';
IF NOT EXISTS(SELECT * FROM _time) THEN
SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr';
END IF;
END$$
DELIMITER ;
這裏是SQLFiddle演示
讓我們給它一個嘗試
mysql> CREATE TABLE _time (`id` int);
Query OK, 0 rows affected (0.03 sec)
mysql> DELIMITER $$
mysql> CREATE PROCEDURE `go`()
-> BEGIN
-> DECLARE d_z CONDITION FOR SQLSTATE '35241';
-> IF NOT EXISTS(SELECT * FROM _time) THEN
-> SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr';
-> END IF;
-> END$$
Query OK, 0 rows affected (0.02 sec)
mysql> DELIMITER ;
mysql> CALL go();
ERROR 1644 (35241): errrrrrrrrrrrr
在這之前你有'DELIMITER'聲明,所以';'不會立即被處理? – Barmar