2013-12-15 111 views
1
CREATE PROCEDURE `go`()  
LANGUAGE SQL  
NOT DETERMINISTIC 
CONTAINS SQL  
SQL SECURITY DEFINER  
COMMENT '' 
BEGIN DECLARE d_z CONDITION FOR SQLSTATE '35241';  
SELECT COUNT(*)as @a from _time  
IF @a>0 THEN   
SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr'; 
END IF; 
END; 

錯誤:SQL錯誤(1064):您在SQL語法中有錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在'@a附近使用正確的語法',如果@a> 0那麼信號d_z SET MESSAGE_TEXT ='errrrrrrrrrr'在第9行創建存儲過程時出錯

+0

在這之前你有'DELIMITER'聲明,所以';'不會立即被處理? – Barmar

回答

0

您的直接錯誤是由格式錯誤的SELECT聲明。你必須適當SELECT INTO語法

變化

SELECT COUNT(*)as @a from _time 

SELECT COUNT(*) INTO @a FROM _time 
       ^^^^ 

現在有你的代碼其他幾個問題:

  1. 沒有必要使用用戶(會話)變量,您可以使用本地變量而不是
  2. 不希望獲得所有行的總數,只是爲了告訴你表中是否有行。如果你這樣做,你會付出性能損失(如果你當然不使用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 
+0

但現在的錯誤是: SQL錯誤(1064):您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'd_z SET MESSAGE_TEXT ='errrrrrrrrrrrr''附近使用正確的語法; END IF; END第5行 – Arif

+0

您是否按照答案中所示更改了「DELIMITER」?您看過提供的sqlfiddle工作示例嗎? – peterm

+0

我使用HeidiSQL ...我複製此代碼並粘貼..但上面的錯誤.. – Arif

0

的問題是與選擇語句「@a」是別名不能使用的別名呃查詢。

您可以使用peterm查詢「進入」,而不是作爲

希望這有助於

編碼快樂

0

你有一些語法問題。以下工作對我來說:

DELIMITER // 
CREATE PROCEDURE `go`() 
LANGUAGE SQL 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
BEGIN 
DECLARE d_z CONDITION FOR SQLSTATE '35241'; 
select count(*) INTO @a from _time; 
IF @a>0 THEN 
SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr'; 
END IF; 
END 
// 

重要的是:

  1. 使用到@variable語法選擇一個值轉換成VAR
  2. 使用分隔符多的程序身體的終止
+0

現在的錯誤是: SQL錯誤(1064):您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'd_z SET MESSAGE_TEXT ='errrrrrrrrrrrr''附近使用正確的語法; END IF; END'在第11行 – Arif

+0

只需使用複製/粘貼來保存完整的內容,如圖所示。我用'MySQL 5.5.25'測試了它,它運行時沒有任何錯誤。 – anubhava