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構文エラーが近い...」が表示されます。
編集:変数に@を付けて、または付けずに試したことを言及するのを忘れました。一部のリソースにはそれがあり、他のリソースにはありません。
私はどんな愚かな間違いを犯していますか?
これは、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()
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;
Mysqlでは、以下のようにsetコマンドで変数を宣言して使用できます
mysql> set @foo="manjeet";
mysql> select * from table where name = @foo;
変数宣言で@を忘れたようです。また、ずっと前に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;
これを試して:
declare @foo varchar(7),
@oldFoo varchar(7)
set @foo = '138'
set @oldFoo = '0' + @foo