НАЧАТЬ СДЕЛКУ внутри контекста BEGIN… END или вне его и синтаксиса LOOP
У меня есть два вопроса о Compound-Statement и транзакциях в MySQL.
ПЕРВЫЙ:
В руководстве MySQL есть два примечания:
Note
Within all stored programs, the parser treats BEGIN [WORK] as the beginning of a BEGIN ... END block. To begin a transaction in this context, use START TRANSACTION instead.
Note
Within all stored programs (stored procedures and functions, triggers, and events), the parser treats BEGIN [WORK] as the beginning of a BEGIN ... END block. Begin a transaction in this context with START TRANSACTION instead.
Я не могу понять, что именно имеется в виду. Они имеют в виду, что я должен поставитьSTART TRANSACTION
вместоBEGIN
или сразу послеBEGIN
?
// 1st variant:
BEGIN
START TRANSACTION
COMMIT
END
// 2nd variant:
START TRANSACTION
COMMIT
END
Какой правильный путь, 1-й вариант или 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 ...
Мои вопросы:
Is it allowed to useBEGIN...END
just in general flow without creating and using Stored Procedures or Functions?
Is it allowed to use BEGIN...END
inside of START TRANSACTION...COMMIT
or I have to put START TRANSACTION...COMMIT
inside of BEGIN...END
?
BEGIN
START TRANSACTION
COMMIT
END
// vs.
START TRANSACTION
BEGIN
END
COMMIT
Do I by all means have to use BEGIN...END
if I want to use only LOOP
? May I just use LOOP
syntax without starting BEGIN...END
? The only example in the manual for LOOP
is this:
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
...