00:00
哎,这啊,存储函数和存储过程啊,说Oracle提供可以把PLSQL程序存储在数据库当中,哎,并可以在任何地方来运行它,这样就叫做存储过程或者函数。哎,意思呢,就是说白了啊,就是你之前写的这些什么select呀,什么update呀,这些东西存不起来,我想把这些一些操作给它存储起来,作为像表啊,或者是什么视图这样的这种结构式的啊,当然它不是数据库对象啊,数据对象说是table啊,是view啊,是这个sequence啊,这里不叫对象了,但是呢,它也能够存储起来。像function,对,这就是存储的是吧,这是系统提供的,你也可以看你自己创建的function。你之前写过这个,我们可以删掉它。这呢说明它确确实实存在,哎,还包括你像这个孵发器,发器是这里没有,没有那就是没创建,哎,当你创建个函数或存储过程的时候,这就能够保存下来,当你什么时候想调用,你就给它调用就完了,哎,触发器哎,当你想对哪个表进行什么操作的时候,我就自动的让你触发一个。
01:11
也是类似于一个函数的东西啊,只不过这个时候就要触发器了,自动的触发它。嗯,就是这样。它可以被保存起来的啊。过程和函数的唯一区别就是函数总是向调用者返回数据,而过程不返回数据,相当于一个有返回值,一个没有。函数是有的啊,过程是没有的。创建一个函数怎么来创建the create or replace function?跟前边写的那个什么视图啊,什么都一样啊。哎,然后这个方程的名,哎,如果有参数的话,在后边写上它这个整个的参数类型啊,这是相当于是一个小括号是你这个方涉及到了一个行参的一样啊。哎,行参就写到这里边,先写个参数名,再写参数类型,这呢,注意不需要指定这个参数的大小了,仅仅是指定类型就行这个参数的,哎,这个行参,呃,什么时候来给你这个填进去啊,就是你通过这个declare语句,就是我们之前。
02:15
今天上午和下午一直讲的declare begin,在begin里边,你调用这个函数的时候,指指明你这个参数是什么啊。Return,就是紧接着写上你这个,哎,存储函数的返回值类型。然后呢,哎,这个叫is是吧,有个ISIS这里边操作的,你可以把它假想成你这个。嗯,把它加成这个declare哈,就是你这个函数在整个使用过程当中,如果你要需要定义一些变量,你就定义到这儿。呃,再就是你这个函数的一个执行体,呃,如果有异常的话,给它处理就异常,最后给它摁的。我先给你写一个这个结构啊,函数的结构。存储函数,哎,这个结构怎么写它这就是create哦,诶,Please function几个function名,Function,我就这写function name,然后括号写上你这个。
03:20
参数的类型啊。参数类型,嗯。比如说哈,嗯,这个ID number类型的逗号。我的name。比如你想查指定表当中的这个这个ID,这个ID这个名字的那个人等等的哈,或者你再想查一下这个,哎,这个ID他的工资。Salary也是那类型的,往这放。嗯,这里边儿又又具体分啊,还有那个后面讲叫out啊,我们有说到这再说,这是定义这个函数,然后它return返回值类型。
04:02
嗯,假设你想返回。嗯,这个不写这个D了,写这个吧,就写第1PPID,我返回指定这个部门的所有的工资是吧?呃,指定部门可能有很多人,这些所有人的工资,那就return也是一个工资类型啊,也是工资,工资呢是number类型的,你就返回number类型的。然后is,你在这个过程当中,是不是需要你涉及到哎,再定义一些变量,如果需要的话,你写在这个is这一块啊,这就是定义的,就是函数的使用过程中需要定义。哎呀,需要声明的变量,哎,或者叫记录类型都写上。嗯,生命的变量,技术类型,甚至还可以是什么呀。游标吧,哎,游标都写在这儿,然后呢,一定开始这是方法的这个执行啊。
05:06
哎,函数来执行题,这个过程当中可能出现一些异常,考虑异常的处理。处理函数执行中的异常,处理完了以后,最后给他摁的。这是一个深入函数,就这样一个过程啊,这呢相当于那个declare,我们写一个PRS的时候。这是declare begin section end啊,你把它理解成是一个declare一样。那就声明这个函数过程当中,使用过程中需要用到的这些变量。啊,这是这个,哎,函数的一个行参。
06:01
嗯,这样创建好以后,它会这就有这个了,有了这个方式以后我就可以用。嗯,整个这个大概形式是这样啊,然后我们看一个例题。哎,写个最简单的说函数叫hello word,返回一个hello word字符串,这就是这个函数的作用。哎,函数的ho word,就当我一调这个函数,它就给打回一个ho word,看这怎么写哈,Create or replace function姓ing,这个就叫hello hello word。哎,这个函数没有形参是吧。那现在就不写了,哎,先return返回,Hello word是个字符串,差不不用写那个什么哈,不用写这个分号。
07:03
也不用写你这个大小。意思声明。也不用说明吧,直接比面打印。打印。就是打印的就是turn是吧,返回嘛,这是你这个函数的这个执行体,执行体最后结果,因为你这函数是要有返回值的,那我就在这给你返回没有异常,那我就直接摁的解释。这是一个最简单的一个存储函数啊。创建了,创建以后你在这看。这就是hello。哎,这个调用的时候怎么调,我们使用这个哈,你就正常的写declare什么什么什么这呢也不用declare,直接begin。
08:07
BB Ms out点看,那再用一下你这个word这个函数N。这不出来了。或者你在这用这个拉克语句也行啊拉。Hello,我。好吧。也行啊,这就是具体调用这个函数了哈。哎,就是这个例子啊,然后我们给它写的复杂一点,给这个函数带上一个参数。带上个参数哈,一带个参数什么参数啊,哎,加上一个字母串一个logo。
09:02
它是一个多差数类型的,大小不用写。返回它是个water to。然后一。呃,这是声明是吧,声明呢,可以写到这儿也行,变量的声明啊,这这不需要变量声明。这个变量已经有了,不用声明begin OK,这个we logo它一下值行。嗯,就或者这也不用补是吧,从参的付了啊,直接return是。这这我定义了一个行参,相当于啊,然后呢,补到这。看见好了,然后这个调用,其他的话就这样写,Hello word1。
10:08
有个参数差型的它。这样。那这是用于select,你要是想用这个PL这个执行的话,那你就这样。等一下。都行啊,这两种执行方式都可以,一种呢,使用PL这个程序的形式。一种呢,直接select的形式。
11:01
关键是你你要会写这个啊。哎,这个格式。嗯。创建一个函数,函数名。哎,函数是不是需要参数,需要的话就写上一个参数,参数的话只需要指明这个类型就行,没有大小。函数一定是有返回值的,所以一定会有return一个东西。然后这个函数在使用过程中是否需要声明一些变量,相当于这个哎,Java里边在方法里边的那个局部变量。写在这个意思跟底面之间。你也可以把它理解成declare啊,我们之前写的declare跟比例之间写的东西都可以写在这。一定你这个函数具体执行的这个函数体,它的结束。啊,就这样几部分,你看这你也可以加上一个输出语句。
12:01
函数对吧,要。我这是一个or replace就把刚才那个给它替换了啊。你在哪?出来。哎,它就能执行啊,就相当于他执行那个函数体呗。你这个船子它就给你在这放进来了,跟你那个讲沙发里边那个形态一样,形态你这生成一个值,调这个方法的时候,传一个值,你这里边就能够调用你传给这个值。就这意思是吧。嗯。对这个这个你看这个返回的这个顺序哈,它是先输出的这个是吧,再打印的这个,因为这个是有返回值的,所以它select实际上是先拿到你这个返回值,然后呢,这个返回值拿到完了以后,我们这过程中有这个,你这要这样写的话。
13:17
啊,或者说有两种执行方式呢。另一种面。你看这种格式啊。这个是先输出的这个吧。这个是因为打印它就按照你执行的顺序来了,哎,你先出的那个函数定义的时候先它作为啊,这这这你了解一下就行啊,这个这应该不是主要的重点,重点呢就是你怎么来定义一个这个函数。
14:13
嗯,这就函数题。哎,就这样啊,然后我们看别的例题。输出一个hello word的一个字符串,然后呢,哎,输出一个大二字五呢,这个是由参数直行的时候输入的,所以是有一个平参。创建一个存储函数,返回当前的系统时间。这个嗯。创建一个深度函数,返回当前的系统时间,当你解这函数,它就把当前时间给输入出来了,这就这个函数的作用。来吧,Great function。Get state就是它的这个函数名。
15:04
参数用不用。不用,Return是一个date类型的吧,然后is需要声明变量吗?声明的也行,你声明下是这样,We data,这个data类型的,这需要啊,这个data本身不需要。指明这个大小啊B近,嗯,可以可以这样写啊,贝塔冒号等于C贝把CD付给它,然后呢,没事。对,没有异常不变的这样写。哎,成了啊,然后呢,你在这执行一个select。评价啥来着?
16:05
再就是这这个输出来,我是调用的函数,而不是调用你那个star c啊。嗯,那这个我们就就写好了啊,看看别的。定义带参数的函数,两个数相加。定义在参数的函数有参数而已,为replace function。A的是吧,嗯,A就是就是相加的一个相加参数,让参数相加这个方法。嗯,进行一个第一杠NUMBER1 number类型的一杠NUMBER2,还是这个类型,不需要指定大小了啊return返回number类型的意思,需要再声明一个变量,不不需要对吧。
17:17
上。计算他们的活嘛,Number类型的。这个需要指明,这个不需要吧,你几declare的时候是不是得需要。所以说这时候也需要最多给你肯定十个,然后一定一定就是具体执行了。那么一加上NUMBER2。对吧,结束。
18:01
看好了。就这个来运行一下。下面。在这也行,你要是不用其他的用这个。嗯。这就使用这个PR块的形式啊,执行这个函数。也行是吧。都可以啊,嗯,就是这个,然后。
19:02
这个稍微有点有点难度了。哎,看这咋写这一个函数。获取给定部门的工资总和要求部门号定义为参数,工资总额定义为返回值。这个部门人不止一个,哎,返回总额肯定需要你把一个人一个人一个人的工资给他加起来,或者说再准确点说,所有人都得把工资便利一点,这用个啥呀。对,得用游标吧,然后游标你是还得用那个循环得给它去取的,这就是把刚才前面讲的给它结合起来了,方。嗯,Get。
20:00
嗯,他跟你说了,让你把部门号定为参数DEP ID number类型的。没了对吧,返回值类型。Number is。需不需要声明一个变量,显然需要。声明这个some工资是吧,Some salary。它是一个number类型的,这需要指明这的。十应该能停下啊。正号结束,嗯,然后笔记方法题怎么来写啊,或者说我们这时候现在再往下写,从这开始。就像是写一个PLSQL的那个程序了。什么declare啊,Begin啊什么什么的,只不过这个需要你返回值,你把最后那个它给返回出来就完了是吧。
21:02
怎么求指定部门所有的和。使用一个游标,游标是不是也得写在。当时叫几克二零,那你这个就写这呗。Select employ where department ID等于。给你声明的这个。指定这个部门的。这个人的工资。哎,科给他创建完以后,你进这边就得open是吧。或者我要是用一个for是不是简单呀。For,进一个C吧,In。
22:02
嗯,然后呢。哎,取到一个了,通过C点三六就取到了啊,取到以后我们给它,嗯,哎,是不是让它加到这个这个里边是吧,这点下。这个你就要给他先指定个值,让他一看这个值是零对吧。然后呢,给他负责他,然后给了他给他。嗯,已经完了,真的。没事,这有标的不用关了啊。反馈过的。
23:04
太幸福了,好,写了好几个,没错是吧?嗯。Get salary来算一个。少部门的。哎,这么多。嗯,取这么多钱,你要给他在这儿用也行。就是BBBMS。这样是吧。或者你要想起的。大点,比如说。
24:06
嗯。80,然后把这个分这。这样的。放。也行是吧,就执行起来简单是吧,主要你这个分组函数怎么去写。来,再往下看这个。这个有一个out啊。有了out,这个有点意思了,这跟我们以前理解这个函数有点不一样。我们说函数哈,从那个初中大学讲,函数第一定自变量可以有多个,但函数这个这个函数值或者叫因变量永远只有一个。这样才叫函数是吧,哎,这个为什么要定一个out型的参数,你看哎,因为我们知道这个函这个函数哈,Return永远都return一个,但是我又想在这个执行过程当中,除了让你比如说这个除了让你返回这个部门的。
25:14
诶,工资总额之外哈,我还想让你反馈点别的。比如说像这个哈,除了让你返回你这个给定部门的工资总额之外,我还想看看这个部门有多少员工。那你这个一个函数相当于是不是出来两个返回值啊。一个是指定部门的工资总额,一个是该部门的员工总数,嗯,你要是编成两个方式,那好过。那就让编成一个里边怎么去做。哎,这就要使用一个al型的一个参数啊。凹进一个参数,这个参数怎么用。我们就以他举例说一下,在这个里边也有一些说明。就是out是吧,In是我默认,你只要不写的话,它就默认是in啊,比如说这个in,它说参数标记表示传递给函数的值在该函数平行中不改变。
26:11
你像我们刚才写的这个80号部门,这个80就是你在这个执行的过程当中,只要你用到了这个。哎,只要你用到这个变量呢,它都是80。对吧,然后后边这个。哎,Out标记的表示一个值在函数中进行计算,并通过该函数传递给调用语句。这个变量需要你在函数执行之前先给它定义一下,然后这个值是可以被改变的。嗯,啊,是可以不被改变的。哎,我们就写一个这个例子,就以。这个为例。对,就是这个哈。定义一个函数,然后获取给定部门的工资总额和该部门的员工总数,哎,把这个呀定义成一个out型的参数。
27:05
部门号为定义,呃,部门号定义为参数。工资总额作为返回值。给你一些要求哈,你说C。看看这个我们怎么写这个要比它要难一些啊。那个啊。嗯,定一个函数,给定部门的工资总额和它,那你除了给他,除了你把它当成一个参数之外,还得给一个人数是吧,偷偷看看。总人数也是一个number类型的。然后呢,为了表明它不是这个参数,你要这样写的话,你调用这个函数需要返回两,那需要指定两个参数,这不是参数,这个也是一个返回值,但是不是return出来的返回啊,顺便记住了一个加一个out。
28:06
在这个位置。这个我重指一个名get salary1返回这个number是工资总额。一。风总啊,定为零。然后呢,哎,褐色还是去这样指向它。这你得需要指明一下,你这个total看看出一个值一开始没有是零。啊,所以说它的值可以改变嘛,对吧,估值为零。For,它因它这个是给他把工资累加起来,同时让他呢。能看懂哈。
29:01
累加呗,然后关返回一下,还是返回这个。工资总额是吧,返回这个工资总额,然后呢,这个变量就在你整个试图去计算这个部门的工资总额的功能当中,在不知不觉的把这个值给它记录了一下。那么这个值相当于就给记入到了啊,然后给它摁结束执行完了。怎么用这个啊。多了一个这个啊,怎么用啊。Declare。嗯,我定一个变量,这这样number吧。一定我在这里,BDMS。
30:03
加五的。调用这个函数下面SL1括号。嗯。前面一个指定部门号,80号部门的。后边一个那个变量是啊,你顺便记录一下它的那个值,我就让它去记住,说C这个值呢,你也可以给它输一个值写。行,然后放在这这这个啊,这个打印的结果就是你的这个反馈值80号部门工资,但是呢,他顺便把我这个值给记录下来了,那我就这个时候打印一下我这个值的结果是多少。就这。
31:02
这是工资总额,这是工资总人数。哎,这个就是这里边讲这个al这个变量怎么用啊,正常我们讲一个函数就一个反回值,这同样也是一个,只是说哎,我还想你在这个运算过程中,顺便给我再算一个值,相当于其实也是一个因变量吧,只是不是让它直接返回的。嗯,这个因变量呢,是在这个过程当中被负的值。然后被记录下来了,我可以通过这种方式,当你去执行这个返回总工资的时候,把这个值给改变了,最后把它输出结果。嗯,在后边呢。这就是存储过程啊,哎,大家你先把我讲的这几个存储函数的。看一看存储过程,就是没有反回值,使它简单。25。从。从这二二十二点一,从这开始到25,你把这几个先看一看。
32:01
好,我们接着往后讲讲啊,行没有记住了啊,刚才我们讲的这都是存储函数,函数是有返回值的,你把这个格式给大家记住它啊,就是在这里笔记里都有吗。这个函数的格式,函数格式有了,你下去拿几个练习给它往里套呗,就完了是吧,之后这个过程呢,因为反为值了,这不叫方程了。Procedure是吧,这是过程啊。加上搜狗这个屁股就是格C就的意思吗?所以这是面向过程的一啊嗯,26个题,第一个第一个存储过程,给定部门的工资总,哎,获取给定部门的工资总和,然后要求部门号和工资总额定义为参数,那就这样形式,我们那会写的时候,让那个工资总额当成一个返回值了。
33:03
是吧,就这个24题吧,哎,我总了,然后它进行参数,这个图为反回值,这个呢用存储过程写,没有返回值啊,所以你只能是用一个al吧。得用out来写哈,写写这个写错C。这个。Get salary这个。刚才那个没有那个粘过来和C。红开的温度,开温度需要我这样就行。这是刚才写的那个存储函数,然后现在让你写一个存储过程。给定部门的工资总额获取它,然后create or replace和。
34:09
嗯,然后GET2吧。哎,这叫部门号,这是作为一个参数,同时呢,那个工资总额some salary。这个out型的也是number类型。嗯,没有return呢。意思嗯,那你这个就也不用再定义了是吧,然后可这样存,那取他这个工资,然后呢,呃,在这个位置的时候给你这个。三估个值零。是不是意思给他添加进去。添加进去以后,你在在这儿报循环完了以后,这也不叫return。
35:10
End,结束。哎,创建好了,创建好以后调用一下啊。嗯,交易一下。在这写下,看在这在这写孟思涵不靠谱,就。是吧?因为你那个不是需要传一个变量吗。啊,那个82部门后边你是不是还得写个变量。那你就得在加后写。CLA we s number类型的。
36:01
嗯,十个应该够用,冒号等于这个数化值定。啊。嗯,80号部门的把它放进去。结束。这是直接这。这样是吧,是不是就是这个范回的工资总的嘛,因为它没有返回值的,所以就不用你再这个set了,这跟我们账号里边那个函数,如果你是Y的,一般里面都有set out了。你家到时再给再给他用C套,再套一层就就就错了是吧,直接让他打印就可以了,这就打印出80号部门的工总额就这么多,这就是一个存储过程。
37:07
你要函数,刚才搞清楚了这个存储过程。我觉得是比较简单的是吧,把这个改一改,没有return呢,这里边也不要有return,一般的话里边都会有一个输出语句,就这样。或者呢,你也不一定非得是复出了,也有可能是一个增删改的一个过程,因为增删改是不需要返回的,对吧。增删改不需要返回,所以你可以把增删改的操作定义成一个存储过程。嗯,你看下边这个题目。自定义一个存储过程,完成以下操作,对于给定部门,把它作为一个参数输入,相当于是对指定部门进行操作加薪。哎,这个部门里边员工还有这个的时间,在不同的时间段给他加薪不同的额度。哎,既然没有返回值,如果你要是需要一些返回的情况,必须得用alt来声明一下。
38:01
他这也确实需要,诶让你判断一下诶,这个部门一个月需要额外支付多少成本,因为每个人都加薪的呢,需要额外支付多少钱。哎,咱们看看这个题怎么做啊。Great is see,嗯。嘉兴爱的。嗯,行,没有艾特salary啊,行,就用这个艾特salary加心,然后需要往里边。北京部门g t number类型的逗号。还得判断你需要额外支付多少钱。这个。
39:00
作为一个out型的参数。嗯,额外支付多少钱。看到了。需要支付这么多钱,然后它也是number类型的,没有return的这些意思,需不需要额外再定一个变量?嗯。哎,这这科是不是得写这。你们一个部门有很多人啊,是吧?得定个科吧,哎,科,让他去便利一下哈,科,嗯,Salary科,Is select。你到底需要都查什么?Employee,然后where,你判断ID等于de PT ID,这样吧,这都需要查什么?嗯,看你都需要什么呗。
40:01
这有个her date时间吧。这个一般一般应该是需要的,然后加薪,这还让你说需要额外付出多少,付出多少跟你这个谁多少钱乘以这个5%有关系,所以salary也得用。而且一般的这个引employ ID也用,我们先写几个,不对的话再改employ e ID。Salary,然后再加上这个二,我先取这三个变量,从这表当中。嗯,然后你再想还需不需要进行别的变量。这是不是有个加薪,我说这是一个相当于加的一个东西是吧,你可以给不同的人给它定义都负一个变量,一个变量值,一个是0.03 0.01 0.01,那我这定义一个变量啊V-I吧,三类型的两个小数先赋值为零。就是用来记录这个东西的哈。
41:01
嗯,差不多,然后直接比对了,比面拿操作放。用for,省得你open跟这个赛和close了啊。C in。你说C下循环。循环,然后呢。得判断一下这个hard是吧。不同的给它负的这个值是不一样的。哎,那就if,如果C的,哎,Target是在这个时间段之内的,这个怎么写啊。按说就是这个这个让它去小于这个这个这么一个时间,这就涉及到了一个叫字符串跟。跟这个一个转化是吧。那我就这一下吧,不啊,前面是个date型的。
42:09
嗯嗯。来来来来,哎,这个如果它是小于1995。期间那这个是一个开的那个不含九五。按说字符串之间是不可以比大小的。但如果你字符串是纯数字的话,它有一个隐式转化。吧。隐式转化就纯数字,呃,纯数字的字符串可以隐式转化,也可以比大小啊,当然这不也可以做加减嘛。嗯,如果是这样的话,正。为其加薪5%,那我就用这个V-I记录一下。你加心的幅度就这意思哈,21。
43:05
19980.03。嗯,其其余的一个太好是。要是直接了,那不用。就这,然后呢,这是if记着N的意思。嗯,摁的衣服完了,这呢,还是这一个人,我得给这个人给他更新一下他的。工资一,这下边操作一分工资啊,你得需要返回一个,需要公司付出多少成本的。
44:00
那你付出成本这个东西你也得给他给计算了哈,付出的成本OK,假如我们先看这个啊,付出的成本,一开始这个成本在这儿呢,这个成本还没有给赋值,所以你在这给他一个赋值,看看漫画单。付出的成本看看。嗯,冒号等于看加上。嗯,加上应该是。嗯,C的salary乘以V-A。对吧。这不额外多的吗?关新工资更新工资update。不好意思。Salary等于salary乘以。
45:03
一加上B-Y一方1ID等于C点高压力对吧。是不是你这个通过C获取到的这个employd对应这个人的。工资给他加上一,哎,通过这个得到的这个微杠癌。了。操作完以后,N的假设我们这里不处理异常了哈。差不多运行一下看看。符号的问题。
46:10
还有。这个词好像被占用了。嗯。用到他的地给他改。就这几个地啊。可以。不能啊,忘了加了是吧。我,我把你们能犯的错误犯了很多。好了,对,好长时间一放嘛,它就容易忘,这个东西创建好以后,然后呢是行的。
47:07
执行执行的时候放一个它这个需要你填的,这样呢,你进一个变量让他去接收的OK。可以进来啊,你说A,删掉declare,定一个变量V杠答应来记录一下到底公司需要花多少钱。Number类型的十个单位先冒号0BEGIN。嗯。ADD salary。大傻的。然后呢,第方看。他这种各样的鞋。这啥呀,这个忘了把这个给输出一下,你不要看到底需要花多少钱吗?我把你这个需要花的看看S给你输出一下。
48:15
好,然后再过来你去进行对比。对吧。这就是公司需要额外支付的钱,6400多啊。这就叫存储过程。我觉得存储过程比存储函数要简单啊。你把存储函数。理解理解这个呢,改一改就完事啊。这是存储过程,存储过程就搞定了。
我来说两句