加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-03-05 08:14:39 所属栏目:编程 来源:网络整理
导读:我有两个关于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 in

我有两个关于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可以直接操纵的荟萃从头界说逻辑.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读