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 COMMIT
BEGIN...END
だけ使いたい場合は必ず使わないといけないのLOOP
ですか?LOOP
開始せずに構文を使用できますBEGIN...END
か? のマニュアルの唯一の例LOOP
は次のとおりです。CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP ...