00:00
好,那关于变量咱们就说到这儿啊,需要呢,大家下来呢,你自己再去练一练啊,去熟悉熟悉,然后接下来的话呢,我们看这个第二个问题叫做定义条件与处理程序,哎,可能大家看到这个名称的时候呢,突然就会有点懵,诶说这是讲什么内容的是吧?哎,那这块呢,首先我们把这个事儿呢先说清楚,哎,我们这一节呢,是要解决什么问题。来我们首先呢,给大家来一个这个演示啊,先给大家来一个演示。嗯嗯,大家你想咱们现在呢,是在这个DB test16这个数据库下的是吧?那么在这个数据库下呢,比如我做这样的一个操作啊,叫做insert into,比如说employees,我们只针对于这个啊,比如我们叫last name,那这个字段呢,我们做一个赋值啊,比如说我们把这个Tom呢,想给它放进去,那么当我们这样去执行的时候呢,诶一运行发现呢,是不是就报这个错误信息量,那这个大家呢,应该是,诶经常见到是吧?诶我们前面呢,也经常会出现一些错误的信息啊,那主要原因是什么呢?我们DA employees一下。
01:02
哎,走起这个时候呢,我们会发现呢,在咱们employees这个员工表当中啊,它有一些字段呢,设置的是no no的,就因为有一些约束嘛,那比如说我们这个email呢,是no的啊,就是no no,所以呢,我们再去添加一条记录的时候呢,你这个email呢,没有被赋值,那你要付个not值,它不是就报错了嘛,对吧?诶这就是咱们刚才看到这样的一个错误的一个情况,哎,我把这个错误代码呢,跟这个描述呢,我就给它粘过来了。哎,我给他粘过来,那咱们这一节呢,要讲的问题是什么呀,其实就是针对于我们MYSQL中的这个程序,在执行过程当中,执行过程当中出现问题的话呢,我们该如何去处理的问题。哎,如何去处理问题,相当于呢,就是一个错误的处理,这就我们这节呢要做的事儿。如果大家呢,你接触过像Java这样的语言,应该非常清楚,在Java语言当中有非常完善的异常处理的机制,对吧?对于常见的一些异常呢,都专门起了对应的这个类名了啊,叉叉叉的exception是吧?叉叉叉的error,这个大家应该都接触过,而且呢,还使用了像check family啊,Rose啊等等这样的方式呢,诶去做这个异常的一个处理啊,应该我们这样讲啊,一个现代的这个高级语言,它应该都有比较完善的一个异常处理的机制。
02:15
啊,那我们这里呢,就相当于看一看咱们MYSQL当中是如何来处理这个异常的啊,就好比是咱们刚才遇到的这样的问题。啊,这样的问题,好,那这里边儿呢,我们分成两个环节,第一个环节呢,叫做定义条件,第二呢叫做定义这个处理程序。首先来看一下这个定义条件是什么意思,就是事先定义程序执行过程当中可能遇到的问题。把可能遇到的问题呢,我们提前了定义一下,比如说给大家起一个错误的名称,对吧,这个错误名称我们用个字符串来表示,可读性呢会更强,OK,然后呢,第二个环节呢,也是我们说最重要的一个环节,那就是处理程序。啊,你也可以立成较错误的一个处理,就是当我们遇到了这个问题之后呢,诶这时候呢,我们程序应该怎么去处理啊,这个时候我们自己编辑的这个代码啊,告诉他呢,应该是诶continue还是应该呢退出,然后具体的这个执行的代码是什么,这个呢,就是咱们处理的这个程序。
03:08
哎,保证呢,就是咱们存储过程或者函数呢,在执行过程当中呢,能够顺利的执行下去,使得我们这个程序呢,是不是兼容性呢,要更强一些。是这意思吧,哎,就这个问题,好,那这里边我们强调一下这个定义条件和处理程序呢,咱们在存储过程和函数当中啊,都是支持的啊,那我们在这个存储过程或者是存储函数当中,如果遇到了你相关的一些这个错误情况,那我们就可以呢,使用咱们这一节讲的这个内容呢,去把这个错误呢给它解决一下。哎,去解决一下行,那这里边呢,我们就举了一个啊,这是我提前写好了一个存储过程,这个存储过程当中它会有这个呃错误信息,然后我们看一下该如何呢去进行处理啊,相当于我们这一节呢,是由一个案例呢,呃解决的出发,我们把这个内容呢,给大家做一个讲解,好,那首先这块呢,我们把这个第二节咱们这个写一下,叫定义条件和处理程序。
04:01
再和这个处理,哎,程序啊,哎,首先呢,我们可以看作是一个第一个啊,就是一个错误的这个演示是吧,错误演示这呢,算是其中的一个演示了,我们再来一个。啊,是不是就是我们刚才提到这样的一个存储过程,对吧?好,那这时候我们选中CTRLC一下。哎,过来啊,CTRLV。好了,那么这个存储过程呢,我这块呢,是不是就摆到这儿了。找到这以后呢,我们简单剖析一下,这呢是这个begin和end,我们主要呢,就看这个存储过程这个体了,嗯,我这呢定义了一个用户变量啊,是一,然后接下来呢,是一个update的操作啊阿操作里边呢,我们把这个阿贝尔的它的邮箱呢改成是个no。啊,然后接下来的话呢,把这个变量呢,我们再改成是二,然后呢,再把这个啊贝尔这个邮箱呢,改成是这个值,呃,再定义这个呃变量,再把这个变量呢重新复制为三啊就结束了。那我们这块呢,写的123呢,主要目的实际上就是在监测我们这个程序呢,呃,这个比如说我们这个结果是三,那相当于是不是这一步跟这一步就都执行了是吧?如果呢,我们最后呢,去查看一下这个变量是二,那就意味着这行执行了,他没有执行,如果结果呢是一,那相当于是从这块就没执行。
05:08
是吧,诶或者说你这块执行以后呢,这块没执行出现的问题,OK,那这呢,就是我们主要呢是呃相当于是一个呃剖析它执行到哪块出现的问题啊,那在这个程序当中,大家如果你要是熟悉咱们的呃employees这个表的话呢,应该能够知道员工这个邮箱呢,它是不允许为no的,刚才咱们不是也看这个事儿了,是吧?那那这时候呢,其实在这一行执行过程当中啊,它就会出现一个问题嘛。就会出现一个问题好大,你看此时呢,我们选中呢,去做一个执行。好了,那我们在这个数据库下呢,是不是创建了一个这样的一个存储过程是吧,然后下边呢,我们去调用哎这个存储过程,哎调用存储过程我们就用这个call呗。来进行调用,那我们把这个呢,CTRLC咱们直接拿过来啊,小括号一封,诶这样呢,我们选中这是不是就执行了,哎,走起好,那这时候大家你会发现呢,我们就出现这样的一个错误代码了。哎,我把它粘过来。
06:00
这个错误代码呢,上边有一个,下边有个描述,说你这个email呢,Cannot be no,说的也非常清晰啊,对应的错误代码呢,叫1048,这个是OK的是吧?行,那这呢,咱们是通过这个SQL要这样的一个图文化界面的一个工具呢,咱们做了一个演示哈,那如果我们要在命令行中去演示是什么样子呢?诶我这块来一个CMD,咱们首先呢做一个登录啊叫root-P啊ABC123,那这呢是登录的咱们这个8.0,就咱们当前的这个啊数据库是吧?好,那这是我们去use一下啊,我叫DB test是不是16啊。哎,这么着,呃,然后的话呢,我们嗯干啥呢?嗯,其实咱们做的事儿的话呢,你要是拿上面这个错误去演示,你就写个隐L语句这意思吧,那比如我们CTRLC一下啊这块呢,我们。粘过来,然后一回车,哎,你看这呢是一个error,或者的话呢,咱们也可以呢,是不是把刚才这个存储过程呢,咱们再去跑一下也行,这都是这个错误的一个演示。没有问题吧,好,那这块呢,我把这个错误信息呢,我就稍微的盯一下,便于咱们下边呢去给大家去说明,诶编译下边给大家去说明,那现在的话呢,我们把这个错误呢,已经是暴露出来了,下边呢,咱们看一看如何呢,去体现咱们要讲的这个叫定义条件和定义这个处理程序这样的两个环节。
07:19
好,那么首先呢,大家来看一看,我们这个第一个啊叫定义条件。定义条件呢,就是给MYSQL中的这个错误码呢,去做一个命名。诶,给我们这个MYQ中这个错误码呢,做一个命名,然后这有助于存储的程序代码呢,更加的清晰啊,更加的这个清晰,诶它将一个错误名字和指定的错误条件呢关联起来,这个名字呢,可以在随后的我们这个定义处理程序当中啊去使用,哎,就是这个意思,哎下边这块呢,就提到个这个事儿啊好,那我们看一下具体的定义条件该如何去写呢?呃,Declare,一个错误名称condition for,然后一个错误码或者叫错误条件。啊,或者叫错误条件,那主要呢,我们需要填的呢,实际上是不是就俩呀,一个呢叫错误名称,一个呢是不是叫错误码,那你看上面这也提到这个叫错误码是吧,那我们首先呢,针对这个错误码呢,做一个说明。
08:11
这个错误码的话呢,有两种码。哎,有两种码啊,大家你看我这块,哎,我这块呢,把它截图的意义呢,现在就有了,咱们不管是第一个错误还是第二个错误,你会发现呢,是不是咱们以这个为例,这呢是一个红框。哎,我再换一个颜色,这个呢是一个蓝框啊,这个蓝框可能不是很清晰啊,哎,这也是一个蓝框,然后前面呢是一个红框。哎,我就用颜色呢去说明了,那么针对我们第一个错误来讲,一个红框,一个蓝框,第二个呢,也同样道理,好,那这就是我们现在说的两种这个错误码。啊,一种错误码呢,大家可以稍微的念一念啊,叫my circle a。啊,My circle error code,第二个呢,叫circle state value啊circle state value啊,OK,那么这个红框啊,就是咱们说的这个my circle error code。
09:02
啊,My circle error code的,我们这个蓝框呢,就是咱们说的叫circle state value。哎,就是circle value啊,哎,就是我们用这个,呃,My circle error code也好,或者用这个circle state的value也好,都可以去刻画咱们出现的这个错误。哎,都可以去刻画我们现在出现的错误,那这里边呢,1364跟1048呢,它是数值类型的啊,注意是数类型的,而我们这个小括号里边的属于这个字符串类型的。啊,是一个五位的啊,长度的这个字号类型啊,注意这个问题好,那这块呢,我们回过来想强调点呢,就是这个位置,我们这个错误码的话呢,诶大家不是要给这个错误码给它起个名字嘛,方便我们在这个处理程序当中去使用,对吧?那么这块呢,你可以去使用咱们的,比如我用1364是可以的,你也可以呢去使用叫HY000啊也可以啊,因为他俩呢刻画的都是我们当前出现的这个错误。哎,能理解吧。你看下边我就举的这个例子是吧,诶比如说这errorra 1418HY000,其实很好理解啊,然后1418呢,就是这个code的error code,诶里边呢,就是circle state value啊,下边一样的道理啊,4200就是so value啊,这个呢就是my error code,注意呢,就是后边这个呢,它是字符串啊,注意这个事就行了。
10:16
好,然后下边这块呢,就提到了,我们就拿着这个开刀了,咱们如何去定义了啊这的一个举例,好,我CTRLC一下,咱们粘过来给大家讲一下。来给大家讲一下啊。嗯,诶讲这个之前咱们再多说一句话啊,你看咱们刚才执行这个时候是不是出错了呀,出的话呢,咱们知道呢,是说你这个不能申闹,实际上是不是在这儿就出错了,那么在这出错的话呢,那我问大家一下,你说我们当前这个,呃,X这个值是多少啊。你看我这块呢,要是select一下,哎,咱们这个X,哎这个,哎这么着吧,这是我定义的一个绘画用户变量是吧?哎,这个值是几啊,应该是一二还是三呢。那走起,哎,当然你会发现呢,是不是一啊,哎,因为我们在这块呢,是不是就出现这个错误以后呢,程序呢,就不会向下呢继续执行了,哎,所以这个结果呢,它就是一。
11:04
呃,基本上所有的这个程序呢,不管是MYSQL还是SQL中的这个存储过程也好,还是其他的编程语言也好,就是默认情况下呢,只要你这个程序在执行过程当中出现错误以后呢,它就不会再继续向下执行。啊,这是一种默认的,诶,也算是一种处理方案是吧,就跟说一个人一样,你正常的工作学习,生活,然后突然的生病了啊,一生病以后呢,你就理解成了程序出现异常了啊,这时候就结束了啊,啥也不做是吧?注意不是死了啊,哎,一生病以后呢,就是啥也不做了,我就先把工作呢都停下来,哎,是这个意思啊。好,那这个呢,说清它以后呢,我们接着来看咱刚才说的这个第二个问题,哎,我们这呢,叫是不是叫诶。哎,这个叫什么呀,我们是不是去来定义一下我们这个条件呀。哎,定义条件啊,哎,刚才呢,我们提到这个定义条件啊,咱先把这个例题给我粘过来啊,定义条件它的一个格式呢,是这个样子的啊CTRLC。哎,定义条件啊,它的这个格式,哎,我这块粘过来啊,稍微的熟悉一下这个事儿,然后呢,我们来看一下这个。
12:06
哎,例题一啊。稍微有点长。哎,这么着一下好,这里边呢,说你去定一个这样的一个错误名啊,那我们就直接呢,是不是叫declare啊,哎,Declare啊名呢都给我们起好了,那直接呢,把这个名呢,我们ctrl stay一下,哎就粘过来对吧,然后与MYSQL中违反非空约束的错误类型,哎叫这个呢去对应。啊,这个呢,前边是什么,后边什么,我刚才都说过了啊,Declare一个他然后呢,我们就要condition,诶condition for,诶注意condition for后边呢,我要开始去写了,这块写的话呢,我们说了错误码,你可以用两种方式来表示,如果我写叫1048呢,它叫做my soq error code啊所以我们这呢可以写叫哎方式一。哎,使用。啊,这个叫my circle。啊error啊扣的是吧,哎,使用这种方式的话呢,你直接就放一下叫1048,诶这就可以了。
13:01
这就我们说的这个第一种方式啊,那么这个方式二的话呢。放这的话呢,我们就相当于使用另外一个是吧,哎,使用谁啊,我们叫这个a state value。哎,Circle啊,State value啊,就使用这个它,哎可以了,好,那这块的话呢,我们CTRLCCTRLV粘过来稍微的给大家说一下,此时呢,并不是说呢,我们直接呢在这个位置,哎注意人家说了这是字符串了是吧,23000,哎这样就完事了吗?注意诶它呢是可以直接放后边写一个这个错误码的,是一个数字类型的,这要字符串类型的话,前面需要补一个内容。啊,以防什么呀,哎,他把你这个隐食给你转化成是一个数值的是吧,所以我们这儿呢,需要补一个谁补一个啥呢,就补我们的叫circlel。Circle。State,哎这样的话呢,你看它就没有歧义了,你要带这个circle state的话呢,我们知道你这就是用这个,诶我们这种方式呢,去来定义的这个,呃,相当一个错误是吧,诶你要是直接后放后边就写了个值,哎,我们就认为你是用的这种方式来进行定义的。
14:03
啊,比较清楚的是吧,好的,这就我们说的这个定义条件的举例的一个情况,哎,我下边还写了例子,那我们把这个例子呢也写一下啊,CTRLC。张来。哎,这样。呃,其实呢,第一道题大家会了,第二道题也非常简单,说定义这个errorr呢,你看这呢,就是我们这个叫my circleq error code啊,数字类型的这个呢,就是circle value是吧?哎,名称为这个,其实呢,跟整体这个呢是基本上就是照猫画苦的去做,是不是就可以了?那错误名呢,给我们起好了,叫command not alone啊,CRLC。这个呢,我们实际上还是建议大家是不是要建明之意啊。啊,本身的话呢,你看它这个错误码,我们为什么要去定义条件呢?主要不就是因为它这个错误码呢,比较抽象嘛,你看这个错误码呢,你都不知道它到底想表达的是什么是吧?诶所以你看他这块配了一个具体的一个描述,那我们呢,现在呢,呃,后边讲这个处理的话呢,咱们只拿到这个码的话呢,挺抽象的,所以呢,我们给它起了一个错误的名称,诶这个错误名称的话呢,那肯定是要建名之意的,否则的话,你起个名也意义不大了嘛,是这意思吧。
15:06
好,那我们起这个名字针对的,呃,这块呢,叫1148嘛。那就148,然后呢,诶,如果我们要用这个,哎,Circle state value呢来表达呢,叫42000,哎,你就把这改成42000啊,它是circle state value是吧?哎,这就OK了,那比较简单,哎就是我们这个过程呢,就是给这个错误呢起个名。啊,起个名比较简单,好,那么重点的来了,我们主要呢,去解决这个异常,或者叫处理的异常,我们就得看下边这个环节了,要定义诶处理程序。啊,这个呢,是我们说更重要的一个事儿。哎,我们接着说这个,哎,咱们该2.3了啊,哎,定义这个处理程序。这个呢,是真正的去解决一下我们这个异常出现,这个错误出现以后呢,我们该怎么办是吧。好,这里边提到了一种处理方案,说declare,哎,大家注意看啊,处理方式handler for啊,Handle的意思呢,就是处理器啊处理啊,Handle呢,就是处理的意思了,For,哎,错误类型,哎,处理语句诶,大家可以这样理解啊,就是我们如果出现这样的错误类型的话。
16:09
我们就按照这样的方式呢去处理,哎,处理的语句呢,是它。能明白吧,我再说一遍啊,如果我们出现这样的错误类型,诶你看这个错误类型呢,实际上也跟我们之前定义的这些呢,其实就相关了,是吧,比如说你出现1364了,这是不是也算一种数据类型,诶我们要用这个呃,SQL value去描述呢,我出现23000了,诶是主要是跟这有关系的是吧,我出现这种错误类型了,我们就按照这种方式呢去处理,处理的语句呢是它。哎,这就是大家的一个理解。好,那下边呢,我们看一看这个处理方式都有哪几种啊,诶处理方式我们提到有三种,Continue和undo。啊呃,这个呢,其实大家也就跟咱们生病一样哈,你说你生病了就相当于我们这个程序呢,比如说出现这个错误了,呃,那这个第二天早上本来要上班的,结果早上一起来。啊,咱别说发烧了,就发烧呢,比较敏感是吧?哎,咱们说一个比如说闹肚子了啊,或者这个头疼啊,身体不舒服啊,昨天加班加的有点晚了是吧,然后第二天起来呢,这个有点头疼啊,头疼的比较厉害啊,相当于我们程序呢,就出现错误了,那问啊你该怎么办呢?啊,其实第一种方式就是坚持去上班啊,就继续去,那就相当于我们这里边儿这个叫continue啊,继续去执行。
17:21
啊,我们的程序啊,这是第一种,然后第二种的话呢,就哎,我就在家歇一歇吧,是吧,今天请个假啊给HR呢说一下我不舒服啊,请一天假,这个呢,就相当于我们这叫ex啊这个程序呢,咱就别往下执行了,咱就退出了。哎,这就是这个意思。然后这个呢叫安度啊,这个安度的话呢,相当于把错误这个后,诶这个遇到错误以后呢,撤回之前的这个操作。这块呢,大家呢,可能还不是特别理解啊,它会涉及到什么呢?我们在一个程序当中啊,尤其一个存储过程或者函数当中,我们呢,是不是可能会有多行的这个执行语句,它呢可能会作为一个整体去出现。啊,这其实就是涉及到这个事物的概念了哈,那作为整体出现的时候呢,你比如说我们执行了两个,在执行这个的时候呢,出现问题了,那一方面你说我们继续做,这是一种,第二种呢,就是停下来不做了,直接退出程序,这也是一种,还有一种情况呢,其实就撤回去。
18:13
啊,撤回去就好比是比如说你现在正在呃完成一项工作,然后呢,这个第二天早上头疼,你不是要请假吗?请假了这个老板一看说这个事儿这么急,然后你还请假了,怎么办呢?说你把你之前做的工作你交出来吧,然后让别人重做一遍啊你可以这样去理解啊,这个叫安度啊,那这块呢,注意咱们MYSQL呢,暂时呢是不支持这样的操作的。哎,暂时不支持的好,那咱们现在要选择的话呢,处理方式你就选肯定就或者是吧就可以了,接下来呢,这个叫错误类型,这个错误类型的话呢,我这一共列举出来了六种情况。啊同学一看,哎呀脑脑子就嗡嗡的是吧,哎,头都大了,这块呢,我分成拨一下啊,这仨呢是一波,哎,这哥仨呢是一波啊,咱们是各个击破啊各个击破。其实呢,也不难,大家你注意听啊,这个叫错误类型,那咱们不是要处理你这个错误吗?你得告诉我,因为我们程序在执行过程当中,咱们有可能会报好多种错误类型,是吧,咱们是不是针对这个错误类型这块的话呢?来嗯,比如说你这个123,诶我们出现一的时候呢,怎么处理,出现二的时候怎么处理,出现三时候怎么处理,它肯定是不一样的,那我们主要呢,是不是针对这个错误类型去匹配你这个123呀。
19:24
好,那123的话呢,咱们那会儿也提到了,不就是呃,有有这几个东西嘛,一个呢,叫这个我们称为叫什么。是叫my circle error code是吧,哎,你可以就称为叫数值类型的,这个呢,叫串类型的啊,叫circle state value是吧。啊,就这俩的叫法啊,呃,一个的话呢,错误类型,我们就用你这个。这个是什么数字类型的这个错误码表示一个呢,我们就用你这个,呃,字符串类型的这个错误去表示,诶还有一种。那还有一种,大家你想我们上边啊,是不是咱们诶起过一个名啊。哎,起位名针对的是不是就是某一个错误码呀,诶所以说我们第三种方式啊,咱们就诶既不用你这个数值型的,也不用这个组串型的,我们用啥呀,你前面定义的这个诶错误条件。
20:08
啊,错误条件的这个名啊也可以啊,那其实我说的这三种呢,对应的就是我们这三种。你看一下这个SQL state,这不就字符串那个吗?就好比是我们这个二三零零零一样,是吧,或者叫HY000,然后这个MySQL error code呢,不就是我们这里边的1364或者1048吧,哎,OK,然后错误名称呢,呃,就我们上边提到了,咱们定义了一个这个错误条件,哎,直接就用它。啊,那要这样看的话呢,其实咱们上面讲的这个错误,呃,这个定义条件啊,呃,它呢,其实是一个可选的。什么意思啊,就是我们不是说这一步是必须要做的,能理解吧。比如呢,我们呃,就没有去针对,比如说咱们这个错误,我去这个定一个这个错误条件了,咱们上来呢去处理,处理的话呢,我只不过是不是就用不了你这个这样一个有意义的名了,那咱们就直接用1366或1364,或者是HY00是不是也可以啊。哎,也可以的啊,所以第一步呢是可选的,没有说非得要去定义这个条件啊。
21:04
OK,那么我们接着说这三种的话呢,大家可以理解成是我们算是比较通用的这个方式了啊,然后在下边这块呢,它是属于一些特殊场景,比如说呢,我们这个circle state的话呢,呃,是不是我们这个小括号里的呀?呃,它这块呢,呃,有的是以零一开头的,有的是以零二开头的啊那我们呢,呃,如果你要写这个circle warming的话呢,诶,我们主要匹配的就是零一开头的。哎,Not放到哪来匹配这个零二开头的。然后这个circle exception呢,哎,它可以去匹配呢,诶既不是circle warming,也不是not found的这个开头的这个错误代码。啊,这样的一个情况。反正大体理解吧。啊,大理页就我们把这六个呢,就剖析了一下,好,然后这个处理语句,诶我们想咋处理啊,那刚才说continue啊,带continue的话呢,我们其实还是可以写一些具体的语句的,通常的这个处理语句呢,就两种情况,第一种呢,就是我们处理的语句里边,咱们去定一个用户变量,然后呢,给用户变量去做个赋值啊,然后还可以呢,咱们可以呢,去begin end去写一个这样的一个结构体,在结构体里边呢,去写一些复杂的语句啊,这个都是可以的。
22:09
哎,这个都是可以的啊OK。好,那么针对于刚才呢,你看我们这呢,是不是讲的这六种类型啊,我呢先把这个结构呢,咱们先拿过来啊,CTRLC一下。啊,这个定义的处理程序,我们首先呢,提到它的一个格式。哎,格式呢,是不是就它呀,哎,然后呢,我们下边呢,有几个举例,哎哎。我放到咱们这个笔记当中啊。啊,因为这个呢,是一个多行的,我就直接这样写了。在这儿呢,我给大家写了六种案例,哎,我CTRLC一下。哎,带着大家呢,一起来做一个剖析啊,一起来做个剖析啊,这呢,我就可以不用加这个框了,是吧。好,大家来看,我这儿写了六个呢,就对应咱们刚才上面讲到的,哎这个哎是不是就123456这六种情况啊,哎,好的,来回来看啊,就是你用哪种呢,其实都可以考虑的,哎,我们诶跟你这个格式呢是匹配的啊declare,然后呢,我们说处理方式呢,咱们这就有两种,一个呢叫continue啊,是不是一个叫exce啊,哎,我这就哎有的用肯定有,有的用X了啊看你实际当中你想用哪个,然后hundred four,诶后边呢,主要咱们要看的实际上就是这个错误类型。
23:18
我这个处理语句呢,这块呢,全是用的这个给一个变量赋值的方式了。啊,这个呢,大家就知道一下统一的方式,所以我们现在主要带大家看的其实就是这个错误类型啊,错误类型的话呢,咱们提到过,你是用字符串来表示的,好,那就circle state是不是写上个值啊。好,第二种的话呢,是不是叫my error code啊,我们直接写这个code就完了。很清楚是吧,第三种的话呢,诶针对这个诶。这个这个叫什么呀?MySQL error code呢,我们给它定义了一个条件。叫这个名,所以我这个handle for的时候呢,我是不是就用这个名就行了。啊,这不是非常清楚吗?哎,接着呢,我们还可以去匹配,匹配这个叫零一开头的啊,这个零二开头的,还有呢,非0102开头的啊这些啊,这就是这六种情况嘛。
24:00
才有我们的一个具体的举例。哎,一个具体的举例啊,这个应该是也比较清楚一些啊行,那么这块呢,如何去处理呢?咱们就算说清楚了,然后接下来的话呢,咱们是不是要针对咱们上面出现的那个函数,那咱一开始写的那个,哎,咱们去做一个处理啊。哎,需要做个处理啊,就是我们上面一开始讲的案例的一个解决好的,那我们回过来啊,这个是2.3了,然后我这块呢,写一个叫2.4吧。嗯,这个案例的啊一个,哎处理啊,咱们前边这块呢。哎,咱们刚才在哪,是不是在这儿啊。在我们这个call呢,去执行的时候呢,咱不是说这块出现一个这样的错误情况嘛,哎,那么我们首先怎么着啊,我把这个呃存储过程啊,咱们给它删掉,哎,我这块来一个job是吧?啊procedure。哎,我现在把它给删了。选中。执行。啊,删了删了以后的话呢,呃,下边呢,我们是不是要把这个存储过程咱们重新的去定义一下呀,诶CTRLC一下。
25:03
哎,这个我们先加个井号啊,哎,这个我们在这写一下,哎,重新。哎,重新呢,我们去定义这个存储过程。哎,然后呢,这个呃体现啊,这个我们说叫,哎错误的一个处理程序啊。好了回过来,呃,这里边呢,我们还写成这个叫123吧,然后呢,我们在诶诶你这个比begin之前,哎,注意大家你看啊,我们是不是一定要在开头的时候就写明啊,哎,写明什么呀,我们这个处理程序。呃,声明这个处理程序啊,因为呢,你要是写到下边了,是不是都晚了呀,你必须得一上来呢就声明好,然后呢,程序呢,在执行过程当中,如果出现问题了,是不是就按照你已经声明好的这个处理程序呢,去执行是不是就可以了呀,啊可以了,行,那我们刚才呢,执行过程当中出现的问题呢,是不是就是咱们在这儿也看到了。这就是咱们执行的这个存储过程是不是出现的,呃,1048这个呢,是咱们数值类型的,这个呢是字串类型的两个码啊用哪种方式是不是都行,我们讲了这是不是好几种方式啊啊好几种方式目前的话呢,呃,咱们如果要是没有做这个事儿的话呢,那咱就用一跟二,用这俩挑一个就行啊,你要想用第三种方式呢,咱们还得去定一个这个条件是吧,那这个一会儿吧,一会儿咱们去下个案例的时候呢,咱们可以考虑用一下这种方式啊,咱们现在的话呢,就根据这俩呢,咱们挑一下方式一跟方式二就OK了,能理解吧。
26:25
啊,能理解啊,写这个事儿呢,其实非常简单,就拿过来粘过来其实就行哈,哎,我这重写一下吧,啊第呃,当然你粘过来还得改一下你这个码啊啊d declare哎,我们要干什么呢?咱们来一个continue吧。哎,让它继续是吧,然后呢,这个叫a handler啊four,嗯,这呢叫1048,哎1048哎我就这样写了理解吧,好,这呢是我们说具体的这个错误的它这个码,然后呢,我们后边呢,你这个处理的语句是什么呀,我们这块定一个变量吧,比如说塞了一个啊pro,这这个Y6啊这就复制为一个叫负一吧。能看懂吧,这个呢,你可以理解成是我们的这个处理的方式一。
27:06
哎,处理方式一,那我这块呢,我可以再写一个。这个呢,你写一个就行,就别写俩了。除以方差对吧。方式啊。还可以怎么办呢,我们把这个呢,Ctrl c ctrl view粘过来,咱们这个位置的话呢,我不写你这个数值类型的,我是不是可以写,是不是叫,哎,我们叫什么呀,诶circle state呀。诶搜state呢,这个位置我写一个咱们的叫23000,是这意思吧。哎,这俩俩都可以啊,啊,你选一个就行,哎,这个呢,对应的啊,就是咱们说的是不是这个第一种情况。啊,然后呢,我刚才写的那个方式一呢,对应的是这种情况啊,选一个就可以了,好,那么这样呢,我们写完之后的话呢,这个程序呢,呃,如果说呃定义好以后再往下去执行,在这个位置呢,它是不是出现了这1048了,然后我们就按照上面指定的这个方式去处理干什么呀,我们程序呢,继续向下执行,同时的话呢,它还定义了一个呃用户的变量啊,我们赋值为负一,那当成人执行完以后呢,我们再看一下这个X和这个值呢,是不是都能够拿到,看看分别是几是这意思吧,好,那此时呢,我们把这个呢选中咱们跑一下。
28:15
啊,执行了,然后呢,我们这时候,呃,这个创建好了,然后我们去做一个call的调用。哎,把它CTRLC。拿过来选中。啊,这个呢,是咱们叫哎调用哎存储过程。好的,然后这时候呢,注意看啊,我们刚才呢,去调用的时候呢,你看明显报了个error,而现在呢,走起哎,你会发现呢,它是正常执行结束了啊,那么这时候呢,我们来查看一下这个变量。哎,我们是不是就可以select,哎,我select一下啊,首先咱们看下这个X值,然后呢,我们看一下这个,诶,咱们是不是有一个这个Y6值啊。看我写错没啊,哎啊,写的是他。哎,这个好选中一下,大家你猜一下我们目前的变量值是多少,应该。
29:02
走起。跟你想的一样吗?诶,你看我们这时候呢,这个X值呢,变成三了,呃,当你这块出现这个错误的时候呢,我们呃就直接在这儿呢,相当于是做了一个补货,补货以后呢,我们选择的叫continue啊说哥们呢,你继续往下执行就行,所以呢,这个X呢就一直执行到结束了,它的值呢就是三,而且呢,我们在补货的时候呢,还设置了一个变量啊是负一,所以这个负一的这个值呢也有。啊,那这呢,就是咱们这一节相当于是讲的这个,呃,定义条件啊和定义这个叫处理程序啊。呃,这呢算是一个我们把案例的一个处理是吧,哎,有始有终啊,哎,如果大家这块呢,感觉还差点意思呢,咱们可以再举例一下。啊,再举一个例子。啊,再举一个例子。哎,保存一下啊,呃,这个对应的我在这个笔记当在咱们课件当中也有,呃这呢提到我们创建这样的一个存储过程啊,我们CTRLC一下,嗯,这个存储过程呢,是往咱们的啊,我这里边儿写的是往咱们这个部门表里边呢去添加这个数据的。
30:03
行,那咱们就拿这个来说一下吧。哎,这样的是吧。往咱们这个部门表里边去添加数据,呃,这个部门表呢,添加数据的话呢,呃,咱们得让他把这个错误呢,得报出来才行是吧?嗯,这个呢,我提前,诶这不有个储备工作啊,把这个储备工作呢,我就直接拿过来了啊把这个都拿过来吧,CTRL一下。诶都拿过来这个的话呢,咱们在当前这个数据库下呢,其实我已经把这个表呢,都已经创建好了,所以这个呢就不用执行了啊,大家如果你要没执行呢,你就先跑一下这个程序啊呃,然后呢,我们去DEA一下,嗯,我看一下这个叫departments。哎,咱们当年这个表,看看它里边这个约束的一个问题。好,这块呢,就给我们呈现出来了,嗯,就这样子的是吧,我们现在呢,想怎么着呢,给这个表中的这个叫department ID这个字段啊,加上一个唯一性约束。哎,加上一个唯一性约束,好,我们走起来。哎,我就加了,然后你再去做这个de这呢是不是呃微信啊,他这加上原来这个no这块,它给我写成叫P了啊,这块稍微有点这个不足够精准啊,我们F5刷新一下,你在这个位置呢,我们去看一下,哎,这是不是就我们加了这样的一个约束,是一个unique是吧?哎在这吧。
31:14
看在这啊好,那么我们加上这个唯一性约束以后呢,诶,我下边呢,想演示的事儿呢,就是往这个表中呢,我们去呃添加这样的两条记录,这两条记录的话呢,我们值呢是一样的,哎,那我们在添加这个department name的时候呢,Department呢,相当于默认公负的值似乎要一样了,是吧?诶它这时候呢,就会出现问题。这个好像主体的这个代码也比较简单,咱们就直接拿过来吧。这块啊,咱们来去定义。哎,定义,哎这个存储过程。啊,这个呢,其实都是咱们这个例题里边的这个事儿啊。这样吧,这个呢,我写一个叫,呃,上面是2.4,咱们这写一个叫2.5。啊,要不这个大家看的时候呢,看的就不清楚了啊,这个我们是第一个小的步骤。
32:04
哎,这第二步,哎这么着啊就更清楚了,哎,把咱们主要要讲的就是呢,我赶紧给他来删了是吧,咱们等下去说啊行,那这里边呢,咱们就要往这个叫departments这个表里边呢,我去添加数据,我把这个department呢生成唯一了啊这个时候我们就没管它,直接呢就添加这个department name啊,我写的叫测试啊,然后这块呢,我再添加一条啊,它默认这个值的话呢,有可能就会相同了是吧?好,那我也是为了方便呢,去查看这个程序呢在哪块终止的,所以我们提前呢定义了一个用户变量,这是一至是二,这三,我们想看一看它这个值呢,到底是多少啊,到底多少行,那目前呢,这个代码呢,我们先写成这样,咱先不考虑个程序的处理来,我们选中以后呢,咱们执行起来。这个时候呢,我们存储过程上是不是就创建好了,然后呢,我们先去做一个这个调用来号一下。调用一下我们这个存储过程,哎,选中选中,然后这么着,那这块呢,我们选中的话呢,能够想象到它就会出这个错误信息啊,你看这里边就提到这个问题是吧,哎,有一个零的事儿,哎,我们这违反了咱们当前上边这个设置。
33:08
哎,当然这个设置啊,哎,我这个写的是name了,其实应该写的是这ID吧。应该写成ID啊OK,哎,总之呢,这时候呢,我们针对这个ID这个字段呢,哎,这时候你去放的这个值呢,会有这个重复的了啊W了好,那我们此时的话呢,咱们去怎么着呀,我去select一下啊。体谅一下我们这个X。哎,大家你猜一下,我们这时候X值应该是几。这个值应该是几?看看,跟你想的一样吗?知道吗?哎,我们这一行代码执行完以后呢,是相当于定义了一下,它这个是一,然后这行代码是可以正常执行的,然后呢,我们这时候就复制二了,当你再往里放的时候呢,违反了唯一性约束了啊,所以它就没有执行下边这一行代码,所以这个三呢就没走到是吧,所以这个值呢是二。啊,这是我们说的这个场景。啊,这个质量是二啊好,然后接下来我们去这个哎删除哎词存储过程。
34:06
哎,这个我们去drop一下啊。这啊。哎,这个有点长,我就直接粘过来了。好,我们呢,把它给干掉。删掉以后呢,我们下边呢,来重新定义。啊,这个存储过程。啊,这个主要的区别呢,就是哎考虑。哎,考虑到,哎,我们相当于是这个。相当于这个错误的处理程序是吧。好,这块我们来重新定义啊,这个咱们叫定义它,然后下边呢,可以是一个,我这叫一个三吧。这是四。这个呢是五。好,那重新定义的话呢,我就先把这个整体的结构呢,CTRLC一下,咱们给它,诶粘过来啊粘过来,然后我们在这块呢,咱们考虑呢,去做一个,哎,具体的一个处理是吧。
35:02
哎,处理。哎,程序啊,这个处理程序呢,咱们刚才也讲到了,咱们使用的,哎,是不是可以叫a declare。哎,Declare,嗯,咱们刚才那个错误叫什么是dulicate是吧?哎,出现这个重复的这个数据了啊,嗯,Du。嗯。K是吧,嗯,这个entry啊,我就这样起这个名吧,哎,这呢相当于是我们这个处理这个诶写错了啊,哎,这呢是我们起名了,咱们现在是讲讲这个处理的啊处理的话呢,我们是想这个continue呢,你还是想叫ex呢?哎,是不是可以这样去选择呀,那比如我这块我选择这个叫ex吧。然后接下来的话呢,是不是叫handler for呀,哎,然后呢,呃,写什么呀,就是你这个具体的码是多少,诶咱们刚才那个码大家有印象吗。我这还没保存着是吧。给保存住啊。嗯,没保存住的话呢,那咱们还得再跑一下哈,好,我把这个,呃,这个存储过程咱们再去创建一下。
36:04
哎,又创建了啊,然后呢,我们再去做个调用。哎,这呢,是不是就看到了。就这个吧。哎,但是我们要在这块看的话呢,它相对来说单一一点,只能看到这个数值类型的啊,比较单一,嗯,你可以呢,这么着啊,我把它呢,CTRLC一下放在咱们这个命令行这块。这块我们看到的它就比较丰富一些了。哎,这个我们这样盯一下。好呃,那么这个1062呢,是它这个我们说这个数值类型的这个呢,是不是这个字符串类型的呀,啊这个你用谁呢去处理,其实都可以的,这块呢,更清晰一些啊。好,那这块咱们把这个存储过程咱们就不用它了,接着把它就删了吧。哎,删了啊好,那么我们回过来现在的话呢,我们要处理的话呢,For这块呢,咱们不是讲了有六种方式吧,哎,上面有六种,哎,你可以呢,这块直接我是不是就写1062就可以了。哎,1002,哎,这是一种方式,然后后边呢,比如我们去再去set一个,哎,我再叫,哎叫哎per哎叫value吧,这个呢,我们值赋值为啊也写成负一吧。
37:05
哎,这个呢,就是我们处理程序的一种方式,或者的话呢,这是一种了啊。多写一写吧,这是一种方式,然后第二种方式呢,哎,CTRLCL一下啊粘过来我们可以呢,在这个位置呢,怎么着呀。我是不是写呢,叫做circle。诶搜state,然后后边呢是一个字串,然后呢叫23000,诶是不是这也是一种方式啊啊那这个我也注释掉了。啊,这个我写成角,哎,方式一。哎,这个方式一,然后再来一个。哎,这叫方式二。没问题是吧,好,然后呢,下边咱们再来一个例,哎方式三,方式三这块呢,哎,咱们演示个谁啊,演示一个咱们,哎上面不是讲了叫定义条件嘛,哎,咱们这块呢,也来一个吧,哎,叫定义一个条件。哎,定一个条件啊,Declare啊,哎,我们呢,定一个条件啊,还记得是怎么写吗?
38:01
还记得怎么写吗?首先呢,是不是给你这个错误的话呢,起个名啊,哎,比如我们叫duplicate entry啊,就是你重复的这个entry了是吧?哎,然后呢,叫condition啊,Condition for是吧。放后边的话呢,你可以写叫1062。啊,直接呢,就写1002就行,或者呢叫condition for circle state,然后23000啊都行。啊都可以啊,我这呢,比如说就选这个这种方式吧,然后接下来的话呢,你是不是就可以哎考虑用这种方式去处理了是吧?来我们CTRLCCTRL一下,这个时候呢,就是for啊这个位置你就别写这个事儿了,是不是就for我们这个呀,来CTRLC一下粘过来。保存一下能看懂吧,诶我这个呢是方式一方式二方式三,这个方式三呢,对应的就是咱们上面给大家举的这些案例里边的第三种。啊,这不就这种吗,我们自己定义这个条件,然后我们就用我们自己定义的这个条件。OK吧啊就这样啊啊,这个咱们其实不需跟大家写了啊,但是我们就写成一样的吧,这样啊好,然后这呢,咱们就写完了啊,针对的是我们下边这个。
39:07
嗯,这个我就不看当了啊,这呢是不是就写完了,哎,写完以后呢,我们下边呢,就把这个成语呢,就给它抛起来去执行一下啊,哎,刚才呢,我应该是把这个存储过程我们给删掉了啊,你要怕这个没删,你可以在这块呢再重新删一下啊叫if,嗯,Exists是吧。哎,加上他呢,以防呢,就是本身也没有了,那你就要删的时候呢,报错的问题哈,走起。好,如果你要存在呢,就删掉啊,然后呢,我们把这个存储过程呢,咱们再给它跑起来。哎,是不是到这儿啊,然后走起。好,那此时的话呢,我们这个存储过程咱就创建好了。嗯,创建好以后呢,我们这时候呢,去调用调用啊直接呢靠。嗯,调用我们直接CTRLC,哎粘过来,哎,走起啊,由于呢,我们这个程序当中,咱已经考虑到你基于这个错误的一个处理方案了,所以我们在运行是不是就不会报错了,哎凑齐,你看这时候就没有报错,哎没有报错呢,此时我们去哎select一下,首先呢,我们去看一下这个X的值,然后呢,我们看一下这个变量有没有值呢?哎,凑齐啊。
40:12
哎,是不是就这么着啊好,那这时候我们选中啊,咱们做一个执行。哎,这个的是一和负一。啊一可复一啊有同学说,诶这个怎么是一呢?啊,因为呢,咱们刚才上面执行的时候呢,往这表里边是不是已经插入了那个数据了,你要再插入的话呢,其实一上来它就算是重复的了,是吧?哎,就算重复了,相当于我们这时候呢,诶出现的是一的时候,然后你在执行这块呢,它不是就挂了吗?他一挂的话呢,你要干什么呀,我要X嘛。是吧,我要意思我要退出嘛,对吧?哎,我要退出的话呢,这个时候我们就不会再考虑往下边去赋值了,然后同时呢,我们这个变量呢,也赋值为负一,哎,这不就没问题了。好了,那么咱们这一节呢,就给大家讲完了啊,总体上来看的话呢,咱们主要解决的问题呢,就是在咱们这个啊,存储过程或者是存储函数当中,如果出现错误了,哎,你是希望程序继续往下执行,还是说呢就停止,还是说呢有其他的一些,哎,这个比较复杂的一些处理逻辑。
41:05
对吧,哎,那这时候呢,我们大家就可以学习这一节啊,叫如何去定义条件和处理程序这一节啊,学习一下就可以了。
我来说两句