我无法在MySQL中运行简单的脚本。我已将脚本缩减为一行。
DELIMITER $$
DECLARE varLocalityName VARCHAR(50);
$$
DELIMITER ;
错误是:
第2行的错误1064(42000):您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第1行的“DECLARE varLocalityName VARCHAR(50)”附近使用正确的语法
$ mysql --version
mysql Ver 14.14 Distrib 5.1.63, for debian-linux-gnu (x86_64) using readline 6.2
答案 0 :(得分:1)
您的代码块未定义声明变量的范围。如果在某个程序中,它们必须介于BEGIN
和END
之间。没有它们,语句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>
答案 1 :(得分:0)
我认为问题在于您将 $$ 定义为分隔符,然后您仍尝试使用; 作为分隔符
我相信这应该有效:
DELIMITER $$
DECLARE varLocalityName VARCHAR(50)$$
DELIMITER ;
默认情况下,MySQL分隔符为; 。您可以使用 DELIMITER 调用进行更改,然后必须在新语法中使用它。
DELIMITER $$
DECLARE varLocalityName VARCHAR(50)$$
SET varLocalityName="xx"$$
SELECT varLocalityName$$
DELIMITER ;
所以基本上$$取代了每一次出现; (只要它不在String内)。如果设置DELIMITER **,则使用双星而不是;。