00:01
异常处理。呃,一个优秀的程序都应该能够正确的处理各种通货异常,并尽可能的从错误中恢复。Oracle提供异常,嗯。来实现错误处理哈,异常处理exception这个词还是这个用来处理正常执行过程当中未预料的事件,哎,程序块的异常处理,它分为叫预定义的错误和自定义的错误。相当于相当于你还可以自定义一个异常啊,这就属于它预定义设置好的,就有一些异常的一些情况。由于PL块一旦产生异常而没有指出波,处理程序就会自动的终止运行。啊,自动的终止运行跟咱插号里边是一样的啊,它这里边儿有三种错误的,异常的错误啊,第一种叫预定义的。他预定了,预定义的大约有24个异常,然后这个时候它会自动的给你抛出来。嗯,抛出来,如果你要是不给他使用exception给他补货的话,那这异常他就到这儿执行完就终止了,如果你要补货,你就使用一个exception那边给他处理一下。
01:08
这跟Java是一样的啊,非预定义的异常,哎,就是其他标准的Oracle错误,就也是Oracle的指定的一个错误,但是这种呢,需要你把它这个错误跟你自己定义的一个错误这个名字给它连接起来。然后呢,哎,去捕获你自己静音的那个名。首先我们说的这俩分别怎么来写哈,用户定义的就是你想自己定义的异常。嗯,比如说我想。查询一下这个员工的工资,哎,想查这工资,如果说查到某个人工资,发现他低于2000。哎,那我就不过一场,然后就说,哎,这个人的工资太低了。就是工资太低,其实本身没有啥问题,但是呢,你就想只要你出现这个人的工资低于多少钱,我就让你抛一个异常。那就是你可以自定义一个异常,然后这个异常的这个格式。
02:02
在这个整个大的P块里边有一块叫exception。这里边儿写,哎,如何处理这异常,这呢,就是对应的这个异常的类型。当出现这个类型的时候,再如何处理?那你有多个异常,就是问问的,When others then。嗯,这处理的这个异常的方式,最后呢,N的结束,下边呢,就是对于呃,预定义的异常,他说有大约有24种对吧。常见的这一些这个异常的情况,有错误号回他错误的这个信息,那你要想捕获这个异常,那你就得是把这个啊,错误号是它自动会报出来的,你把这个内容放在这儿。是吧,比如说这个像哎noda他放着没有找到数据,哎你想更新它这里边儿一条,一个人的这个工资,结果没有找到一条数据,他就会抛一个1403的错误,你把这个问那给他放的赠,嗯,比如说打印一条说哎没有找到数据。
03:03
这就是他的处理啊。来,我们写一写啊,嗯。嗯,写什么,先写一个,它这里边儿呢,有个这个类型的。叫too many thoses是吧,输出的行数太多了,哎,那我就查询一下这样啊,这个there,我定一个we salary to表里的SALARY100分号cat。嗯,Select into在这。第二个它然后呢。嗯,不好意思,对,我先写个100。
04:07
就把100号这个员工的工资放到这个V-salary里,然后一一点打印。哎,反应一下这个下来正常考虑的异常这儿呢,这个程序。你写上这个也行啊,说嗯,Except,但是只是说现在我们不知道这里边有可能会出现什么意是吧,哎,When这个时候,然后then经到,哎,那我们先把这个注掉啊。先住掉,然后我们再考虑。OK,这个发现没问题,行啊。100号的员工的工资是24240。嗯,他的工资是这么多没有异常,那你就嗯没写这个啊,那当然你写多以后知道有可能出现什么异常,在这儿补,我怎么让它出现异常呢,我这改成大一。
05:11
这显然现在不是一个人的员工要这个这个这个。查询结果了哈,正常我们应该使用游标对吧?哎,你是多条记录了吗?我现在就直接把它放在它里边,这实际上是多条记录,那这个时候你再执行。来说,返回的实际返回的行数超出请求的行数。你就输入一行,输出这么多对应的,你看132过来。就是对应叫too many roads。这就是他错误的这个名字啊,就是它错误的一个标号,那我就得在我相应的except这里。重点问小Q。Learning roses then。
06:00
GBMS数的数分,那输出的函数太多了。就这样子啊。OK。哎,这不就执行了吗?相当于这个呢,你你就理解成它抛出来一个这样异常的一个对象,然后你看这个对象对应的类型。是这个类型的,你给他补货。嗯,如果你要不是这个类型,你就看这里边写,比如再写个when others then。是这样的是吧,怎么处理哈,你也可以给它补出来,When others。出现其他类型的意思。
07:12
这就是这个叫预定义的意思啊。行。Output加懒。这个就叫预定的异常,就是出现这个异常错误已经在这里有。比如预定义的啊,那我再写一个什么叫,诶非预定义的异常啊,非预定义的异常,你看它这个处理在这儿。对于非异定义的异常,哎,我得需要在这个P块里边declare这块声明一个这个异常的类型。然后呢,把它将你出现这个错误代码跟我这个异常的这个对象关联起来,使用这样一个语句。来使这个语句。诶,我们操作一个啊。叫做啥?我们会有这样的图啊,或使用so后语写一个delete delete from employees。
08:10
Where employ ID等于100。说违反完整性约束条件。这个这个这个删,知道为啥不能删吗。对你对你个外键哈,就是自己表里边儿有个manage ID manage ID就指向它自己的employd。你删除这个主键的时候,那个外键对那manager ID有人指向它。所以他不让你删,这个叫2292。报这个错是吧,那这里边儿有292。没有292是吧,没有292,那相当于不能用用的这个预定义的意思了吧,要是有的话,你直接是不是问这个就处理啊。
09:02
他现在没有这个错误的这个24种,那你只能自己来操作了。那你就得这样写declare。在这儿呢,你得自己定义这个异常。嗯,叫delete,嗯,Delete这个虽然是delete in ID啊,就写ID吧。是一个exception exception类型的。光这样写不行。你得使用这个语句。给它关联起来。还成不了吗?嗯。PRAGA。AI记不PM?
10:01
Ma啊。对是这样是吧,然后把你这个名一个C放在这儿,刚才出现那个错误号是2292。嗯。在这儿2292呢,对负2292。哎,这就这就写完了啊,然后呢,Delete,把我们刚才想删除的这个你放在这儿delete不好意思,WHERE1打好原删除,哎,它一删除的时候,它就怕这个错,然后我们只用exception。问。
11:00
当你出现这个异常的时候,对。说完了,违反违反整件约补条件。嗯,不,不可删除。看一下结束,嗯。哎,这就只要这个啊,他就不给你报这个错了。我再说一下这两个区别哈,第一种区别呢,就是我们刚才试图去查询一下salary这个工资是吧,结果发现我们查询那个函数过多了。
12:04
对应的这个错误,你就去这儿找。诶,发现这个对应的这个框里有,有的话,我们就可以用预定义的这个异常,哎,结果呢,有一些对于有一些错误,发现他报的这个号我在这个表里找不到,既然他这个号也给你报出来了,说明他这个Oracle已经定义的这个错误啊,他有这个错,那么我就把这个错跟我自己定的一个异常的名字关联起来。我可以定一个exception类型的一个,相当于错误的一个类型一样哈类型的一个变量,然后呢,让这个变量跟你错误这个编号关联起来,当你一旦执行这个语句,发现发生这个错误编号的时候,我会自动的让你转化成这个异常的一个变量。然后你这里就直接处理就完了。哎,这个叫非预定一的异常。非预定义的异常啊。那有预警异常,非用非预定异常,还有一个叫。
13:02
用户自定义的影响。呃,用户自定义的啊,用户定义的异常错误是通过显示的使用with的语句来出发的,当引发一个异常错误的时候,控制就会转向exception块的异常的错误部分,执行一个错误的代码。看看这个啊。嗯,这个你写的什么意思。这个这嗯,我写我们这样查询,还查询100号这员工的工资,如果他的工资大于1万,我就让他抛一个异场,说这个人的工资太高了。嗯,写个这个零啊,Declare。嗯,还得声明一个异常的变量,这个是必须的啊,负在salary in salary类型的,嗯。
14:04
还得定一个变量来选取调查的这个原因的通知。这样啊,然后。一遍。Select salary into这个salary from employees这个表,Where employee ID等于100。把100号员工那个工资拿出来,然后判断一下,如果me salary,它是大于1万的,Then then,那就处理啊,那怎么处理叫raise。
15:02
哎,就抛出一个异常,就抛这个。就抛这个意思,如果你要是呃小意吧的,那我就不给你处理了,我就直接摁的if结束。没了,嗯。执行一下。嗯,用户定义的异常数得到处理。忘了那exception了是吧,你往这边抛出来了,你这还没有处理的是吧。问,当你发生这个异常的时候,正Ms afterput.ut打印。对,相当于就指明你这个异常到底是干什么的哈,是吧,工资太高了。
16:02
就这样一个啊。哎,这个工资太高了。哎,这就叫用户自定义的异常。当你执行到一个语句的时候,需要让它抛异常了,我们在章号里边使用的叫through,哎,Throw一个异常,这呢叫with啊。嗯,意思也差不多,嗯,With也是要抛出一个异常,然后呢,异常怎么来处理,这相当于是那个cash的表示,是啊问这样这样处理。不行啊。这一个程序,这个过程当中,我们刚才定义这三个实际上是分开写的。你也可以给它合起来,这都没问题。哎,就是整个你放在一起的话,我们这儿是一个给它自动显示的,你也可以给他把这个刚才我们不是有一个删除的吗。删除的在这儿这样啊C。就是刚才这个。Delete的一个错误对吧,Delete这里边儿我定义的这两个,这个叫C。
17:10
预定义的异常,那你也给它放这儿。然后呢,这个执行一个delete,你说C,你就看谁先执行谁后执行的,放在这儿的话,你就delete先执行举delete如果没错的话,那就删了,有错的话就直行,有有错的话他就直接跑到这儿来了,后边儿这个就不执行了。那你在这儿需要指明你自己定义的这个如何处理。嗯,你也可以再加上一个when others在。从,这叫发生其他类型的意思。
18:07
然后就给它摁着能看懂吗。哎,就是这个程序这儿呢,相当于就是主程序来执行,执行的时候只要你执行到哪一块儿出现异常了,我就给你去这个session,我去找,那么后边这段代码就不再执行了。哎,你这个不是显然他有错吗?所以他就会只会抛。这个意思。后边这个呢,就因为你这块代码不会被执行,所以它也不会去跑出来啊这个意思啊。嗯。这是说的这个异常,嗯,异常后边这儿应该还有一些练习,我们就扫一扫看看啊,这三种异常的形式啊。那这个你看有一个说通过select into查询某人的工资,如果没找到,则输出未找到数据。未找到数据,你先这样看一下哈,来我们写这个题,这个你说它先是叫预定义啊,还是非预定义啊,这个也不好说是吧,不好说那你就先。
19:14
让他执行一下,他说让你那查询某人的工资,就看这个人有没有。我就那你这边还得带一下啊。一个salary。对,Select salary into,不好意思,Where I。
20:03
这样处理的话肯定没问题,这end肯定它就能找到。嗯,把找到这个数据给它打印一下。120人工的这个工资,哎,这22次这工这是他的工资,嗯,然后呢,你要输出一个,比如1001。显然,这个人不在。哎,说未找到数据,这不就出现了异常吗?Or re Oracle异常1403,你到这找找,你看有没有这个。有的话就是预定义的,没有就是给你给你给你自己去分预定义的是吧,1403就这个吧,有这个有这个那就好办了,那就是用预定义的。
21:00
现在给你好的。在这儿。问。你这写的什么?No,非常棒的是吧,Then?常识。就这样子。那那那就相当于是一个叫预定义的,因为它有有那个对应的那个异常的类型,你叫它是吧,没有的话,那你就自己造一个跟它已有的这个错误关联起来。那就可以了啊。后边儿。更新指定员工的工资,如果工资小于300加100。对于没有找到数据的。
22:01
还有这个输出行太多的进行一个处理。嗯。更新指定员工的工资。哎,如果工资小于300,指定员工的啊,工资小于300加100。这一写也得先定一个工资,然后把这个工资给他放到这里边儿,假设先有101几个人哈,放到这里边儿以后,然后呢,我判断一下这个VE salary,它是否是小于300的。哎,如果是小于300,则加100,没有then then的话加100,你是对salary加100,而不是对这个VE salary加100哈,那then的话相当得是一个中心操作吧。是吧,如果你这个人的工资小于300,我就update。主意思下一条。
23:02
Salary。等于salary加上100,然后呢?指定员工的吧。还是你上面那个101这个人,这是对于确实小100啊。诶。如果对于那给他放的就是你这个书,这个员工有可能不在,不在的话,你得是不得有个他是吧。还有可能说你这个写的salary ID不是等于是等个大于。那你这就得是。考虑到when who many Rose,然后我们处理。养猪。输的或者付出的,但可能会太多。
24:08
对,是这样处理的,对吧。这个更新的时候没啥问题啊,这应该不会出错。嗯,101,我们看这个啊,这个更新人在问题不大。这个给他。哎,这个其实你输不输无所谓的啊,不然加热它摁。哎,这就进行成了,那说明这没有异常,这个人也在加个零。这人不不在了吗?唱些。啊,就就这意思啊。然后。处理非预定义的异常,非预定义的嗯,较违反完整接触,这个我们经上写过了啊,删除一个人。
25:02
那报这个2292这个异常跟他关联起来,嗯,然后在这儿问的时候接收。不是。自定义异常,这又一个啊,指定员更新,指定员工的工资加100,这不存在输出这个。若该员工不存在,则超出用户自定义。它的使用叫用户自定义的是吧。正常这个员工不存在的话,我们直接使用那个叫他found就可以了,是吧。他要想用用户自定义的也行。咋写,你看这个啊。Update set salary加上100,当那个工资是,哎,当那个employ是它的时候,哎,它这使用叫也是有变化,因为这就一条数据,我判断这条数据是否在。哎,如果不在的话,我给你一个异常,这个对象是我自定义的。嗯,然后这样可以借出处理的方式啊,就是看一下就行,你说C。
26:04
嗯。自定义啊。更新失败,那就意味着他执行了这个语义了。呃,意味这里面reach出了,意味这没有找到,因为这个原因。嗯。这是我们讲的这个叫异常啊异常,那后边呢,关键我们写这个存储函数跟存储过程当中有时候会出现异常,出现异常的话,你在指定的。位置上,在这个begin跟N之间写上这个异常如何处理?如果你要自定义的话,在迪尔这边再声明一下就行了。
我来说两句