Mam dwa pytania dotyczące Oświadczenie złożone i transakcje w MySQL.Uruchamianie TRANSACTION w kontekście BEGIN ... END lub poza i składnia LOOP
PIERWSZA:
Istnieją dwie notatki w podręczniku MySQL:
Note
We wszystkich zapisanych programów, traktuje parser BEGIN [WORK] Ponieważ początku BEGIN .. Blok END. Aby rozpocząć transakcję w tym kontekście , użyj zamiast tego opcji START TRANSACTION.
Uwaga
We wszystkich zapisanych programów (procedury przechowywane i funkcje, wyzwalacze, i wydarzenia), traktuje parser BEGIN [WORK] jako początek bloku BEGIN ... END. Rozpocznij transakcję w tym kontekście za pomocą START TRANSACTION.
Nie mogę zrozumieć, co dokładnie ma na myśli. To znaczy, że muszę wstawić START TRANSACTION
zamiast BEGIN
lub zaraz po BEGIN
?
// 1st variant:
BEGIN
START TRANSACTION
COMMIT
END
// 2nd variant:
START TRANSACTION
COMMIT
END
Który z nich jest właściwy, wariant 1 lub wariant 2?
DRUGI
Nie chcę stworzyć procedury przechowywanej lub funkcji. Chcę tylko, aby utworzyć blok bezkonsolowe Oświadczenie pętli wewnątrz niego w ogólnym strumieniu, tak:
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 jest możliwe takie rodzaj struktury? Bo mam błąd rzucony:
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 są następujące:
- Czy wolno używać
BEGIN...END
tylko w ogólnym strumieniu bez tworzenia i używania procedur składowanych lub funkcji? Czy można używać
BEGIN...END
wewnątrzSTART TRANSACTION...COMMIT
lub muszę umieścićSTART TRANSACTION...COMMIT
wewnątrzBEGIN...END
?BEGIN START TRANSACTION COMMIT END // vs. START TRANSACTION BEGIN END COMMIT
Do I za wszelką cenę trzeba używać
BEGIN...END
jeśli chcę użyć tylkoLOOP
? Czy mogę po prostu użyć składniLOOP
bez uruchamianiaBEGIN...END
? Jedyny przykład w instrukcji dlaLOOP
to:CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP ...
Dlaczego pętle istnieją tylko w zapisanym proc? Wydaje się być opóźnionym, aby utworzyć tymczasowy zapisany proces tylko po to, aby wykonać prostą wstawkę pętli ..... – Pacerier
@Pacerier: ponieważ jest to logika biznesowa, która należy do twojego kodu aplikacji, a nie do warstwy bazy danych. – eggyal
@eggyal, podczas gdy w pełni się z tobą zgadzam Pacerier ma bardzo ważny punkt, dlaczego mysql zachowuje się inaczej w przypadku programów przechowywanych w porównaniu ze standardowymi zapytaniami. –