我有兩個關於MySQL中複合語句和事務的問題。BEGIN ... END內部或外部的START TRANSACTION和LOOP語法
FIRST:
有兩個音符的MySQL手冊:
注
內的所有存儲的程序,解析器對待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
哪一個是正確的方法,第一個變體或第二個變體?
SECOND:
我不想創建存儲過程或函數。我只是想在一般的流程來創建其內部循環複合 - 語句塊,就像這樣:
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
只是一般流程,而無需創建和使用存儲過程或函數? 是否允許在
START TRANSACTION...COMMIT
裏面使用BEGIN...END
或者我要把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 ...
爲什麼循環只能存在於存儲過程中?似乎遲遲不得不創建一個臨時存儲過程只是做一個簡單的循環插入..... – Pacerier
@Prier:因爲這是業務邏輯屬於你的應用程序代碼,而不是數據庫層。 – eggyal
@eggyal雖然我完全同意你的看法,但是Pacerier有一個非常有效的觀點,爲什麼mysql在存儲程序和標準查詢方面表現不同 –