web-dev-qa-db-ja.com

MySQL varchar変数の宣言と使用

MySQL 5.0では変数を使用して簡単な操作を行おうとしていますが、うまく機能しません。 DECLARE/SETの多くの(非常に!)異なる構文を見てきましたが、なぜかわかりません...いずれにしても、おそらくそれらを混乱させたり、間違ったものを選んだり、それらを混ぜたりします。

失敗する最小限のフラグメントを次に示します。

DECLARE FOO varchar(7);
DECLARE oldFOO varchar(7);
SET FOO = '138';
SET oldFOO = CONCAT('0', FOO);

update mypermits 
   set person = FOO 
 where person = oldFOO;

また、BEGIN ... ENDでラップしてみました。そして手順として。この場合、MySQL Workbenchは、最初の行に「 ')'の近くのSQL構文エラー」、2行目に「DECLARE oldFOO varchar(7) 'の近くのSQL構文エラー」を教えてくれます。それ以外の場合は、両方の行に完全なエラーが表示され、両方に「SQL構文エラーが近い...」が表示されます。

編集:変数に@を付けて、または付けずに試したことを言及するのを忘れました。一部のリソースにはそれがあり、他のリソースにはありません。

私はどんな愚かな間違いを犯していますか?

23
Charles

これは、MySQL 5.1.35を使用するとうまく機能します。

DELIMITER $$

DROP PROCEDURE IF EXISTS `example`.`test` $$
CREATE PROCEDURE `example`.`test` ()
BEGIN

  DECLARE FOO varchar(7);
  DECLARE oldFOO varchar(7);
  SET FOO = '138';
  SET oldFOO = CONCAT('0', FOO);

  update mypermits
     set person = FOO
   where person = oldFOO;

END $$

DELIMITER ;

表:

DROP TABLE IF EXISTS `example`.`mypermits`;
CREATE TABLE  `example`.`mypermits` (
  `person` varchar(7) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO mypermits VALUES ('0138');

CALL test()
29
OMG Ponies

MySQL Workbenchを使用して同じ問題に遭遇しました。 MySQLドキュメント によれば、DECLARE "ステートメントはストアドプログラム内のローカル変数を宣言します。"それは明らかに、ストアドプロシージャ/関数でのみ動作することが保証されていることを意味します。

私にとっての解決策は、単にDECLAREステートメントを削除し、SETステートメントに変数を導入することでした。あなたのコードの意味:

-- DECLARE FOO varchar(7); 
-- DECLARE oldFOO varchar(7);

-- the @ symbol is required
SET @FOO = '138'; 
SET @oldFOO = CONCAT('0', FOO);

UPDATE mypermits SET person = FOO WHERE person = oldFOO;
6
Amos Long

Phpmyadminを使用して新しいルーチンを追加する場合は、BEGINとENDの間にコードをラップすることを忘れないでください enter image description here

0
Repky

Mysqlでは、以下のようにsetコマンドで変数を宣言して使用できます

mysql> set @foo="manjeet";
mysql> select * from table where name = @foo;
0
minhas23

変数宣言で@を忘れたようです。また、ずっと前にMySqlでSETに問題があったことを覚えています。

試して

DECLARE @FOO varchar(7);
DECLARE @oldFOO varchar(7);
SELECT @FOO = '138';
SELECT @oldFOO = CONCAT('0', @FOO);

update mypermits 
   set person = @FOO 
 where person = @oldFOO;
0
rickythefox

これを試して:

declare @foo    varchar(7),
        @oldFoo varchar(7)

set @foo = '138'
set @oldFoo = '0' + @foo
0
IWriteApps