mysql – 在BEGIN … END上下文或外部和LOOP语法中启动TRANSACTION

前端之家收集整理的这篇文章主要介绍了mysql – 在BEGIN … END上下文或外部和LOOP语法中启动TRANSACTION前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有两个关于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.

我无法理解究竟是什么意思.他们的意思是我必须在BEGIN之后或者在BEGIN之后立即使用START TRANSACTION而不是BEGIN?

// 1st variant:

BEGIN
   START TRANSACTION
   COMMIT
END


// 2nd variant:

START TRANSACTION
COMMIT
END

哪一种是正确的方式,第一种变体或第二种变体?

第二:

我不想创建存储过程或函数.我只想在常规流程中创建一个带有循环的Compound-Statement Block,如下所示:

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

>如果我只想使用LOOP,我是否必须使用BEGIN … END?我可以在不启动BEGIN … END的情况下使用LOOP语法吗? LOOP手册中唯一的例子是:

  CREATE PROCEDURE doiterate(p1 INT)
     BEGIN
       label1: LOOP
         ... 
最佳答案
>

Is it allowed to use BEGIN…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?

开始交易;和COMMIT;是单独的陈述.如果希望存储程序的主体包含多个语句,则需要将这些语句包含在某种复合语句块中,例如BEGIN … END(类似于在括号中包含一个语句块{.. .在类似C语言中).

也就是说,你可以有一个存储的程序,它只包含单个语句START TRANSACTION;或者COMMIT; – 这样的程序不需要任何复合语句块,只是分别开始新的/提交当前事务.

在存储程序之外,不允许使用复合语句块,您可以发出START TRANSACTION;和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?

LOOP也是复合语句块,仅在存储过程中有效.没有必要将LOOP块包含在BEGIN … END块内,尽管通常是这样(否则很难执行任何所需的循环初始化).

在您的情况下,您显然希望从循环结构中将数据插入表中,您将需要:

>定义一个使用LOOP的存储程序;
>迭代外部程序中的循环,该循环在每次迭代时执行数据库查询;要么
>根据sql可以直接操作的集合重新定义逻辑.

猜你在找的MySQL相关文章