1

MySQLで簡単なスクリプトを実行できません。スクリプトを1行に減らしました。

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

エラーは次のとおりです。

2行目のエラー1064(42000):SQL構文にエラーがあります。1行目の「DECLAREvarLocalityNameVARCHAR(50)」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

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

2 に答える 2

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>

変数の宣言とスコープも参照してください。

于 2012-10-22T13:49:35.227 に答える
0

問題は、 $$を区切り文字として定義した後でも、;を使用しようとすることだと思います。区切り文字として

私はこれがうまくいくと信じています:

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

デフォルトのMySQL区切り文字は;です。DELIMITER呼び出しで変更でき、それ以降は新しい構文で使用する必要があります。

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

したがって、基本的に$$はすべての出現箇所を置き換えます。(文字列内にない限り)。DELIMITER **を設定すると、;の代わりに二重星を使用します。

于 2012-10-22T08:43:27.947 に答える