我有两个关于 MySQL 中的复合语句和事务的问题。
第一的:
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
哪一个是正确的方法,第一个变体或第二个变体?
第二:
我不想创建存储过程或函数。我只想在一般流程中创建一个带有循环的复合语句块,如下所示:
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
inside ofSTART TRANSACTION...COMMIT
或我必须放入START TRANSACTION...COMMIT
inside ofBEGIN...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 ...