00:00
好的,那关于我们说这个live啊和it呢,咱们就说到这儿了啊,那么这两个结束之后呢,咱们整个呢,相当于关于咱们讲的这个流程控制,咱们就结束了,那接下来的话呢,我们看下一个内容。哎,下面内容呢,我们叫做这个油标啊,油标或者呢,我们也可以称为呢叫光标,诶什么叫光标啊啊这个大家应该不陌生,你看我现在呢,一直在闪的这个呢,其实就可以理解成是不是就光标啊,那比如说我们光标在这,哎光标在这儿,光标在这,光标在这儿,哎,你看我们光标呢,我放在这儿的话呢,现在是不是定位的是这一行数据对吧?呃,在这个位置呢,相当于是定位的这一行数据,那现在我们这个叫光标或者叫油标的这个结构呢,呃,其实呢,就相当于是诶定位我们这个表当中的一条一条数据的啊,是这个内容。啊,什么意思呀?来首先呢,咱们来给大家举一个例子啊,来你比如说呢,你看我现在写一个这个查询语句,哎,我呢叫selecting from呢叫employees啊,我们选中了已执行。好这块呢,咱们是不是就把这个表中的数据啊,你看就查询出来了是吧,那甚至呢,你还可以呢,再去写一个,比如说过滤条件啊,那过滤条件加上以后呢,我们可能查出来的是这个部分数据了,那么针对这个表中的部分数据呢,我们你看。
01:13
查询也好,还是说咱们这个update也好,实际上呢,每次都是把它作为一个整体出现去操作的。哎,大家有没有注意到这个问题啊。啊,有同学可能不太理解什么意思啊,你比如说呃,咱们说一个update吧,我现在呢,想修改这个表中的这个记录啊,Update这个employees,然后呢,Set什么什么,然后where,诶我们通过这个where的话呢,咱们是不是就能控制咱们要查询的这个数据的这个条目数了。那如果说我们查出来就只有一条记录,那相当于你改的是一条,但是很多时候呢,我们说这个update呢,它是支持这个叫批量操作的,那也就是说呢,我们这个update呢,呃,通过这个过滤呢,查询到的是好多数据。然后呢,我们修改的话呢,是不是就诶你你这一个update语句下去之后呢,是不是就每一条记录都给我们改了呀,包括呢,我们说的delete也是一样,你这个where呢,呃,写完以后呢,我们比如说查询到的是多条这个语句,然后呢,你一个delete呢,是不是就全干掉了。
02:05
对吧,那这时候呢,我们就想说能不能呢,咱们深入到这个数据里边,我们一条一条呢,去做一个细致的一个操作,就是不是呢,作为一块,作为一个结果集的方式呢,整体上去做一个呃,一个操作了。啊,这个有点抽象啊,嗯,我举个例子吧,你比如说呢,我们现在呢,哎,我还是做一个查询。我查询的这个表中的这个员工的salary,然后呢,我按一个叫de这样的去做排序,相当于呢,是不是就新增的从高往低的顺序呢,是不是这样排序的呀?啊没有问题,好,那我们查出来,比如说107条记录,现在的话呢,我们就想,哎,光标呢,先指向第一条数据,我们把这个呃,第一个员工的工资呢先取掉,然后紧接着呢,我们再去取第二个员工的工资,那么我们怎么着呢?咱们比如说设置一个这个上限。啊,我现在呢哈,比如上线呢,是这20万说呢,我们就诶把员工的工资呢,一个一个的做累加,累加到呢,比如说诶达到20万的时候,或者那叫首次超过20万的时候呢,咱们就停下来。
03:04
看一看呢,我们累加过几个。那像这样的情况呢,咱们是不是就一个一个的拿着我们这个表中的记录呢,去操作了,而不是说呢,我们把它呢看成铁板一块啊,一个整体呢,去做一个整体性的操作了。啊,那我们怎么能够达到这一行一行数据这样的一个操作行为呢?诶这呢,就是我们说的这个游标啊,它可以帮我们去实现的。那就这样啊,你看我们说呢这个,哎,不管呢,你是用where也好,用having也好,就过滤完以后呢,咱们还是一个结果集,而这个接口集呢,它是可能涉及到多条记录了,对吧,我们没有办法呢,精确的定位到其中的某一条记录,那对它呢,进行一个精确的处理。啊,就是原来不行嘛,是吧?哎,那要是想这样做怎么办呢?我们就需要用到这个游标的概念,哎,他呢提供了一种灵活的操作方式,让我们呢,能够对结构机当中每一条记录,哎都进行一个精准的定位,然后呢,你再针对你定位的一个数据,啊,这一行数据,你看你到底是想取哪个字段啊,我就不用这个星了,那你就取你想要的那个字段,然后把它拿出来,你看你到底是想做哪种操作,哎,就这个意思。
04:08
啊,你看这句话大家能不能理解说呢,游标啊,就像咱们这个circle呢,这种面向集合的语言呢,有了面向过程的开发的能力。是吧,集合的啊,原来呢,就相当于是它是一一大块这个数据就是一个集合嘛,那现在的话呢,我们可以呢,面向过程可以一条一条的这样的方式来去做这个处理了。哎,就是这样个意思。好的,那么这里边儿呢,我们说这个油标啊,或者我们说这光标呢,那就起到了一个叫指针的一个作用啊,它就相当于是一个指针啊,你比如我们这块呢,又举了一个例子。我这呢写了一个select语句啊,查询这三个字段,从我们这个表里边儿,然后呢是工资呢大于一万五的。哎,把查询这个结果呢,我就放在这儿了,那么放在这以后的话呢,这个呢,其实就是一个结果集了,然后针对这个结果集呢,我们希望呢,诶能够诶精确的定位每一行的一个数据,然后单独的针对这一行呢,我们取出来做一个操作。做一个操作,你比如说呢,呃,这个一开始的时候呢,我们这个指针呢,其实就在开头了,对吧,然后呢,我们接下来呢,让它再接着呢去往下移,然后再往下移,再往下移,每次移动的时候呢,我们就能够拿到这一行数据,你呢,哎,针对这一行数据呢,你可以再去比如定义三个变量,意思呢,是不是就放我们这三个这个,诶三个这个值是吧?然后这三个值呢,你可以单独性的去做一个操作。
05:23
操作完以后呢,你再直接让它往下移一下呢,那就再操作下边一个。哎,就是这样一个,哎方式啊。好,呃,那么下边的话呢,咱们看一看这个油标,那具体的要想使用的话呢,我们应该分几个步骤啊,分几个步骤,呃,这里边我们提到了说一共呢是有四个步骤,同时呢,在不同的这个数据库管理系统当中啊,这个语法呢稍有不同啊,比如说我们第一步呢,叫做生命为标这个事儿。第一步呢叫声明,声明呢就是declare对吧。咱们前面的话呢,是不是讲过声明一个变量啊,就是咱们自定义的这个局部变量,在咱们存储过程或者是这个存储函数当中,我们可以呢去declare declare一个变量,对吧?呃,这个相当于是一个局部变量了啊,那么这个游标的话呢,也是需要用这个declare去声明的。
06:09
啊,这个是我们的游标啊名,然后cost for这块呢,就是我们的查询语句。啊,我们查完以后呢,不就是个结果集嘛,针对这个结果集呢,我们去做操作对吧?呃,那如果呢,是这个my circle serve server DB two或者Maria DB的话呢,我们就是Korea for了,那如果你要是Oracle或者说PG circle的话呢,我们就是career,哎,这个is是吧,Is啊就是这样的一个语法了。就是稍有不同嘛,是吧,能够理解啊行,这呢是我们说的这个第一步叫哎这个声明游标,这呢我们多说一句啊,就是我们这个游标这个declare的声明啊,咱们需要放在这个变量的声明的后面。啊,你看咱们当初讲这个存储过程,存储函数的时候呢,我们是不是哎,Begin,然后呢,这块是N这个N的,哎,然后呢,Begin里边呢,如果你要是定义这个局部变量上来,就需要去declare这个变量,然后定义完变量以后呢,我们下边呢,再去定义咱们的这个。
07:07
啊,注意是要写在这个下面的啊。啊,那当然了,咱们这个现在说的这个科,它其实就是放在存储函数和存储过程当中来使用的,对吧?哎,就这个意思啊。啊,这才是我们说的这个第一步,那么第二步的话呢,就是叫打开游标啊,这个第一步呢,我们只是呢,相当于是怎么着啊,就是定义了一个游标,然后让它呢,能够去指向咱们这样的一个结果集了啊,指向那个结果集了,还不能说呢,直接去使用啊,我们还得需要呢去打开一个邮标,所以呢,这叫open啊,这个咳色啊,起个名字是吧,那此时的话呢,我们就可以把这个呃,希腊语序的这个查询结果的这个结果集。就送到了这个游标的工作区了,啊就这意思,然后呢,为后边这个竹条读取数据呢做准备,那下边呢,就是主条读取数据了,那我们也可以称为呢叫使用游标。啊,使用目标这个呢叫fetch啊,这个cursor into,诶这个怎么理解啊,给大家说一下,你比如说呢,我们针对的就是这个查询句吧。
08:06
啊,相当于咱们比如说第一步的时候呢,我这个课for后边这个呢,Select语句呢,就是它是吧,那我们的第三步的话呢,是不是咱们叫fetch,还是你这个课的这个名into,哎,这个into后边呢,是几个变量。那它这块对应的是谁呢?就是我们上边的第一步呢,叫声明游标的时候呢,我们是不是查了是三个字段啊,那你查的这三个字段呢,当我们fight的时候,每fetch一次,相当于它就是取这一条。取这条记录呢,你是不是就只查了三个字段啊,那你把这三个字段into到,诶对应的你就应该有三个变量啊,就是一个萝卜一个坑。哎,就这样的一个方式。得是一一对应的,那同时呢,你最好起名字的时候呢,是不是也最好呢,跟这个也能依次呢匹配上是吧,也方便呢,你去这个接下来去来拿着你这个读取到的这一行数据的这三个变量呢,去做相应的一些操作了,OK,这里边呢,要求就是咱们得有这个对应关系啊,如果说呢,我们这块呢,这个查询语句里边有三个,你这个因素里边呢,写了俩或者写了四个,他就会报错了。
09:09
啊,就这个意思。那么最后的话呢,我们还得需要去关闭游标啊,这个大家别丢了啊,还需要做这个油标的一个关闭哈,就相当于是你是不是打开过呀,那就open了,然后最后呢,是不是得对应一个close呀啊,这个别丢了啊,那这个原因是什么呢?就是因为这个游标啊,它会占用这个系统的资源啊,如果呢,你要不及时关闭的话呢,它只能是等到我们这个存储过程整体结束以后呢,才会做关闭,它会影响啊我们程序的一个运行效率。啊,或者再换句话说呢,就是我们这个游标的话呢,因为它是针对的是不是查询出来这个结果,它就这样一条一条一条你去取数据,他此时呢,会对我们这个表查出来这个数据呢,进行一个锁定,那你要是另外的一个。这个呢,其实应该是叫事物了啊,但是咱没有讲事故,咱说另外一个人吧,哎,另外一个人呢,他这块也要去查这些数据,那此时的话呢,由于我们当前这个科程呢,占用着呢,你现在这个人查呢,是不是它就得等待啊,哎,就是一个锁定它带来的一个弊端啊,所以说呢,对于我们这个并发量比较高的情况下呢,诶你要是必须要用这个科色,那你就一定要及时的把它做一个哎关闭处理。
10:16
啊,这个大家要注意一下,哎,Close一下啊OK,好这呢就是我们说的这个呃科使用的这四步骤啊,其实也还还好是吧,哎,就声明打开使用和关闭,OK,然后下边呢,我们就举个例子呢,来给大家做这个说明。好,首先的话呢,我们这块呢,先写一下啊,这是咱们的第六个点。嗯。这个呢,我们叫哎油标的一个,哎使用啊,哎叫科ER好,首先的话呢,咱们把刚才提到的这个油标使用的,哎,上面一开始我们讲的说为什么要用油标,对吧?哎这个咱们就过了啊来说一下这个油标使用的这几个步骤。哎,游标,哎使用的这个哎步骤,那是不是四个步骤啊,哎第一步的话呢,我们叫哎声明游标啊,Declare一下啊,然后第二个呢,我们叫打开游标,哎第三步骤呢,我们就呃具体的就是使用这个游标了。
11:10
啊,这个使用游标呢,肯定是我们最核心的了,对吧,它就相当于是从这个呃邮标中呢去呃获取呃数据两个过程,获取完以后呢,你看你到底要干什么,哎,这呢,实际上是我们这个代码量比较大的一块,然后接下来的话呢,使用完了,使用完了你是不是得关闭一下。啊,就跟大家呢,相当于网络中的一些资源,包括一些流资源也是一样啊,你使用完这些流之后呢,是不是也得关闭网络连接,或者关闭这些流资源是吧?哎,这些都是必要的啊,哎,我们也需要呢,手动的去做一个关闭啊游标这样的一个行为。好,这个呢,就咱们使用的这样的一个步骤啊,那么接下来的话呢,我们通过这个举例子的方式呢,看一看具体的该怎么去用啊,好的,那咱们这块呢,拿到这样的一个题目啊,CTRLC。哎,过来。啊,稍微有点长,然后把它呢。来截一截啊。
12:04
我们看一下这个问题说呢,创建一个存储过程啊,这个名字稍微有点长,然后等等等等等,好,那我们整个呢,先把这个框架呢,给大家搭建起来。哎,这么着是吧,然后这块呢,我们去create。啊。哎,Create,咱们现在是一个存储过程啊,Procedure。嗯。名字呢稍微有点长,来,我们把这个呢选中啊CTRLC一下啊,CTRLV一下,那么这个存储过程是做什么事呢?哎,实际上呢,咱那会儿呢,我稍微举例子的时候呢,说过这个事儿啊,就是咱们呢,把这个员工表当中的这个工资啊,咱们按照从高到低的顺序呢排列一下,排列完以后的话呢,诶我们呢,可以通过一个参数指定一下,这个叫上限。啊上线,比如我们就说到这个20万吧,是吧,然后呢,我们从咱们这个呃,员工这个表里边查出来这个数据不是一个到呃一个从高往低的这个顺序排的嘛,我们就取一个,然后呢,放到我们这个总的这个工资里边,哎,放在这里边,然后再取一个,就是用这个科去取的,再放到里边,再取一个啊再放到里边,然后呢,我们当这个值呢,超过这20万,20万的时候呢,咱们就停止。
13:15
啊就停止,然后同时呢,记录一下到底我们这个诶相当于获取过几个人啊,他们的这个工资呢,相当于超过这20万了,这就相当于涉及到我们得精确的是不是获取每一行的这个数据这样的一个行为了,是吧,哎,我们就需要用到这个科。同时的话呢,你也能看到我们取一条,再取一条,再取一条,实际上这里边儿是不是也涉及到一个循环的问题啊。啊,相当于把我们上面讲的那个流程控制,还得是再再练一练啊。好的,那我们这块呢,看咱该怎么弄啊。嗯,首先呢,提到有一个in的参数。那我们这块印一个参数叫什么名呢?这块已经给我们写好了啊,CTRL一下,这就咱们所说的这个叫上限啊。嗯,它是一个大型的。啊,逗号一下,然后再声明一个out性的参数啊,叫total。
14:03
这个count是吧,啊,这是一个int类型啊,它呢就是我们最终要记住你到底取了几个人啊这个意思。嗯,好了,然后这块呢,我们就直接一回来啊,一个begin啊,一个N的收尾,好好在这块呢,我们就写咱们整个这样的一个存储过程啊。好了,那下边这块呢,就是说你取一下这个最高的这个,呃,几个工资的薪资值,直到呢,这个薪资总和呢,达到这样一个上限了,哎,返回一下这个人数啊,就是返回给我们这个变量。好,嗯,这个完了以后呢,下边我们看具体该怎么去实现啊,在这个过程当中啊,我们说呀,需要去定义这个变量。比如我们刚才提到了,你得把这个工资呢,取出来放在一个,呃,累加的一个总和里边是吧,哎,这呢都是这个变量的声明,诶刚才呢,我们也提到了,咱得先声明这个变量啊,或者叫准确点是不是叫局部变量啊。啊OK啊,然后呢,我们再去就是涉及到声明,我们这叫有标吧,哎,OK啊好,那么这个局部变量的话呢,大家首先考虑一下,嗯,咱得声明几个呀,咱都需要声明什么呀。
15:08
嗯,这个呢,就是需要一些经验,哎,需要一些经验,像咱们刚才提到了,咱们需要呢,是不是拿一个边量记录一下,哎,比如说一开始这个是零是吧,然后呢,哎,先把第一个呢放进去啊,这个累加上啊,第二个呢再累加上,是不是得有个总和,所以我们这块呢,就declare一下,我叫some的一个。啊,SCL吧啊,这有个W型的是吧?哎,那么默认呢,Default啊,这个值呢,是不是零或者叫0.0也行。哎,这里需要一个它是吧。嗯,然后呢,然后还需要什么呀。咱们呢,是不是,哎,第一行把这个结果取出来,然后咱们不是有一个呢,叫做使用有标叫fech这个科,然后into到一个变量里边,哎,你是不是得把这个值呢放在一个变量里啊,所以这里边我们还得需要去啊,这个呢是咱先写上啊,它是用来去记录这个累加的。
16:00
哎,累加的这个叫哎工资总额吧。哎,就它是吧,好,那接下来我们是不是得获取每一行的每一个工资,然后把这个工资放在一个变量里边,我们得定一下这个变量啊,咱叫emp的一个啊SL吧,那这显然一个W型的,嗯,这个默认值的话呢,其实就不用定义了啊,因为咱直接取出来放进去是吧。这个我们说啊,它是来记录。呃,记录啊记录,咱叫每一个吧。每一个这个啊,员工的这个,哎工资啊,或者他说每一个啊,你叫某一个也行是吧,哎,某一个也行啊。好,还需要吗?啊,有同学说啊,好像不需要了啊,不需要那就往下写啊,你要写着写着发现呢缺了缺了你再回来补啊就行啊那实际上的话呢,我们这块呢,还缺一个啊,你像我们这块呢,跟咱们前面讲的那个,呃,循环的时候呢,这个类似啊,我们在这个位置呢,是来记录咱们这个总个数的,相当于对吧,来记录咱们总个数的,我们相当于在里边呢,你先计算一下你到底取了几个,然后把那个呢值最后付给他。
17:01
所以我们还得需要这样的变量,那我们这块呢,哎,就declare一下。呃,咱叫做EP的一个count吧,哎,它是个int类型的啊,这呢也得需要一个默认值,它的默认值呢,就是零呗,哎,这个是用来记录。啊,记录咱们相当于这个诶获取的啊,或者叫这个迭代的次数也行啊,或者要记录一下累加的人数。是吧,啊也可以啊行,那这呢,我们关于这个局变量呢,就写完了,先写它,然后再写我们这个邮标,好游标呢,我们也叫做declare是吧?嗯,咱们要声明一个员工的叫做科啊,你这样写全也行,或者写个这样也行,基本上都能看出来他是个科了。好,然后呢,是不是我们这个叫a cur for啊,哎,在咱们my circlele当中呢,叫for,在Oracle当中呢叫is啊,哎,这个注意一下。嗯,放什么呢?后边就是咱们具体的这个查询语句,哎,我们是select一下咱们的salary。诶,Select salary salary from我们的employees是吧,然后呢,这个哎,不是where了啊,Order by。
18:03
哎,这个别丢了,好BY呢,我们这个salary。然后de啊,这个别丢了,咱们呢,就是呃需要呢是不是呃从最高的这块呢去判断的啊,咱们此时呢,也可以先呢,把我们这个产品句呢,咱跑一下看一下啊走起。诶这块呢,就出来了,最高的工资呢,这是最高的吗?好咱们这啊这个这个这个表是吧,哎,这个注意一下,咱们是这个表啊,这个数据库啊,这个一点别的他这块就跑走了,这个数据库下我们跑一下。最高的呢,是这个三万多。哎,30度好,那么我们就从头往下呢,意思呢,往下去取就完了,哎先呢,相当于我们就是让这样的一个算是叫结果集是吧,哎,跟咱们对应的这个科呢,哎,去对应起来。好了,那么对应起来以后呢,这就相当于我们使用这个游标的第一个步骤呗,然后第二个步骤是什么来着。哎,是不是叫打开游标啊。诶打开游标,嗯,比较简单,就是open一下啊,我们具体的这个油标。
19:03
哎,这就妥了啊,然后第三个步骤的话呢,我们说叫使用游标吧。哎,使用有标啊,我们这叫fech是吧?哎,这个咱简单先写一下啊嗯。Fetch就是取的意思啊,取什么呀,我们EIP啊科啊,从这里边去取取数据,那其实这时候呢,就是你fe一次就是取一行数据了,咱们这时候呢,只有一个。字段是吧,所以我们就出到是不是一个变量里边这个变量呢,就是我们那会儿定义好的这个变量。啊就它啊哎,CTRLC一下,所以呢,F它出到我们这个变量里边。没有问题吧,哎,这块应该能看懂啊好,那我们这个取的话呢,是不是你取完一条以后,我们操作一下,然后一会又取一条再操作,一会取条再操作,是不是应该用循环来做呀。哎,应该用循环来做的,所以说我们这个使用游标呢,应该是放在循环当中的啊嗯,循环当中咱们前面讲过了,是叫loop well和repeat啊,好几个啊好几个啊,用哪个呢都可以啊。
20:02
用哪个都可以,嗯,我这块呢,比如用一下这个repeat吧,哎,大家下来呢,你也可以试着你换一换其他的这个循环结构,你去做一下啊好,那么这个repeat的话呢,我们接着就进去了。啊,我把这个呢往上拽一下。哎,这么着是吧。哎,这么着行,那repeat呢一进去,那我们此时呢,就先取一条数据。哎,取完这条数据以后呢,我们干什么事呢?是不是你要把这条数据呢,累加到我们现在的这个变量上呀,哎,所以接下来呢,我们就需要去set一下它是不是等于它本身再加上一下这个EPSCL是吧,所以这个时候你要注意,咱们上来呢,就拿着它本身去累加了,所以它这有默认值啊,你不能这个默认值不去写,这就不对了啊,这个是0.0的啊,没有问题,好,他那累加了还有一个事儿,你是不是你这块取一次,我们这块就应该记录一下你这个count呀。哎,所以这时候我们还得有一个啊去赛列,它呢,就等于你原有的这个值呢,加个一,哎,初始值呢,它是个零。嗯,这个呢,没有,是因为我们上面呢,已经从这里边取出来,出到它这里了啊,它就不需要一个所谓的默认值了。
21:04
这个过程呢,大家清楚吧。这个呢,就咱们说的,你使用游标,我们取出一条数据放在这变量里了,接下来你就拿着这个变量呢,去做的一系列的这个操作啊,整体的话呢,都算是咱们这个叫循环体的啊,那我们这块呢,是不是就有一个until啊。哎,Until在什么场景下,我们要退出咱当前这个repeat的循环呀,哎,你是不是最终呢,发现咱们这个叫sum这个SL呢,它大于等于了咱们传进来的这个参数啊。哎,是不是这意思,哎,注意哈,这个分号呢,是不是没有。啊,小心一点啊,这个呢是不要写的啊,然后接着呢,我们去摁一下咱们这个repeat啊就可以了。好,这呢,就是我们说整个这个循环结构啊,呃,使用游标啊,就到此结束,那这个一次次去取啊,这个有可能没取完,咱一共是107条取到呢,我们到这个情况满足的时候呢,我们这个呃,Repeat的这个循环结构呢,就结束了,结束以后的话呢,我这块需要做点什么事呢。
22:02
回忆一下。我们最终目的呢,是不是需要呢,是把这个变量呢给它,呃,记录这个呃相当于共取得这个个数啊,给它返回回去,所以我们需要呢,是不是把这个变量的值赋给我们这个变量啊好CTRLC一下,所以出来以后呢,我们需要呢,去set它呢,就等于咱们这个EP count了。没有问题吧,哎,这个呢,要注意一下啊好,那是不是就完事了呀。啊,如果你要认为完事的话,那你丢了个东西啊,咱们这游标说了是不是一定要关闭啊,哎,所以要关闭这个游标。OK,关闭怎么关闭啊,是不是close呀?哎,然后呢,把你这个咳色的名呢,哎往这一放,哎,这就妥了。好,那么至此的话呢,咱们整个这个存储过程呢,咱们就告一段落,来我们这时候呢,选中啊整个到这儿是吧,来我们选中了走一下。好,这就创建成功了,那创建成功以后的话呢,诶,我们这时候就可以去做一个调用。哎,调用啊,通过我们这个call呢,去实现一个调用啊,有点长CTRLC一下。
23:05
哎,这样啊,呃,这里边儿呢,我们需要传,相当于是两个值,第一个呢,就传进去的,你这个上限是多少。我们刚才看到了这个最高工资呢,是三万多是吧。把这个呢,再走一下,三万多两万多五万多行,咱们就来个20万吧。二十万一二三四好,这是20万,然后呢,我们接着呢,再有一个变量呢,去记录一下他的这个,呃,算是取了多少个人这样一个行为是吧,我用这样的一个符号呢,去做一个定义了,好然后接下来的话呢,当这个存储过程执行完以后呢,我们再去获取一下这个变量的值,那是不是就妥了。没问题是吧?好,那这时候我们选中集中人心的时刻啊,走起。好,11个人。啊很清楚,那相当于呢,我们取11个人的话呢,他们的工资呢,相当于上限呢,就超过了啊,就是总额的上限啊,就超过这个20万了。哎,这就我们说的这道问题,哎,这里边呢,大家去体会一下咱们这个油标的一个具体的使用。
24:00
啊,那么后边的话呢,凡是大家需要涉及到了。就是你发现呢,我们用一个select语句或者一个update语句啊,你搞不定了,需要呢,取出我们这个表中的具体细节的一条一条记录的,我们才可以去解决这个问题,那么此时的话呢,大家就考虑啊,用我们这个油标啊来解决就行啊。好,那游标这块我们就例子呢,就说到这儿了,下边有一个小结啊,说这游标呢,其实这块呢,就在说它的好处啊,我们能够实现的功能呢,就是逐条呢去读取数据啊,非常的方便啊,给我们提供了一个解决这样这个逐条取数据呢,然后进行一个细致的操作的这样的一个方案啊,这是它的好处,那么缺点是什么呢?诶我那会儿也提到了,咱们在使用邮编的过程当中啊,会对这个数据行呢进行加锁,所以呢,对于这个并发量的,呃,并发量比较大的这种场景下的话呢,由于你加锁了,是不是就导致其他并发的这个相当于是这个事物呢,它操作起来呢,是不是就影响这个效率了呀。这个而且呢,就是相当于会消耗这个系统的资源啊,那这块呢,大家如果你确实要用这个游标的话呢,尽可能的啊,是不是用完之后呢,一定要给它做一个关闭的处理啊,这一定要小心一点啊。
25:08
好啊,要养成用完之后呢,关闭的一个习惯。好,这呢是我们说的整个关于游标这个内容啊,嗯,至此的话呢,咱们这一章呢,相当于就算是结束了,最后这一块的话呢,我放了一个补充啊,放了一个补充,哎,大家呢,这块做一个了解就行,其实也非常简单啊,非常简单,就是叫全局变量的一个持久化。全局变量啊,大家还记不记得咱们啊,这个咱就首尾呼应一下啊,咱们一开始讲变量的时候,这跟这个游标没没关系了啊,这个你你跳出来啊,跳出来这个咱们一开始讲变量的时候呢,是不是提到过分为叫系统变量和用户变量,记得是吧?那系统变量里边呢,我们是不是又细分成说叫哎global的叫全局系统变量,还有这个叫session的,叫会画级的系统变量,对吧,那这块呢,他说的就是全局的这个系统变量。全局系统变证的持有化什么意思啊?嗯,大家你还记不记得咱们在一开始讲这个系统变量的时候呢,我当时说过一个点,就是关于这个global啊global你看呃,Global的这个系统变量是不是它不能够跨重启啊。
26:09
就是你一旦要重启一下咱们这个MYSQL服务器的话呢,是不是全局系统变量就失效了是吧。啊,如果你要想以前啊,如果咱们希望你要是重启以后呢,还能起效果,你怎么办呀,咱们是不是只能考虑把咱们的这个,呃,系统变量你是写到这个配置文件里边吧。就像咱们设置MYSQL5.7里边那个字符集一样是吧,你写到配置文件里边的时候呢,每次启动这个MYSQL服务器的话呢,它都需要去独立配置文件,哎这时候呢,就每次都是你这个,哎,你想指定的这个,哎这个这个变量的值了是吧?除此之外的话呢,你要是在运行过程当中去做的这个设置。不管呢,你是通过我们的呃,这种方式也好,还是通过这个这个session的方式也好,它这个确实设置成功了,但是呢,要是global的你一重启这个服务器呢,就失效了,这会画的呢,那更更惨是吧,绘画呢一段了以后呢,这个变量就失效了,现在我们想说能不能说让我们这个g logo呢,设置的这个呢,当我们重启服务器的时候还能有效。
27:04
哎,这就是说的一个持久化。啊说了半天,真正操作起来非常简单,原来呢,我们直接set一下,诶这个位,因为这块我没写global哈,这个其实呢,你可以去加上这个global的这样的一个声明,只不过呢,就是我们这个参数呢,它只有global的,它没有session的啊那相当于他这块先去session找没找着,然后最后设置其实还是global的啊,诶加没加呢,其实最终的效果是一样的。你比如这个原来呢,我们叫set global max connection connections是1000,然后现在的话,你只需要在前面加一个叫persist。啊,Process就是持久化的意思,你这样设置完以后的话呢,你你该重启,你重启没有关系啊,没有关系啊,你比如说我这个例子,咱们这块呢,查看一下这个默认的话呢,是151是吧,然后呢,我们通过这样方式设置完以后呢,呃,那按说呢,只对你当前这一次服务器的这个实例有效的,但我重启以后呢,发现还是这个。啊,为什么呀,因为我们加上这个参数以后呢,就把我们这个设置的global的这个,呃,系统变量呢,放到我们这样的一个文件夹里啊文件里了,当你下次呢,重启以后呢,服务器呢,还会从这个文件里边去读这个变量的值啊,就保证了我们这个值呢,相当于是一个持久化的了。
28:13
啊,非常简单啊,你就加上这样一个参数就可以了,大家呢,可以在实际开发场景当中啊,根据你的需要啊,你去加一下。啊,其实我觉得这个还是比较好的,对吧,现在你这个设置呢,就是持久性的是有效了,以前的话呢,我们这个服务器一旦你跑起来了,呃,这块你要设置的话呢,呃,这个这个只针对当前这一次服务有效,这个一旦服务器要宕机的话呢,下次是不是还得要做一堆的这个配置很麻烦是吧,现在再加一个persist就搞定了。啊,搞定了啊,行啊,应该能听得懂我在说什么啊好,那么至此的话呢,整个咱们关于这个第16章啊,咱们就告一段落啊,那么在我们的存储过程,哎,存储函数里边,哎,咱们说呀,还可以呢,去写变量啊,生命变量啊,使用流程控制,包括呢,我们还涉及到是不是那个异常程序的一个处理,对吧?哎,定义条件啊,定义处理程序啊,还有游标啊这块大家下来呢,多练一练啊。
我来说两句