2012-10-22 179 views
1

我無法在MySQL中運行簡單的腳本。我已經將腳本簡化爲一行。MySQL語法錯誤

DELIMITER $$ 
DECLARE varLocalityName VARCHAR(50); 
$$ 
DELIMITER ; 

的錯誤是:

第2行

ERROR 1064(42000):你在你的SQL語法錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「聲明varLocalityName VARCHAR(50)」在1號線

$ mysql --version 
mysql Ver 14.14 Distrib 5.1.63, for debian-linux-gnu (x86_64) using readline 6.2 
+0

你想做什麼? '存儲過程'?功能?或者是什麼? –

+0

這只是我試圖執行的一段陳述。它是我寫的存儲過程的一部分。 – Sameer

+0

你可以在存儲過程中添加腳本嗎? –

回答

1

您的代碼塊沒有爲聲明的變量定義範圍。如果在程序中,它們必須介於BEGINEND之間。沒有他們,陳述DECLARE varLocalityName VARCHAR(50);成爲無效的聲明將被執行。該語句等效於如下所示的語句:

mysql> select current_date(); 
+----------------+ 
| current_date() | 
+----------------+ 
| 2012-10-22  | 
+----------------+ 
1 row in set (0.00 sec) 

mysql> declare varLocalityName varchar(50); 
ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near 'declare varLocalityName varchar(50)' at line 1 
mysql> 

要麼你應該聲明會話變量沒有關鍵字DECLARE或遵循存儲過程使用範圍變量定義的語法。

例1:使用會話變量:

mysql> set @x = null; 
Query OK, 0 rows affected (0.00 sec) 
mysql> select @x; 
+------+ 
| @x | 
+------+ 
| NULL | 
+------+ 
1 row in set (0.00 sec) 

mysql> delimiter $$ 
mysql> select current_date() into @x; 
    -> $$ 
Query OK, 1 row affected (0.02 sec) 

mysql> select @x; 
    -> $$ 
+------------+ 
| @x   | 
+------------+ 
| 2012-10-22 | 
+------------+ 
1 row in set (0.00 sec) 

注意,您可以在過程內設置/定義會話變量而不是DECLARE

實施例2:使用程序作用域變量:

mysql> 
mysql> delimiter $$ 
mysql> create procedure some_x() 
    -> begin 
    ->  declare varLocalityName varchar(50); 
    -> 
    ->  set @sessionDate = null; 
    ->  select @sessionDate; 
    ->  set @sessionDate = current_date(); 
    ->  select @sessionDate; 
    -> 
    ->  select varLocalityName; 
    -> end; 
    -> $$ 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
mysql> 
mysql> call some_x(); 
+--------------+ 
| @sessionDate | 
+--------------+ 
| NULL   | 
+--------------+ 
1 row in set (0.00 sec) 

+--------------+ 
| @sessionDate | 
+--------------+ 
| 2012-10-22 | 
+--------------+ 
1 row in set (0.00 sec) 

+-----------------+ 
| varLocalityName | 
+-----------------+ 
| NULL   | 
+-----------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> select @sessionDate; 
+--------------+ 
| @sessionDate | 
+--------------+ 
| 2012-10-22 | 
+--------------+ 
1 row in set (0.00 sec) 

mysql> select varLocalityName; 
ERROR 1054 (42S22): Unknown column 'varLocalityName' in 'field list' 
mysql> 

也可參考Variables declaration and scope

+0

感謝您的解釋。我能夠在mysql shell中使用會話範圍變量來運行代碼塊。但是,相同的代碼在Mysql查詢瀏覽器中不起作用。它失敗,錯誤1064.任何想法呢? – Sameer

+0

一些代碼意味着什麼?準確發佈您在QB中執行的內容。 –

+0

DELIMITER $$ set @x = null; 將current_date()選擇爲@x; select @x; $$ DELIMITER; – Sameer

0

我認爲這個問題是您定義$$爲分隔符,然後你仍然嘗試使用;作爲分隔符

我認爲這應該工作:

DELIMITER $$ 
DECLARE varLocalityName VARCHAR(50)$$ 
DELIMITER ; 

由於MySQL默認的分隔符是;。您可以使用DELIMITER調用對其進行更改,並且您必須從新的語法中使用它。

DELIMITER $$ 
DECLARE varLocalityName VARCHAR(50)$$ 
SET varLocalityName="xx"$$ 
SELECT varLocalityName$$ 
DELIMITER ; 

所以基本上$$代替了每一次出現的; (只要它不在字符串內)。如果您設置了DELIMITER **,則可以使用雙星而不是;。

+0

這工作。但是,如果我在塊中添加更多的語句,我開始出現錯誤。例如DELIMITER $$ DECLARE varLocalityName VARCHAR(50); SET varLocalityName =「xx」; SELECT varLocalityName; $$ DELIMITER; – Sameer

+0

我得到了與你的代碼相同的錯誤 – Sameer

+0

@Sameer仍然是錯誤1064? – user1581900