2017-03-16 4 views
0

私はPROCEDURE経由で存在するテーブルを更新しようとしています。しかし、私はエラーが発生します:MySQL:#1064 - あなたはあなたのSQL構文に誤りがあります。ライン1PROCEDUREのCONCAT()でのUPDATEの使用方法MySQL

私の手順で、近く '=のiOS、phone_manufacture =アップル、phone_model = iPhone、os_vers = iOSのXX' を使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください。

BEGIN 
DECLARE a, b INT; 
DECLARE a1, a2, a3, a4 TEXT; 
DECLARE cur1 CURSOR FOR SELECT id FROM z7_group; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; 
OPEN cur1; 
SET b = 0; 
SET a1 = "iOS"; 
SET a2 = "Apple"; 
SET a3 = "iPhone"; 
SET a4 = "iOS X.X"; 
WHILE b = 0 DO 
FETCH cur1 INTO a; 
IF b = 0 THEN 
SET @data_ all_group = (SELECT `myTables` FROM `all_group` WHERE id= a); 
SET @s = CONCAT('UPDATE ', @data_ all_group, 'SET `os` = ',a1,', `phone_manufacture` = ',a2,', `phone_model` = ',a3', `os_vers` = ',a4,'); 
PREPARE stmt3 FROM @s; 
EXECUTE stmt3; 
END IF; 
END WHILE; 
CLOSE cur1; 
END; 
+0

あなたがすることができます:クエリのビルドを修正しますyで使用されている場合は区切り記号として ';'を使用しませんストアドプロシージャ私はこれまでのところそれを解析して驚いています。 – tadman

+1

もう1つ注目すべきことは、そこにエスケープすることなく任意のデータにジャムすることだけです。それはうまくいかないでしょう。 [プレースホルダ値](https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html)を使用してください: 'SET os = ?, phone_manufacture =?、...'変数をバインドするために 'EXECUTE ... USING'を実行します。ここでは 'CONCAT'は完全に不要です。 – tadman

+0

@tadmanしかし、代わりにALTER TABLEを使用すると、すべて正常に更新されます。 – Roman

答えて

0
inicializationで単一引用符で

  1. 囲み値を が(もっとありますが、私はそれはあなたが欲しいものだと思う):

    次の2つのオプションがあり

    SET a1 = "'iOS'"; 
    SET a2 = "'Apple'"; 
    SET a3 = "'iPhone'"; 
    SET a4 = "'iOS X.X'"; 
    

    と文を修正:

    UPDATE your_table SET `os` = 'iOS', `phone_manufacture` = 'Apple', `phone_model` = 'iPhone', `os_vers` = 'iOS X.X' 
    
  2. OR:

    CONCAT('UPDATE ', @data_all_group, ' SET `os` = ',a1,', `phone_manufacture` = ',a2,', `phone_model` = ',a3,', `os_vers` = ',a4) 
    

    は、結果は次のようになります。通常

    SET @s = CONCAT('UPDATE ', @data_all_group 
        , "SET `os` = '" , a1 ,"'," 
        , "`phone_manufacture` = '",a2,"'," 
        , "`phone_model` = '",a3,"'," 
        , "`os_vers` = '",a4,"'"); 
    
関連する問題