资源描述
,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,#,/31,Master title style,Edit:JinYF Ver:1.0,1,/31,Edit:JinYF Ver:1.0,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Master title style,snownightsCopyRight,snownightsCopyRight,Oracle PL/SQL,第四章,2/31,本章内,容,容安排,4.1PL/SQL简介,4.2PL/SQL语法,4.3存储过,程,程,4.4触发器,4.5游标,4.6包,4.7函数,3/31,4.1PL/SQL简,介,介,4.1,.,.1PL,/,/SQL特点,4.1,.,.2开发及,运,运行环,境,境,4/31,1.PL/SQL的优点,(1)PL/SQL是一种,高,高性能,的,的基于,事,事务处,理,理的语,言,言,能,运,运行在,任,任何Oracle环境中,,,,支持,所,所有数,据,据处理,命,命令。,通,通过使,用,用PL/SQL程序单,元,元处理SQL的数据,定,定义和,数,数据控,制,制元素,。,。,(2)PL/SQL支持所,有,有SQL数据类,型,型和所,有,有SQL函数,,同,同时支,持,持所有Oracle对象类,型,型。,(3)PL/SQL块可以,被,被命名,和,和存储,在,在Oracle服务器,中,中,同,时,时也能,被,被其他,的,的PL/SQL程序或SQL命令调,用,用,任,何,何客户/服务器,工,工具都,能,能访问PL/SQL程序,,具,具有很,好,好的可,重,重用性,。,。,(4)可以,使,使用Oracle数据工,具,具管理,存,存储在,服,服务器,中,中的PL/SQL程序的,安,安全性,。,。可以,授,授权或,撤,撤销数,据,据库其,他,他用户,访,访问PL/SQL程序的,能,能力。,(5)PL/SQL代码可,以,以使用,任,任何ASCII文本编,辑,辑器编,写,写,所,以,以对任,何,何Oracle能够运,行,行的操,作,作系统,都,都是非,常,常便利,的,的。,4.1,.,.1PL,/,/SQL特点,5/31,2.PL/SQL的缺点,对于SQL,Oracle必须在,同,同一时,间,间处理,每,每一条SQL语句,,在,在网络,环,环境下,这,这就意,味,味作每,一,一个独,立,立的调,用,用都必,须,须被oracle服务器,处,处理,,这,这就占,用,用大量,的,的服务,器,器时间,,,,同时,导,导致网,络,络拥挤,。,。而PL/SQL是以整,个,个语句,块,块发给,服,服务器,,,,这就,降,降低了,网,网络拥,挤,挤。,6/31,服务器,端,端PL/SQL不需要,显,显式的,安,安装或,许,许可。,它,它是Oracle9i数据库,的,的隐式,部,部分,,此,此处有,相,相应的,文,文档。,PL/SQL编译器,和,和解释,器,器也嵌,入,入到OracleDeveloper中,为,开,开发者,在,在客户,端,端和服,务,务器端,提,提供一,致,致的、,可,可利用,的,的开发,模,模型。,4.1,.,.2开发及,运,运行环,境,境,7/31,4.2,.,.2常量与,变,变量,4.2,.,.3数据类,型,型,4.2,.,.4运算符,4.2,.,.1PL,/,/SQL块,4.2,.,.5流程控,制,制,4.2,.,.6异常处,理,理,4.2PL/SQL语法,8/31,1块,结,结构,2、块的,命,命名和,匿,匿名,3、块的,执,执行,4.2,.,.1PL,/,/SQL块,9/31,1.块结构,PL/SQL是一种,块,块结构,的,的语言,,,,组成PL/SQL程序的,单,单元是,逻,逻辑块,,,,一个PL/SQL程序包,含,含了一,个,个或多,个,个逻辑,块,块,每,个,个块都,可,可以划,分,分为三,个,个部分,。,。,(1)块的,三,三个部,分,分,声明,部,部分(Declarationsection),声明部,分,分包含,了,了变量,和,和常量,的,的数据,类,类型和,初,初始值,。,。这个,部,部分是,由,由关键,字,字DECLARE开始,,如,如果不,需,需要声,明,明变量,或,或常量,,,,那么,可,可以忽,略,略这一,部,部分。,执行,部,部分(Executable section),执行部,分,分是PL/SQL块中的,指,指令部,分,分,由,关,关键字BEGIN开始,,所,所有的,可,可执行,语,语句都,放,放在这,一,一部分,,,,其他,的,的PL/SQL块也可,以,以放在,这,这一部,分,分。,异常,处,处理部,分,分(Exceptionsection),这一部,分,分是可,选,选的,,在,在这一,部,部分中,处,处理异,常,常或错,误,误,对,异,异常处,理,理的详,细,细讨论,在,在后面,进,进行。,10/31,(2)PL/SQL块语法,PL/SQL块语法,结,结构如,下,下:,DECLARE,declarationstatements,BEGIN,executable statements,EXCEPTION,exceptionstatements,END,PL/SQL块中的,每,每一条,语,语句都,必,必须以,分,分号结,束,束,SQL语句可,以,以多行,,,,但分,号,号表示,该,该语句,的,的结束,。,。一行,中,中可以,有,有多条SQL语句,,他,他们之,间,间以分,号,号分隔,。,。每一,个,个PL/SQL块由BEGIN或DECLARE开始,,以,以END结束。,注,注释由-标示。,11/31,2块的,命,命名和,匿,匿名,PL/SQL程序块,可,可以是,一,一个命,名,名的程,序,序块也,可,可以是,一,一个匿,名,名程序,块,块,匿,名,名程序,块,块可以,用,用在服,务,务器端,也,也可以,用,用在客,户,户端。,执行部,分,分包含,了,了所有,的,的语句,和,和表达,式,式,执,行,行部分,以,以关键,字,字BEGIN开始,,以,以关键,字,字EXCEPTION结束,,如,如果EXCEPTION不存在,,,,那么,将,将以关,键,键字END结束。,分,分号分,隔,隔每一,条,条语句,,,,使用,赋,赋值操,作,作符:=或SELECTINTO或FETCHINTO给每个,变,变量赋,值,值,执,行,行部分,的,的错误,将,将在异,常,常处理,部,部分解,决,决,在,执,执行部,分,分中可,以,以使用,另,另一个PL/SQL程序块,,,,这种,程,程序块,被,被称为,嵌,嵌套块,。,。,所有的SQL数据操,作,作语句,都,都可以,用,用于执,行,行部分,,,,PL/SQL块不能,在,在屏幕,上,上显示SELECT语句的,输,输出。SELECT语句必,须,须包括,一,一个INTO子串或,者,者是游,标,标的一,部,部分,,执,执行部,分,分使用,的,的变量,和,和常量,必,必须首,先,先在声,明,明部分,声,声明,,执,执行部,分,分必须,至,至少包,括,括一条,可,可执行,语,语句,NULL是一条,合,合法的,可,可执行,语,语句,,事,事物控,制,制语句COMMIT和ROLLBACK可以在,执,执行部,分,分使用,,,,数据,定,定义语,言,言(DataDefinition language)不能在,执,执行部,分,分中使,用,用,DDL语句与EXECUTE IMMEDIATE一起使,用,用或者,是,是DBMS_SQL调用。,12/31,3块,的,的执行,SQL,*,*PLUS中匿名,的,的PL/SQL块的执,行,行是在PL/SQL块后输,入,入/来执行,。,。,命名的,程,程序与,匿,匿名程,序,序的执,行,行不同,,,,执行,命,命名的,程,程序块,必,必须使,用,用execute关键字:。,如果在,另,另一个,命,命名程,序,序块或,匿,匿名程,序,序块中,执,执行这,个,个程序,,,,那么,就,就不需,要,要EXECUTE关键字,。,。,13/31,1变,量,量,2、常量,3、有效,字,字符集,4.2,.,.2,常,常量,与,与变量,14/31,1、变量,(1)声明,变,变量,声明变,量,量的语,句,句格式,如,如下:,Variable_name CONSTANTdatabyte,NOTNULL,:,:=|DEFAULT,expression,注意:,可以在,声,声明变,量,量的同,时,时给变,量,量强制,性,性的加,上,上NOTNULL约束条,件,件,此,时,时变量,在,在初始,化,化时必,须,须赋值,。,。,(2)给变,量,量赋值,给变量,赋,赋值有,两,两种方,式,式:,直接,给,给变量,赋,赋值,通过SQLSELECT INTO或FETCHINTO给变量,赋,赋值,15/31,2、常量,常量与,变,变量相,似,似,但,常,常量的,值,值在程,序,序内部,不,不能改,变,变,常,量,量的值,在,在定义,时,时赋予,,,,声明,方,方式与,变,变量相,似,似,但,必,必须包,括,括关键,字,字CONSTANT。常量,和,和变量,都,都可被,定,定义为SQL和用户,定,定义的,数,数据类,型,型。,为了减,少,少这部,分,分程序,的,的修改,,,,编程,时,时使用%TYPE、%ROWTYPE方式声,明,明变量,,,,使变,量,量声明,的,的类型,与,与表中,的,的保持,同,同步,,随,随表的,变,变化而,变,变化,,这,这样的,程,程序在,一,一定程,度,度上具,有,有更强,的,的通用,性,性。,16/31,3、有效,字,字符集,(1)所有,的,的大写,和,和小写,英,英文字,母,母;,(2)数字0-9;,(3)符号,:,:0一*,!一,;,;:.,,“,“,“,“,?,?,PL/SQL标识符,的,的最大,长,长度是30个字符,,,,并且,不,不区分,字,字母的,大,大小写,。,。但是,适,适当地,使,使用大,小,小写,,可,可以提,高,高程序,的,的可读,性,性。,17/31,PL/Sql数据类,型,型,1.基本数,据,据类型,VARCHAR2:在PL/SQL中可以,存,存储2000,在oracle8中是4000字节,NUMBER,(precision, scale):当声,明,明时。,默,默认值,是,是null,DATE:存储日,期,期型,CHAR ,(,(maximum_length,),):如没有,指,指定,,数,数据类,型,型为CHAR的列默,认,认长度,为,为1。这个,长,长度的,范,范围是1到2000。,LONG:用于长,度,度不定,,,,最大,值,值为2G的字符,型,型数据,。,。,Long Raw:存储,二,二进制,数,数据,,最,最大32760bytes,BOOLEAN:只能为true or false or null,BINARY,_,_INTEGER:-2147483648, 2147483648,PLS,_,_INTEGER:-2147483648, 2147483648,18/31,PL/SQL数据类,型,型,2、组合,类,类型,Table:逻辑,单,单位,,相,相当于,一,一个数,组,组,带,有,有主键,Primary Key:KEY的类型,是,是BINARY,_,_INTEGER,VALUE:真正,的,的值,声明语,法,法:TYPE type,_,_nameISTABLEOF,column_type,|,|variable%TYPE |table,.,.column%TYPE, NOTNULL,INDEXBYBINARY_INTEGER,;,identifiertype,_,_name;,例如,:,TYPE t,_,_nametable IS TABLE OF VARCHAR,(,(2),INDEXBYBINARY,_,_INTEGER;,引用:t_nametable(1):,=,=jact,例如,:,DECLARE,TYPE dept,_,_table,_,_typeISTABLEOFdept%ROWTYPE,INDEXBYBINARY,_,_INTEGER;,dept_table dept,_,_table,_,_type;,引用:dept_table.row1,(,(1),:,:=jact;,19/31,PL/SQL数据类,型,型,PL/SQLRECORDS,记录,类,类型,定义:,TYPE type,_,_nameISRECORD,(field,_,_declaration,field_declaration,);,identifier type,_,_name;,例如:TYPE record_name IS RECORD(,name varchar(20),idnumber,(,(9),),),引用:,student record_name,student.name,student.id,20/31,PL/SQL数据类,型,型,3、LOB大对象,类,类型,,用,用来存,文,文件、,图,图片、,音,音频等,二,二进制,,,,在PL/SQL中最大,长,长度是4G,CLOB:字符数,据,据,BLOB:图像、,图,图片(,可,可以容,纳,纳4G的二进,制,制),BFILE:MOVIE把二进,制,制存在,一,一个扩,展,展的文,件,件中。,容,容量是4G,NCLOB,21/31,4.2,.,.3,数,数据,类,类型,例如:,定,定义如,下,下若干,类,类型变,量,量,常,量,量。,DECLARE,ORDER_NONUMBER(3,),);,CUST_NAMEVARCHAR2(20);,ORDER_DATEDATE;,EMP,_,_NOINTEGER:,=,=25,;,;,PICONSTANTNUMBER,:,:=3,.,.1416;,BEGIN,NULL;,END,;,;,22/31,4.2,.,.4,运,运算,符,符,与其他,程,程序设,计,计语言,相,相同,PL/SQL有一系,列,列操作,符,符。主,要,要有:,算术操,作,作符,关系操,作,作符,逻辑操,作,作符,23/31,1条,件,件结构,2、循环,控,控制,3、GOTO语句,4.2,.,.5,流,流程,控,控制,4、嵌套,24/31,1、条件,结,结构,1)If条件判,断,断逻辑,结,结构,If条件判,断,断逻辑,结,结构有,三,三种表,达,达方式,。,。,表达,式,式一:,ifconditionthenStatementend if,该表达,式,式的功,能,能为:,若,若条件,为,为真,,执,执行then后的语,句,句;否,则,则,跳,出,出条件,语,语句执,行,行endif后的语,句,句。,表达,式,式二:,ifconditionthenStatements_1elseStatements_2end if,该表达,式,式的功,能,能为:,如,如果条,件,件为真,执,执行then后的语,句,句,否,则,则执行else后的语,句,句。,表达,式,式三:,ifcondition1 thenStatements_1 elseifcondition2,then Statements,_,_2else Statements,_,_3endif,该表达,式,式的功,能,能为:,如,如果if后的条,件,件成立,,,,执行then后面的,语,语句,,否,否则判,断,断elseif后面的,条,条件,,条,条件成,立,立执行,第,第二个then后面的,语,语句,,否,否则执,行,行else后的语,句,句。这,是,是条件,语,语句嵌,套,套。,IF可以嵌,套,套,可,以,以在IF或IF,.,.ELSE语句中,使,使用IF或IFELSE语句。,25/31,2)Case表达式,Case语句的,基,基本格,式,式如下,:,:,Case变量,WHEN表达式1 then值1,WHEN表达式2 then值2,WHEN表达式3 then值3,WHEN表达式4 then值4,ELSE值5,END,;,;,Case语句的,功,功能:,首,首先设,定,定变量,的,的值作,为,为条件,,,,然后,顺,顺序检,查,查表达,式,式,一,旦,旦从中,找,找到与,条,条件匹,配,配的表,达,达式值,,,,就停,止,止case语句的,处,处理。,26/31,2、循环控,制,制,(1)loopexit,end循环,控,控制语,句,句,LOOP循环语,句,句是其,中,中最基,本,本的一,种,种。LOOP语句的,格,格式如,下,下:,LOOP,statements,ENDLOOP;,这种循,环,环语句,是,是没有,终,终止的,,,,如果,不,不人为,控,控制的,话,话,其,中,中的statements将会无,限,限地执,行,行。一,般,般可以,通,通过加,入,入EXIT语句来,终,终结该,循,循环。,(2)WHILE,.,.LOOP循环控,制,制语句,WHILE,.,.LOOP有一个,条,条件与,循,循环相,联,联系,,如,如果条,件,件为TRUE,则执,行,行循环,体,体内的,语,语句,,如,如果结,果,果为FALSE,则结,束,束循环,。,。,27/31,(3)FOR,.,.LOOP,循,循环控,制,制语句,FOR,.,.LOOP,循,循环控,制,制语句,的,的格式,如,如下:,FORcounterIN,REVERSEstart,_,_range,.,.end_rangeLOOP,statements;,ENDLOOP;,LOOP和WHILE循环,的,的循环,次,次数都,是,是不确,定,定的,FOR,循,循环的,循,循环次,数,数是固,定,定的,counter是一,个,个隐式,声,声明的,变,变量,,初,初始值,是,是start,_,_range,,,,第二,个,个值是start_range+1,直,到,到end_range,如,果,果start,_,_range,等,等于end,_,_range,,,,那么,循,循环将,执,执行一,次,次。如,果,果使用,了,了REVERSE关,键,键字,,那,那么范,围,围将是,一,一个降,序,序。,28/31,3、GOTO语句,GOTO语句的,格,格式如,下,下:,GOTO LABEL;,执行GOTO语句时,,,,控制,会,会立即,转,转到由,标,标签标,记,记的语,句,句。PL/SQL中对GOTO语句有,一,一些限,制,制,对,于,于块、,循,循环、IF语句而,言,言,从,外,外层跳,转,转到内,层,层是非,法,法的。,29/31,4、嵌套,程序块,的,的内部,可,可以有,另,另一个,程,程序块,这,这种情,况,况称为,嵌,嵌套。,嵌,嵌套要,注,注意的,是,是变量,,,,定义,在,在最外,部,部程序,块,块中的,变,变量可,以,以在所,有,有子块,中,中使用,,,,如果,在,在子块,中,中定义,了,了与外,部,部程序,块,块变量,相,相同的,变,变量名,,,,在执,行,行子块,时,时将使,用,用子块,中,中定义,的,的变量,。,。子块,中,中定义,的,的变量,不,不能被,父,父块引,用,用。同,样,样GOTO语句不,能,能由父,块,块跳转,道,道子块,中,中,反,之,之则是,合,合法的,。,。,30/31,1PL/SQL的,异,异常,2、预定,义,义异常,3、自定,义,义异常,4.2,.,.6,异,异常,处,处理,31/31,1、PL/SQL的异常,异常处,理,理块中,包,包含了,与,与异常,相,相关的,错,错误发,生,生以及,当,当错误,发,发生时,要,要进行,执,执行和,处,处理的,代,代码。,异,异常部,分,分的语,法,法一般,如,如下:,BEGIN,EXCEPTION,WHEN excep_name1 THEN,WHEN excep_name2 THEN,WHEN OTHERSTHEN,END,;,;,32/31,Oracle,预定义,异,异常,33/31,3、自定义,异,异常,异常不,一,一定必,须,须是oracle返回的,系,系统错,误,误,用,户,户可以,在,在自己,的,的应用,程,程序中,创,创建可,触,触发及,可,可处理,的,的自定,义,义异常,,,,调用,异,异常处,理,理需要,使,使用Raise语句。,异常情,态,态的传,播,播指的是,当,当在程,序,序块的,声,声明、,执,执行、,异,异常部,分,分分别,出,出现异,常,常情态,时,时,或,在,在本块,中,中没有,相,相应的,异,异常处,理,理器时,会,会将这,个,个异常,情,情态传,播,播到哪,里,里,会,去,去激发,那,那个块,中,中的处,理,理器。,传,传播规,则,则是这,样,样的:,当一个,异,异常情,态,态是在,块,块的执,行,行部分,引,引发的(最常见,的,的),PL/SQL使用下,面,面的规,则,则确定,激,激活哪,个,个异常,处,处理器,。,。,(1)若当,前,前块对,该,该异常,情,情态设,置,置了处,理,理器,,则,则执行,它,它并成,功,功完成,该,该块的,执,执行,,然,然后控,制,制转给,包,包含块,。,。,(2)若当,前,前块没,有,有该处,理,理器,,则,则通过,在,在包含,块,块中引,发,发它来,传,传播异,常,常情态,。,。然后,对,对包含,块,块执行PL/SQL的异常,操,操作。,另,另外,,无,无论是,在,在声明,部,部分引,发,发了一,个,个异常,情,情态,,还,还是在,异,异常处,理,理部分,引,引发,,则,则该异,常,常情态,将,将立即,传,传播给,包,包含块,。,。在包,含,含块引,用,用上述,规,规则进,行,行异常,情,情态的,处,处理,,即,即使在,当,当前块,设,设置了OTHERS处理器,也,也不会,被,被执行,。,。,34/31,4.3,.,.2存储过,程,程的调,用,用,4.3,.,.3存储过,程,程的释,放,放,4.3,.,.4,实,实例,4.3,.,.1存储过,程,程的创,建,建,4.3,存,存,储,储过程,35/31,创建存,储,储过程,的,的语句,如,如下:,CREATE,ORREPLACEPROCEDURE过程,名,名,参数1,方,式,式l数据,类,类型1,,参数2,方式2数据,类,类型2,,),IS|ASis或as完全等,价,价,BEGIN,PL/SQL过程体,END过程,名,名,4.3,.,.1存储过,程,程的创,建,建,36/31,过程参,数,数有以,下,下三种,类,类型:,(1)in参数类,型,型:表,示,示输入,给,给过程,的,的参数,。,。,(2)out参数类,型,型:表,示,示参数,在,在过程,中,中将被,赋,赋值,,可,可以传,给,给过程,体,体的外,部,部。,(3)inout参数类,型,型:表,示,示该类,参,参数既,可,可以向,过,过程体,传,传值,,也,也可以,在,在过程,体,体中赋,值,值,以,便,便向过,程,程体外,传,传值。,37/31,存储过,程,程可以,直,直接用EXECUT命令调,用,用或PL/SQL程序块,内,内部调,用,用。,用EXECUT命令调,用,用存储,过,过程的,格,格式如,下,下:,SQL,executeproc_name,(,(par1,par2),;,;,4.3,.,.2,存,存储,过,过程的,调,调用,38/31,存储过,程,程也可,以,以被另,外,外的PL/SQL块,调,调用,,调,调用的,语,语句是,:,:,declare par1,par2;,begin,proc_name,(,(par1,par2),;,;,end,;,;,在调用,前,前要声,明,明变量par1,par2,39/31,当某个,存,存储过,程,程不再,需,需要时,,,,应将,其,其从内,存,存中删,除,除,以,释,释放它,占,占用的,内,内存资,源,源。释,放,放过程,的,的语句,格,格式如,下,下:,SQL,dropprocedureproc_name;,proc_name为过程,名,名。,4.3,.,.3,存,存储,过,过程的,释,释放,40/31,编写存,储,储过程,,,,显示,所,所指定,雇,雇员名,所,所在的,部,部门名,和,和位置,。,。,CREATEORREPLACEPROCEDUREDeptMesg,(,(pename emp.ename%TYPE,pdnameOUT dept,.,.dname,%,%TYPE,ploc OUTdept.loc%TYPE)AS,BEGIN,SELECTdname,loc INTOpdname,ploc,FROM emp,dept,WHEREemp,.,.deptno=dept,.,.deptno ANDemp,.,.ename,=,=pename;,END,;,;,/,VARIABLEvdnameVARCHAR2,(,(14,),);,VARIABLEvloc VARCHAR2(13);,EXECUTE DeptMesg(SMITH,:vdname,:vloc),;,;,PRINTvdnamevloc;,4.3,.,.4,实,实例,41/31,4.4,.,.2触发器,的,的类型,4.4,.,.3触发器,的,的创建,4.4,.,.4触发器,的,的修改,和,和删除,4.4,.,.1触发器,的,的设计,规,规则,4.4,触,触,发,发器,4.4,.,.5实例,42/31,(1)作用,范,范围清,晰,晰,(2)不要,让,让触发,器,器去完,成,成Oracle后台已,经,经能够,完,完成的,功,功能,(3)限制,触,触发器,代,代码的,行,行数,(4)不要,创,创建递,归,归的触,发,发器,(5)触发,器,器仅在,被,被触发,语,语句触,发,发时进,行,行集中,的,的,全,局,局的操,作,作,同,用,用户和,数,数据库,应,应用无,关,关。,4.4,.,.1,触,触发,器,器的设,计,计规则,43/31,可以创,建,建被如,下,下语句,所,所触发,的,的触发,器,器:,(1)DML语句(DELETE,INSERT,UPDATE);,(2)DDL语句(CREATE,ALTER,DROP);,(3)数据,库,库操作,(,(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。,4.4,.,.2,触,触发,器,器的类,型,型,44/31,1使用CREATETRIGGER语句创,建,建触发,器,器,使用CREATETRIGGER语句创,建,建触发,器,器的语,句,句格式,如,如下:,CREATE,ORREPLACETRIGGERname BEFORE,|,|AFTER,-这里是,触,触发器,的,的执行,时,时机,event,create,/,/insert/updata,ON表名称FOREACH,ROW|STATEMENT,-这里是,触,触发器,的,的触发,级,级别,WHEN(condition-触发器,的,的约束,条,条件)plsqlblock|call procedures,_,_statement -,-,-,4.4,.,.3,触,触发,器,器的创,建,建,45/31,2注意,事,事项,(1)触发,器,器可以,声,声明为,在,在对记,录,录进行,操,操作之,前,前,在,之,之前(检查约,束,束之前,和,和INSERT,UPDATE或DELETE执行前)或之后(在检查,约,约束之,后,后和完,成,成INSERT,UPDATE或DELETE操作)触发.。,(2)一个FOREACHROW执行指,定,定操作,的,的触发,器,器为操,作,作修改,的,的每一,行,行都调,用,用一次,。,。,(3)SELECT并不更,改,改任何,行,行,因,此,此不能,创,创建SELECT触发器.这种场,合,合下规,则,则和视,图,图更适,合,合。,(4)触发,器,器和某,一,一指定,的,的表格,有,有关,,当,当该表,格,格备删,除,除时,,任,任何与,该,该表有,关,关的触,发,发器同,样,样会被,删,删除。,(5)在一,个,个表上,的,的每一,个,个动作,只,只能有,一,一个触,发,发器与,之,之关联,。,。,(6)在一,个,个单独,的,的表上,,,,最多,只,只能创,建,建三个,触,触发器,与,与之关,联,联,一,个,个INSERT触发器,,,,一个DELETE触发器,和,和一个UPDATE触发器,。,。,46/31,删除触,发,发器的,语,语句格,式,式为:,DROP TRIGGERnameONtable;,一个触,发,发器由,三,三部分,组,组成:触发事,件,件或语,句,句、触,发,发限制,和,和触发,器,器动作,。,。触发,事,事件或,语,语句是,指,指引起,激,激发触,发,发器的SQL语句,,可,可为对,一,一指定,表,表的INSERT、UNPDATE或DELETE语句。,触,触发限,制,制是指,定,定一个,布,布尔表,达,达式,,当,当触发,器,器激发,时,时该布,尔,尔表达,式,式是必,须,须为真,。,。触发,器,器作为,过,过程,,是,是PL/SQL块,当,触,触发语,句,句发出,、,、触发,限,限制计,算,算为真,时,时该过,程,程被执,行,行。,4.4,.,.4,触,触发,器,器的修,改,改和删,除,除,47/31,编写一,个,个数据,库,库触发,器,器,当,任,任何时,候,候某个,部,部门从dept表中删,除,除时,,该,该触发,器,器将从emp表中删,除,除该部,门,门的所,有,有雇员,。,。,CREATEORREPLACETRIGGER del_emp,_,_deptno,BEFOREDELETE ON dept,FOREACHROW,BEGIN,DELETEFROMempWHEREdeptno=:OLD,.,.deptno;,END,;,;,4.4,.,.5,实,实例,48/31,4.5,.,.2隐式游,标,标,4.5,.,.3实例,4.5,.,.1显式游,标,标,4.5,游,游,标,标,49/31,Oracle,游,游标是,一,一种用,于,于轻松,的,的处理,多,多行数,据,据的机,制,制,没,有,有游标,,,,Oracle开发,人,人员必,须,须单独,地,地、显,式,式地取,回,回并管,理,理游标,查,查询选,择,择的每,一,一条记,录,录。游,标,标的另,一,一项功,能,能是,,它,它包含,一,一个跟,踪,踪当前,访,访问的,记,记录的,指,指针,,这,这使程,序,序能够,一,一次处,理,理多条,记,记录。,50/31,1声,明,明游标,2、打开,游,游标,3、从游,标,标中取,回,回数据,4.5,.,.1,显,显式,游,游标,4、关闭,游,游标,51/31,1.声明游,标,标,声明游,标,标的语,句,句格式,如,如下:,DECLARE cursor_name IS SELECTstatement,声明游,标,标完成,了,了下面,两,两个目,的,的:,(1)给游,标,标命名,;,;,(2)将一,个,个查询,与,与游标,关,关联起,来,来。,52/31,2打开,游,游标,打开游,标,标的语,句,句格式,如,如下:,OPEN cursor_name;,打开游,标,标将激,活,活查询,并,并识别,活,活动集,,,,可是,在,在执行,游,游标取,回,回命令,之,之前,,并,并没有,真,真正取,回,回记录,。,。OPEN命令还,初,初始化,了,了游标,指,指针,,使,使其指,向,向活动,集,集的第,一,一条记,录,录。游,标,标被打,开,开后,,直,直到关,闭,闭之前,,,,取回,到,到活动,集,集的所,有,有数据,都,都是静,态,态的。,换,换句话,说,说,游,标,标忽略,所,所有在,游,游标打,开,开之后,,,,对数,据,据执行,的,的SQLDML命令(INSERT、UPDATE、DELETE和SELECT,),),因此,只,只有在,需,需要时,才,才打开,它,它,要,刷,刷新活,动,动集,,只,只需关,闭,闭并重,新,新打开,游,游标即,可,可。,53/31,3从游,标,标中取,回,回数据,FETCH命令以,每,每次一,条,条记录,的,的方式,取,取回活,动,动集中,的,的记录,。,。通常,将,将FETCH命令和,某,某种迭,代,代处理,结,结合起,来,来使用,,,,在迭,代,代处理,中,中,FETCH命令每,执,执行一,次,次,游,标,标前进,到,到活动,集,集的下,一,一条记,录,录。,FETCH命令的,语,语句格,式,式如下,:,:,FETCHcursor,_,_nameINTO record_list;,执行FETCH命令后,,,,活动,集,集中的,结,结果被,取,取回到PL/SQL变量中,,,,以便,在,在PL/SQL块中使,用,用。每,取,取回一,条,条记录,,,,游标,的,的指针,就,就移向,活,活动集,的,的下一,条,条记录,。,。,54/31,4关闭,游,游标,CLOSE语,句,句关闭,以,以前打,开,开的游,标,标,使,得,得活动,集,集不确,定,定。,CLOSE语,句,句的格,式,式:,CLOSEcursor,_,_name;,55/31,隐式游,标,标也可,以,以叫做SQL游标。,和,和显式,的,的游标,不,不同,,不,不能对,一,一个SQL游标显,式,式的执,行,行OPEN,CLOSE和FETCH语句。Oracle隐式的,打,打开SQL游标、,处,处理SQL游标、,然,然后再,关,关闭该,游,游标。,Oracle提供隐,式,式游标,的,的主要,目,目的就,是,是利用,这,这些游,标,标的属,性,性来确,定,定SQL语句运,行,行的情,况,况。,4.5,.,.2隐式游,标,标,56/31,以上游,标,标应用,的,的完整,程,程序代,码,码如下,:,:,DECLARE,CURSORC1ISSELECT VIEW,_,_NAMEFROM ALL_VIEWS,WHEREROWNUM,IS,变量、,常,常量及,数,数据类,型,型定义,;,;,游标定,义,义;,函数、,过,过程定,义,义和参,数,数列表,及,及返回,类,类型;,END包名,;,60/31,2.包主体,部,部分,创建包,主,主体部,分,分的语,句,句格式,如,如下:,CREATEPACKAGEBODY包名,AS,游标、,函,函数、,过,过程的,具,具体定,义,义;,END包名,;,61/31,1描,述,述部分,2、包体,部,部分,4.6,.,.2,实,实例,62/31,1.描述部,分,分,CREATEPACKAGEznz,_,_package,/,/,/,/创建包,头,头,IS,man,_,_num NUMBER;,/,/定义变,量,量,woman_numNUMBER;,CURSOR学生;,/,/定义游,标,标,CREATEFUNCTIONf_count(insexIN学生.sex%TYPE,),)/,/,/定义函,数,数,RETURNNUMBER;,/,/,/,/定义返,回,回值类,型,型,CREATEPROCEDURE p,_,_count,/,/,/,/定义过,程,程,(in,_,_sex IN学生.sex%TYPE,/过程参,数,数,out,_,_num OUTNUMBER,),);,ENDznz_package,;,;,/,/包头结,束,束,63/31,2.包体部,分,分,CREATEPACKAGEBODY znz_package,/,/创建包,体,体,AS,CURSOR学生IS,/,/游标具,体,体定义,SELECT学号,,姓,姓名,FROM学生,WHERE学号,executeman,_,_num:=count_num,(,(女),71/31,3.函数的,释,释放,当函数,不,不再使,用,用时,,要,要用drop命令将,其,其从内,存,存中删,除,除,例,如,如:,SQL,dropfunctioncount_num,;,;,72/31,4.实例,编写一,个,个函数,以,以显示,该,该雇员,在,在此组,织,织中的,工,工作天,数,数。,CREATEORREPLACEFUNCTIONHire_Day(noemp,.,.empno,%,%TYPE),RETURNNUMBER AS,vhiredateemp.hiredate%TYPE,;,;,vday NUMBER;,BEGIN,SELECThiredateINTOvhiredateFROMempWHEREempno,=,=no,;,;,vday:=CEIL(SYSDATE,-,-vhiredate);,RETURNvday;,END,;,;,73/31,本章总,结,结,
展开阅读全文