2017-04-27 3 views
0

私は、私のチームが変数と基本スクリプトを使ってルーチンのDBをいくつか変更できるプロセスを設定しようとしています。私は多くの操作の最初の段階にあり、実行することさえできません。考え方は、スクリプトの先頭に変数を割り当て、testまたはprodモードでスクリプトを実行するかどうかを指定することです。MySQLのトランザクションと変数に関する問題

testは変更を模倣し、何が起こったのかを表示し、トランザクションをロールバックする必要があります。prodは実際にトランザクションをコミットし、更新された行を表示します。

私はこれらの行を個別に実行すると機能しますが、構文エラーが表示され続けます。私はこれをデバッグするのが大好きですが、誰かがこの問題に対するより良い解決策を持っているならば、私はそれを聞いて広く読んでいます。

ここで始まりのコードはありがとうございます!

#ADD A NEW QUESTION CATEGORY 
SET @new_category_name = 'NEW CATEGORY NAME HERE'; 
SET @prod_or_test = 'PROD'; 

START TRANSACTION; 
#SET IT'S SORT_ORDER TO BE AT THE END OF THE LIST 
SET @last_sort_order = ((SELECT MAX(`sort_order`) FROM question_categories)+1); 

#INSERT THE NEW ROW 
INSERT INTO question_categories (name, sort_order) VALUES (@new_category_name, @last_sort_order); 
IF (@prod_or_test = 'PROD') THEN 
    COMMIT; 
    SELECT * FROM question_categories WHERE name = @new_category_name; 
ELSE 
    ROLLBACK; 
END IF; 

エラーメッセージを含むように更新:

[ERROR in query 6] 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 'IF (@prod_or_test = 'PROD') THEN 
    COMMIT' at line 1 
[ERROR in query 8] 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 'ELSE 
    ROLLBACK' at line 1 
[ERROR in query 9] 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 'END IF' at line 1 
+0

エラーメッセージを投稿してくださいすることができますおかげで – maSTAShuFu

+0

良いコールああ、私はポストを更新しましたが - –

答えて

1

IFTHENELSEEND IFは、MySQL 格納されたプログラムの文脈の外で、有効なSQLステートメントではありません。たとえば、PROCEDUREまたはTRIGGERの定義です。

参考:https://dev.mysql.com/doc/refman/5.7/en/if.html

IFステートメントが格納されたプログラムで使用することができますが、それは、スタンドアロンのSQLステートメントとして使用することはできません。

また、IF文は、このような有効なSQLステートメントですSELECTまたはUPDATE、などのステートメントのコンテキストで使用することができIF()機能と混同すべきではありません。

SELECT t.foo, IF(t.foo='bar',41,NULL) AS bar, ... 

いくつかのステートメントは、例えばその構文の一部としてIFキーワードが含まれる:この例では、IFキーワードがDROP文の一部であることを

DROP TABLE IF EXISTS foo; 

注意を。それは別の声明ではありません。


フォロー

最終目標は、ひとつのスクリプトを持っていることでした...しかし...このスクリプトを介して呼び出すことができるストアドプロシージャを実際に作成しようとしているように見えます。 (上記)

オリジナルの答えは、MySQLのストアドプログラムの外IF文の用法に取り組むた。あなたはIFステートメントを使用する必要がある場合は、それがPROCEDUREで行うことができる。

。。しかし、 IF文は厳密にあなたが動的に作成されたSQLを実行するために PREPAREEXECUTEDEALLOCATE PREPAREステートメントを使用して、ほぼ同じことを達成する可能性が必要とされていない

参考:https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

たとえば、SELECTステートメントのIF()関数でユーザー定義変数の条件付きテストを実行し、実行するSQLテキストを条件付きで返すことができます。この場合、COMMITまたはROLLBACKのいずれかのステートメント。私はこのような何かが仕事だと思う

-- add a new question category 
SET @new_category_name := 'NEW CATEGORY NAME HERE'; 
SET @prod_or_test := 'PROD'; 

START TRANSACTION; 

-- set it's sort_order to be at the end of the list 
SELECT IFNULL(MAX(`sort_order`)+1,1) 
    FROM question_categories 
    INTO @last_sort_order 
; 

-- insert the new row 
INSERT INTO question_categories (name, sort_order) 
VALUES (@new_category_name, @last_sort_order) 
; 

-- conditionally execute a COMMIT or ROLLBACK 
SELECT IF(@prod_or_test='PROD','COMMIT','ROLLBACK') INTO @sql; 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SELECT * 
    FROM question_categories 
    WHERE @prod_or_test = 'PROD' 
    AND name = @new_category_name ; 
+0

それは本当です。彼は手続きをしているものの外見で – maSTAShuFu

+0

@maSTAShuFu:MySQLのストアドプログラムのようには見えません。 OPは "スクリプトの先頭に変数を割り当てる"と言って、ユーザー定義変数に値を割り当てるSETステートメントを示します。実行フローを制御するために変数を "test"または "prod"に設定することが予想される場合、ストアドプロシージャの本体にこれらのSETステートメントは期待されません。これがプロシージャであれば、これらの値をパラメータとして指定できます。私はサンプルコードをMySQLのストアドプログラムではなく "スクリプト"について質問することにしました。 – spencer7593

+0

彼はちょうど開始のための論理を構築していると思う – maSTAShuFu

0

問題がカッコ

IF (@prod_or_test = 'PROD') THEN 

IF @prod_or_test = 'PROD' THEN 

に構文

であります
IF search_condition THEN statement_list 
    [ELSEIF search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END IF 

https://dev.mysql.com/doc/refman/5.7/en/if.html

+1

'search_condition'は、任意の論理式です@maSTAShuFuありがとう。それらは優先順位を確立するために使用され、ここでは必要ではありませんが、必要でないときに使用するとかなり有効です。 IF(1> 2)THEN ... 'などと同じです。これは問題ではありません。 –

+0

さて、あなたの解決策は何ですか? – maSTAShuFu

+0

条件の周りの括弧は問題ではありません。括弧は必須ではありませんが、許可されています。この場合、条件の周りの括弧の追加/削除は実際に何も変更しません。 – spencer7593

関連する問題