START TRANSAKCJA wewnątrz kontekstu BEGIN… END lub składni zewnętrznej i LOOP
Mam dwa pytania dotyczące oświadczenia złożonego i transakcji w MySQL.
PIERWSZY:
Istnieją dwie uwagi w podręczniku MySQL:
Uwaga
We wszystkich zapisanych programach parser traktuje BEGIN [WORK] jako początek bloku BEGIN ... END. Aby rozpocząć transakcję w tym kontekście, użyj zamiast tego START TRANSACTION.
Uwaga
We wszystkich przechowywanych programach (procedury składowane i funkcje, wyzwalacze i zdarzenia) parser traktuje BEGIN [WORK] jako początek bloku BEGIN ... END. Rozpocznij transakcję w tym kontekście zamiast START TRANSACTION.
Nie mogę zrozumieć, co dokładnie oznacza. To znaczy, że muszę to zrobićSTART TRANSACTION
zamiastBEGIN
lub zaraz poBEGIN
?
// 1st variant:
BEGIN
START TRANSACTION
COMMIT
END
// 2nd variant:
START TRANSACTION
COMMIT
END
Który jest właściwy, pierwszy wariant lub drugi wariant?
DRUGA:
Nie chcę tworzyć zapisanej procedury lub funkcji. Chcę po prostu utworzyć blok instrukcji złożonej z pętlą wewnątrz ogólnego przepływu, tak jak poniżej:
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
Czy to możliwe, że taka struktura? Ponieważ wystąpił błąd:
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 ...
Moje pytania to:
Czy wolno jej używaćBEGIN...END
tylko w ogólnym przepływie bez tworzenia i używania procedur przechowywanych lub funkcji?Czy wolno jej używaćBEGIN...END
wnętrzeSTART TRANSACTION...COMMIT
lub muszę to zrobićSTART TRANSACTION...COMMIT
wnętrzeBEGIN...END
?
BEGIN
START TRANSACTION
COMMIT
END
// vs.
START TRANSACTION
BEGIN
END
COMMIT
Czy muszę za wszelką cenę korzystaćBEGIN...END
jeśli chcę używać tylkoLOOP
? Mogę po prostu użyćLOOP
składnia bez uruchamianiaBEGIN...END
? Jedyny przykład w podręczniku dlaLOOP
czy to jest:
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
...