3

次の簡単な表があります。

mysql> select * from version;
+----+---------+
| id | version |
+----+---------+
|  1 | 1       |
+----+---------+
1 row in set (0.00 sec)

このテーブルの値(正確には、このテーブルの唯一の行)に応じて何か(または何もしない)を実行するストアドプロシージャを作成する必要があります。

DELIMITER $$
DROP PROCEDURE IF EXISTS upgrade_version $$
CREATE PROCEDURE upgrade_version(current_version INTEGER, script TEXT)
BEGIN
  DECLARE version INT(11);
  SET version = (SELECT `version` FROM `version` WHERE `id` = 1 LIMIT 1);
  SELECT version;
  IF version = current_version + 1 THEN
    PREPARE upgrade_stmt FROM script;
    EXECUTE upgrade_stmt;
    UPDATE `version` SET `version` = `version` + 1 WHERE `id` = 1;
  ENDIF;
END $$
DELIMITER ;

内で呼び出される:

CALL upgrade_version(1,'ALTER TABLE ...');

構文的に正しくありません。mysqlは次を返します。

1064 - 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 'script;
    EXECUTE upgrade_stmt;
    UPDATE `version` SET `version` = `version`' at line 7 

なにが問題ですか?

4

3 に答える 3

5

その「SELECTバージョン」を選択している理由がわかりません。データを選択してvarialbeに取得する必要がある場合は、ターミナルで直接使用すると、そのステートメントは正常に機能します。そして、スクリプトにprepared_stmtが含まれていることを確認します。可能な修正は:

  1. 変数名のバージョンをversion_vに変更します
  2. これの代わりに:

    SETバージョン=(SELECT versionFROM versionWHERE id= 1 LIMIT 1);
    SELECTバージョン;

これを試して:

SELECT `version` INTO Version_v FROM `version` WHERE `id` = 1 LIMIT 1);
于 2012-12-18T11:41:06.240 に答える
4

これを試して:

DELIMITER $$
DROP PROCEDURE IF EXISTS upgrade_version $$
CREATE PROCEDURE upgrade_version(current_version INT, script TEXT)
BEGIN
  SELECT `version` into @ver FROM `version` WHERE `id` = 1 LIMIT 1;  
  SET @s = script;
  IF @ver = current_version + 1 THEN
    PREPARE upgrade_stmt FROM @s;
    EXECUTE upgrade_stmt;
    DEALLOCATE PREPARE upgrade_stmt;
    UPDATE `version` SET `version` = `version` + 1 WHERE `id` = 1;
  END IF;
END $$
DELIMITER ;
于 2012-12-18T11:55:30.937 に答える
0

変数を宣言する値を設定する

       DELIMITER $$
       create procedure Testing()
           begin
            declare Regione int;   
            set Regione=(select  id from users
            where id=1) ;
            select Regione ;
           end $$
         DELIMITER;
于 2019-05-30T09:40:58.227 に答える