MySQL の複合ステートメントとトランザクションについて 2 つの質問があります。
最初:
MySQL マニュアルには 2 つの注記があります。
ノート
すべてのストアド プログラム内で、パーサーは BEGIN [WORK] を BEGIN ... END ブロックの開始として扱います。このコンテキストでトランザクションを開始するには、代わりに START TRANSACTION を使用してください。
ノート
すべてのストアド プログラム (ストアド プロシージャと関数、トリガー、およびイベント) 内で、パーサーは BEGIN [WORK] を BEGIN ... END ブロックの開始として扱います。代わりに START TRANSACTION を使用して、このコンテキストでトランザクションを開始してください。
私は正確に何を意味するのか理解できません。?START TRANSACTIONの代わりに、BEGINまたは直後に配置する必要があることを意味します。BEGIN
// 1st variant:
BEGIN
START TRANSACTION
COMMIT
END
// 2nd variant:
START TRANSACTION
COMMIT
END
1 番目のバリアントと 2 番目のバリアント、どちらが正しい方法ですか?
2番目:
ストアド プロシージャまたは関数を作成したくありません。次のように、一般的なフローで内部にループを含む複合文ブロックを作成したいだけです。
USE 'someDb';
START TRANSACTION
... create table statement
... insert statement
// now I want to implement some insert/select statements using loop, I do as follows:
DELIMITER $
BEGIN
SET @n = 1, @m = 2;
lab1: LOOP
... some insert, select statements here
END LOOP lab1;
END $
DELIMITER ;
END
COMMIT
このような構造は可能でしょうか?エラーがスローされるため:
Query: BEGIN SET @n = 1, @m = 2; lab1: LOOP SELECT ...
Error Code: 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 'SET @n = 1, @m = 2;
lab1: LOOP SELECT ...
私の質問は次のとおりです。
BEGIN...ENDストアド プロシージャや関数を作成して使用せずに、一般的なフローで使用することはできますか?BEGIN...ENDの内部で使用することは許可されていますか、START TRANSACTION...COMMITまたは内部に配置する必要がSTART TRANSACTION...COMMITありBEGIN...ENDますか?BEGIN START TRANSACTION COMMIT END // vs. START TRANSACTION BEGIN END COMMITBEGIN...ENDだけ使いたい場合は必ず使わないといけないのLOOPですか?LOOP開始せずに構文を使用できますBEGIN...ENDか? のマニュアルの唯一の例LOOPは次のとおりです。CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP ...