




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL语句提供了数据操纵的能力,但不支持结构化编程,当要实现复杂的应用时,需要数据库管理系统提供过程化的编程支持。
Oracle利用PL/SQL(ProcedureLanguage/StructureQueryLanguage,过程语言)来进行结构化编程。在PL/SQL中,最重要的是存储过程和触发器。第五章存储过程与触发器5.1
基本概念5.1.1PL/SQL程序块将逻辑上相关的语句组织在一个程序块内;通过嵌入或调用子块,构造功能强大的程序;可将一个复杂的问题分解成为一组便于管理、定义和实现的小块。
PL/SQL(ProceduralLanguage/SQL)是ORACLE对标准数据库语言的扩展,从版本6开始,ORACLE公司已经将PL/SQL整合到ORACLE服务器和其他工具中。对SQL的扩充:具有为程序开发而设计的特性;
过程化:第四代语言的强大功能和灵活性与第三代语言的过程结构的优势融为一体;
后台技术:嵌入到Oracle服务器中的,可以把PL/SQL看作ORACLE服务器内的一个引擎,所以具有很高的执行效率和同Oracle数据库的完美结合。1.什么是PL/SQL①其他Oracle工具集成在一起,是主要的后台开发工具②更好的性能③过程化、模块化④易用性、可维护性⑤可处理运行错误⑥大量的内置程序包PL/SQL的特点
2.PL/SQL开发环境工具名称开发商Web站点地址SQL*PlusOracle公司RapidSQLEmbarcadero公司Xpediter/SQLCompuwareSQLNavigatorQuestSoftwareTOADQuestSoftwarePL/SQLDeveloper
allroundautomations
SQL-ProgrammerSylvainFaustInternational
3.
PL/SQL的基本构成
PL/SQL程序的基本单元是块(BLOCK),块就是实现一定功能的逻辑模块。一个PL/SQL程序由一个或多个块组成。
一个块可以包括四个部分:
(1)DECLARE:声明部分标志。
(2)BEGIN:可执行部分标志。
(3)EXCEPTION:异常处理部分标志。
(4)END;:程序结束标志。Declare
--变量声明begin
--语句序列exception
--例外处理程序End;/PL/SQL程序结构“--”是注释符号,后边是程序的注释部分。该部分不编译执行,所以在输入程序时可以省略。/*......*/中间也是注释部分,同“--”注释方法不同,它可以跨越多行进行注释。
PL/SQL程序的可执行语句、SQL语句和END结束标识都要以分号结束。
PL/SQL程序有两种:命名的PL/SQL程序块和匿名PL/SQL程序块PL/SQL程序结构说明在PL/SQL模块中可以使用查询语句和数据操纵语句(即进行DML操作),所以PL/SQL程序是同SQL语言紧密结合在一起的。在PL/SQL程序中,常见的是使用SELECT语句从数据库中获取信息,同直接执行SELECT语句不同,在程序中的SELECT语句总是和INTO相配合,INTO后跟用于接收查询结果的变量,形式如下:
SELECT列名1,列名2...
INTO变量1,变量2...
FROM表名WHERE条件;
接收查询结果的变量类型、顺序和个数同SELECT语句的字段的类型、顺序和个数应该完全一致。并且SELECT语句返回的数据必须是一行,否则将引发系统错误。当程序要接收返回的多行结果时,可以采用游标的方法。
使用INSERT、DELETE和UPDATE的语法没有变化,但在程序中要注意判断语句执行的状态,并使用COMMIT或ROLLBACK进行事务处理。
SQL*Plus中匿名的PL/SQL块的执行是在PL/SQL块后输入“/”来执行。执行命名的程序块必须使用execute关键字。在另一个命名程序块或匿名程序块中执行命名的PL/SQL程序,不需要execute关键字。
4.
PL/SQL程序的执行为了调试PL/SQL程序块,可以使用函数DBMS_OUTPUT.PUT_LINE显示输出结果。DBMS_OUTPUT是Oracle提供的包,该包有如下三个用于输出的函数,用于显示PL/SQL程序模块的输出信息。调试PL/SQL程序的方法要使用该方法显示输出数据,在SQL*Plus环境下要先执行一次如下的环境设置命令:
SETSERVEROUTPUTON[SIZEn]
用来打开DBMS_OUTPUT.PUT_LINE函数的屏幕输出功能,系统默认状态是OFF。其中,n表示输出缓冲区的大小。n的范围在2000~1000000之间,默认为2000。如果输出内容较多,需要使用SIZEn来设置较大的输出缓冲区。第一种形式:
DBMS_OUTPUT.PUT(字符串表达式);
用于输出字符串,但不换行。第二种形式:
DBMS_OUTPUT.PUT_LINE(字符串表达式);
用于输出一行字符串信息,并换行。第三种形式:
DBMS_OUTPUT.NEW_LINE;
用来输出一个换行,没有参数。DBMS_OUTPUT.PUT格式例5.1查询雇员编号为7788的雇员姓名和工资。步骤1:用SCOTT账户登录SQL*Plus。步骤2:执行命令:SETSERVEROUTPUTON
步骤3:在输入区输入以下程序:
<见下页>
步骤4:执行程序。输出的结果是:
7788号雇员是:SCOTT,工资为:30005.
示例程序
/*这是一个简单的示例程序*/DECLARE
--定义部分标识
v_nameVARCHAR2(10);--定义字符串变量v_name
v_salNUMBER(5);--定义数值变量v_salBEGIN --可执行部分标识
SELECTename,sal
INTOv_name,v_sal
FROM emp
WHEREempno=7788;--在程序中插入的SQL语句
DBMS_OUTPUT.PUT_LINE('7788号雇员是:'||
v_name||',工资为:'||to_char(v_sal));
--输出雇员名和工资END; --结束标识/5.1.2PL/SQL的变量与运算符PL/SQL数据类型有四种数据类型:标量复合
LOB
引用标量数据类型没有内部组件,它们大致分为四类:数字(number)、字符(character)、日期(date)、布尔(boolean)。1.
数据类型数据类型范围子类型描述BINARY_INTEGER-2147483647~2147483647NATURALNATURALNPOSITIVEPOSITIVENSIGNTYPE用于存储单字节整数。要求存储长度低于NUMBER值。用于限制范围的子类型(SUBTYPE):
NATURAL:用于非负数;
NATURALN:用于非负数和非NULL值;
POSITIVE:只用于正数;
POSITIVEN:只用于正数,不能用于NULL值。
SIGNTYPE:只有值:-1、0或1。NUMBER1.0E-130~9.99E125DECDECIMALDOUBLEPRECISIONFLOATINTEGERRICINTNUMERICREALSMALLINT存储数字值,包括整数和浮点数。可以选择精度和刻度方式,语法:
number[(p[,s])]缺省的精度p是38,刻度s是0。PLS_INTEGER-2147483647~2147483647与BINARY_INTEGER基本相同,但采用机器运算时,PLS_INTEGER提供更好的性能。①
数字数据类型数据类型范围子类型描述CHARN=2000字节CHARACTER存储定长字符串,若长度没有确定,缺省是1。LONG最大长度:
2GB字节存储可变长度字符串。RAW最大长度:32767字节存储二进制数据和字节字符串。当在两个数据库之间进行传递时,RAW数据不存在字符集之间转换。LONGRAW最大长度:2GB字节与LONG数据类型相似,同样也存在不能在字符集之间转换。RAWID18字节与数据库ROWID伪列类型相同、能够存储一个行标示符,可以将行标示符看作数据库中每一行的惟一键值。VARCHAR2最大长度:32767字节STRINGVARCHAR与VARCHAR数据类型相似,存储可变长度的字符串。声明方法与VARCHAR相同。②
字符数据类型③
日期和布尔数据类型④
LOB数据类型数据类型范围描述BOOLEANTRUE/FALSE存储逻辑值TRUE或FALSE,无参数。DATE公元前:01/01/4712~公元:12/31/9999存储固定长度的日期和时间值,日期值中包含时间。数据类型范围子类型描述LOB最大长度:4GB字节BLOBCLOBNCLOB大对象类型,用来存储非结构化数据。BFILE大小由操作系统决定在数据库外部保存大型二进制对象文件。数据类型描述RECORD类似于C语言中的结构,提供了处理分立但又是作为一个整体单元的相关变量的一种机制。TABLE类似于C语言中的数组,从语法上讲,它们与数组的处理方式相类似。但是它们,它们实际上是不同的。PL/SQL表类似于数据库表,它有两列——KEY和VALUE。KEY的类型是BINARY_INTEGER,而VALUE的类型是在定义中指定的类型。⑤
复合数据类型2.
变量变量的作用是用来存储数据,可以在过程语句中使用。变量在声明部分可以进行初始化,即赋予初值。变量在定义的同时也可以将其说明成常量并赋予固定的值。变量有六种形式:一般变量类型变量宿主变量记录变量记录类型变量
TABLE类型变量以字母开头,后跟其他的字符序列,字符序列中可以包含字母、数值、下划线等符号,最大长度为30个字符,不区分大小写。不能使用Oracle的保留字作为变量名。变量名不要和在程序中引用的字段名相重,如果相重,变量名会被当作列名来使用。变量的命名规则①
一般变量
变量名[CONSTANT]类型标识符
[NOTNULL][:=值|DEFAULT值];
关键字CONSTANT用来说明定义的变量是常量,如果是常量,必须有赋值部分进行赋值;关键值NOTNULL用来说明变量不能为空;
:=值|DEFAULT值,用来为变量赋初值。变量名:=值|PL/SQL表达式;
通过赋值语句给变量赋值;
通过键盘输入给变量赋值;通过SELECT…INTO…给变量赋值。变量赋值②根据表的字段定义变量变量名表名.字段名%TYPE;
根据数据库表的字段定义变量,其定义的变量的数据类型和长度与数据库表中的列保持一致;当数据库的字段数据类型进行了修改,那么该变量的定义也自动使用新的数据类型;变量的数据类型和大小是在编译执行时决定。③绑定变量(宿主变量)VARIABLE变量名数据类型
SQL*Plus环境下使用的变量,可以在程序中使用;宿主变量的使用是在宿主变量前加上冒号;
:宿主变量名在SQL*Plus环境下显示该变量要用系统的PRINT命令。注意:末尾没有;号④记录变量记录变量名表名%ROWTYPE;
记录变量包含若干个字段,在结构上同表的一个记录相同;记录变量的字段名就是表的字段名,数据类型也一致;获得记录变量的字段的方法:
记录变量名.字段名⑤记录类型变量Type记录类型名isrecord(
field1type1[notnull]{default|:=}expr1;
field2type2[notnull]{default|:=}expr2;
…
)
记录数据类型和表的行结构非常相似,一行数据通常包括许多不同的字段;必须使用TYPE语句来创建自己的数据类型;记录类型变量的使用:
记录类型变量名.字段名⑥TABLE类型变量TYPE表类型名ISTABLEOF数据类型
[NOTNULL]INDEXBYBINARY_INTEGER;
要定义TABLE变量,需要先定义TABLE数据类型;此数据类型自动带有BINARY_INTEGER型的索引;可用来存储可变长度的一维数组数据,即数组中的数据动态地增长;通过使用下标来引用TABLE变量的元素。3.
运算符和函数
PL/SQL的运算符主要有算术运算符、关系运算符、逻辑运算符和字符串运算符。
PL/SQL中可以使用绝大部分Oracle函数。但是组函数(如AVG()、MIN()、MAX()等)只能出现在SQL语句中,不能在其他语句中使用。类型转换在很多情况下是自动的,在不能进行自动类型转换的场合需要使用转换函数。运算符及优先级优先级运算符描述1**乘方2+、-正负号3*、/乘除4+、-、||加减、字符串连接5=、<、>、<=、>=、!=、~=、^=、isnull、like、between…and、in(…)比较6Not逻辑非7And逻辑与8Or逻辑或赋值语句语法:变量:=表达式;
在一个特定的PL/SQL语句中仅能够有一个赋值。表达式
表达式作为一个句子是无效的,他必须是一条语句的一部分,是右值。字符表达式
||运算符4.
PL/SQL表达式5.1.3PL/SQL的控制语句
PL/SQL程序控制语句同其它的编程语言一样有三种:顺序结构分支结构循环结构1.
分支结构
PL/SQL分支结构语句有两种:
IF语句
根据条件可以改变程序的逻辑流程
CASE语句
适用于分情况的多分支处理①
IF语句
IF语句格式:
IF条件1THEN
语句序列1;
[ELSIF条件2THEN
语句序列2;
ELSE
语句序列n;]
ENDIF;根据具体情况,IF语句分支结构可以有以下几种形式:
IF-THEN-ENDIF;IF-THEN-ELSE-ENDIF;IF-THEN-ELSIF-ELSE-ENDIF;②
CASE语句
CASE语句格式:
CASE选择变量名
WHEN表达式1THEN
语句序列1
WHEN表达式2THEN
语句序列2
……
WHEN表达式nTHEN
语句序列n
ELSE
语句序列n+1
ENDCASE;在Oracle中,CASE结构还能以赋值表达式的形式出现,它根据选择变量的值求得不同的结果:变量=CASE选择变量名
WHEN表达式1THEN值1
WHEN表达式2THEN值2
……
WHEN表达式nTHEN值n
ELSE值n+1
ENDCASE;表达式结构CASE语句在Oracle中,还提供了一种搜索CASE结构,它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向:
CASE
WHEN条件表达式1THEN
语句序列1
WHEN条件表达式2THEN
语句序列2
……
WHEN条件表达式nTHEN
语句序列n
ELSE
语句序列n+1
ENDCASE;搜索CASE结构2.
循环结构循环结构是最重要的程序控制结构,用来控制反复执行一段程序。
PL/SQL循环结构可划分为以下3种:
基本LOOP循环
FORLOOP循环
WHILELOOP循环①
基本LOOP循环
语句格式:
LOOP --循环起始标识
语句序列1;
语句序列2;
EXIT[WHEN条件];
ENDLOOP; --循环结束标识功能:反复执行LOOP与ENDLOOP之间的语句。
EXIT用于在循环过程中退出循环,WHEN用于定义EXIT的退出条件。如果没有WHEN条件,遇到EXIT语句则无条件退出循环。②
FORLOOP循环
FOR循环是固定次数循环。语句格式:
FOR控制变量in[REVERSE]下限..上限
LOOP
语句序列1;
语句序列2;
ENDLOOP;注意:循环控制变量是隐含定义的,不需要声明。③
WHILELOOP循环
WHILE循环是有条件循环。语句格式:
WHILE条件
LOOP
语句序列1;
语句序列2;
ENDLOOP; 当条件满足时,执行循环体;当条件不满足时,则结束循环。如果第一次判断条件为假,则不执行循环体。5.1.4异常处理
PL/SQL中使用异常和相关异常处理器来满足错误处理需求,而不是在一个程序体内嵌入错误处理程序。异常就是已命名的错误条件。当PL/SQL程序检测到一个错误时,产生一个已命名的异常,并将控制传递给与主程序体分离的相关的异常处理程序。1.
Oracle错误处理机制错误处理部分位于程序的可执行部分之后,是由WHEN语句引导的多个分支构成的。
EXCEPTION
WHEN错误1[OR错误2]THEN
语句序列1
WHEN错误3[OR错误4]THEN
语句序列2
……
WHENOTHERS
语句序列n
END;错误处理语法格式错误是在标准包中由系统预定义的标准错误,或是由用户在程序的说明部分自定义的错误;语句序列就是不同分支的错误处理部分;说明:凡是出现在WHEN后面的错误都是可以捕捉到的错误,其他未被捕捉到的错误,将在WHENOTHERS部分进行统一处理。OTHENS必须是EXCEPTION部分的最后一个错误处理分支;如要在该分支中进一步判断错误种类,可以通过使用预定义函数SQLCODE()和SQLERRM()来获得系统错误号和错误信息;如果在程序的子块中发生了错误,但子块没有错误处理部分,则错误会传递到主程序中。2.
异常的类型在PL/SQL中,有以下3种异常:预定义异常非预定义异常用户定义的异常错误名称错误代码异常号错误含义CURSOR_ALREADY_OPENORA_06511-06511试图打开已经打开的游标INVALID_CURSORORA_01001-01001试图使用没有打开的游标DUP_VAL_ON_INDEXORA_00001
-00001保存重复值到惟一索引约束的列中ZERO_DIVIDEORA_01476-01476发生除数为零的除法错误INVALID_NUMBERORA_01722-01722试图对无效字符进行数值转换ROWTYPE_MISMATCHORA_06504-06504主变量和游标的类型不兼容VALUE_ERRORORA_06502-06502转换、截断或算术运算发生错误TOO_MANY_ROWSORA_01422-01422SELECT…INTO…语句返回多于一行的数据NO_DATA_FOUNDORA_01403-01403SELECT…INTO…语句没有数据返回TIMEOUT_ON_RESOURCEORA_00051-00051等待资源时发生超时错误TRANSACTION_BACKED_OUTORA_00060-00060由于死锁,提交失败STORAGE_ERRORORA_06500-06500发生内存错误PROGRAM_ERRORORA_06501-06501发生PL/SQL内部错误NOT_LOGGED_ONORA_01012-01012试图操作未连接的数据库LOGIN_DENIEDORA_01017-01017在连接时提供了无效用户名或口令①
Oracle预定义异常②
非预定义异常如果一个系统错误没有在标准包中定义,则需要在声明部分定义,语法如下:
错误名EXCEPTION;
然后通过编译指示PRAGMAEXCEPTION_INIT来将一个定义的错误同一个特别的Oracle错误代码相关联,就可以同系统预定义的错误一样使用了。语法如下:PRAGMAEXCEPTION_INIT(错误名,-错误代码);③
用户定义异常
程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型。可以在声明部分定义新的异常类型。语法如下:错误名EXCEPTION;
用户定义的错误不能由系统来触发,必须由程序显式地触发,触发的语法是:RAISE错误名;3.
异常处理过程在PL/SQL中,异常处理分下列3个步骤进行:在声明部分为错误定义异常,包括非预定义异常和用户定义异常;在执行过程中当错误产生时抛出与错误对应的异常;在异常处理部分通过异常处理捕获异常,并进行异常处理。由于系统可以自动识别Oracle内部错误,因此当错误产生时系统会自动抛出与之对应的预定义异常或非预定义异常。但是,系统无法识别用户定义错误,因此当用户错误产生时,需要用户手动抛出与之对应的异常。异常的抛出例5.2用户注册检查,其数据库表结构如下所示,编写PL/SQL程序进行用户登录检查,并在tout表中记录检查结果。用户名和密码正确,记录“loginok”;密码错误记录“passworderror”;用户名错误记录“useriderror”。4.
示例程序Udps…msg……Useridpasswd…tin:tout:userlog:第五章作业:(第1次)1.雇员表:emp(eno,ename),编写PL/SQL程序查询编号为1234的雇员名字并输出该名字。要求:当不存在该雇员时,输出提示信息“编号错误,没有找到相应雇员!”,当发生其他异常时,输出提示信息“发生其他错误!”。2.P.1472。思考题1.P.1471。5.2
Oracle存储过程
存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。存储过程和函数还是数据库系统中的一个对象,可以在数据字典中查询到它的详细地细节。存储过程的优点存储过程可以看作是一个公用模块。一个重复使用的功能,可以设计成为存储过程或函数;存储过程需要进行编译,以排除语法错误,只有编译通过才能调用;存储过程以命名的数据库对象形式存储于数据库当中;存储过程可由数据库提供安全保证,只有被授权的用户或创建者本身才能执行存储过程;用户编写的PL/SQL程序或其他存储过程都可以调用它;可以传递参数给存储过程,也可以有返回值。1.
创建存储过程创建一个存储过程需要有CREATEPROCEDURE或CREATEANYPROCEDURE的系统权限。基本语句如下:
CREATE[ORREPLACE]PROCEDURE存储过程名
[(参数1[{IN|OUT|INOUT}]数据类型
[{:=|DEFAULT}表达式]...)]
[AUTHID{CURRENT_USER|DESIGNER}]
{AS|IS}
[说明部分]
BEGIN
可执行部分
[EXCEPTION
错误处理部分]
END[过程名];
/参数类型说明IN(只读)定义一个输入参数变量,用于传递参数给存储过程。当调用过程时,实参的值将传入过程。在该过程内部,形参类似PL/SQL使用的常数,即该值具有只读属性,不能对其修改。当该过程结束时,控制将返回到调用环境,这时对应的形参没有改变。OUT(只写)定义一个输出参数变量,用于从存储过程获取数据。当过程被调用时,实参具有的任何值都将被忽略不计。在该过程内部,形参的作用类似于没有初始化的PL/SQL变量,其值为空(NULL)。该变量具有读写属性。当该过程结束时,控制将返回到调用环境,形参的内容将赋予对应的实参。INOUT(可读写)定义一个输入、输出参数变量,兼有以上两者的功能。该模式是模式IN和OUT的组合。调用过程时,实参的值将被传递到该过程中。在该过程内部,形参相当于初始化的变量,并具有读写属性。当该过程结束时,控制将返回到调用环境,形参的内容将赋予对应的实参。参数模式不能强制指定形参参数的CHAR和VARCHAR2的长度,以及指定NUMBER参数的精度或小数点后位数(可以从实参中获得);可以使用%TYPE来说明形参。如果一个形参是用%TYPE声明的,并且说明%TYPE的变量也是强制类型的话,则该强制说明将作用在形参上而不是实参上。说明:2.
删除和重新编译存储过程删除存储过程的人是过程的创建者或者拥有DROPANYPROCEDURE系统权限的人。DROPPROCEDURE存储过程名;如果要重新编译一个存储过程,则只能是过程的创建者或者拥有ALTERANYPROCEDURE系统权限的人。ALTERPROCEDURE存储过程名COMPILE;3.
执行存储过程执行(或调用)存储过程的人是过程的创建者或是拥有EXECUTEANYPROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人。方法1:
EXECUTE模式名.存储过程名[(参数1,…)];方法2:
BEGIN
模式名.存储过程名[(参数1,…)];
END;参数的值由调用者传递,传递的参数的个数、类型和顺序应该和定义的一致。如果顺序不一致,可以采用以下调用方法:参数名=>参数值表达式参数可以是变量、常量或表达式;如果是调用本账户下的存储过程,则模式名可以省略。要调用其他账户编写的存储过程,则模式名必须要添加。说明:例5.3用户注册检查,其数据库表结构如下所示,编写存储过程进行用户登录检查,并记录检查结果(同例2)。
(1)输入参数1为用户名;
(2)输入参数2为密码;
(3)输出参数为:用户名和密码正确,返回值为0;密码错误返回值为-1;用户名错误返回值为-2。4.
示例程序msg……Useridpasswd…tout:userlog:5.3
Oracle包
包是用来存储相关程序结构的对象,它存储于数据字典中。包由两个分离的部分组成:包头(PACKAGE):包的说明部分,是对外的操作接口,对应用是可见的;包体(PACKAGEBODY):包的代码和实现部分,对应用来说是不可见的黑盒。<包的介绍略>5.4
触发器
触发器类似于过程和函数,它们都是拥有声明、执行和异常处理过程的带名PL/SQL块,触发器必须在数据库中以独立对象的身份存储。执行触发器的操作就是“启动”触发器。触发器必须由事件才能触发。触发事件发生时就会隐式地执行该触发器,并且触发器不接受参数。触发器又叫做事件—条件—动作规则。触发器是当特定的系统事件(如对一个表的增、删、改,事务的结束)发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作。触发事件的操作可能执行也可能不执行。存储过程触发器调用执行通过存储过程名字而被直接调用通过事件触发而被执行参数传递可以传递参数不接受参数存储过程与触发器的比较触发器的作用主要有以下几点:维护不可能在表创建时刻通过声明性约束进行的复杂的完整性约束限制;完整性限制是当被限制的对象发生变化时,系统就去检查该对象变化后能否满足限制条件,如果不能满足,就拒绝引起这种变化的操作。提供透明的审计记录,通过记录所进行的修改以及谁进行了修改来审计表中的信息;利用触发器还可以做很多其他工作,例如:自动产生导出列的值;实施复杂的安全授权;执行复杂的业务规则;可阻止非法的事务处理;表被修改的时候,自动给其他需要执行操作的程序发信号。5.4.1触发器的种类和触发事件
触发器事件可分为3类:
DML事件
DDL事件数据库事件触发器类型可分为4类:
DML触发器
DDL触发器替代触发器数据库事件触发器本课程只介绍DML触发器种类关键字含义DML事件(3种)INSERT在表或视图中插入数据时触发UPDATE修改表或视图中的数据时触发DELETE在删除表或视图中的数据时触发DDL事件(3种)CREATE在创建新对象时触发ALTER修改数据库或数据库对象时触发DROP删除对象时触发数据库事件(5种)STARTUP数据打开时触发SHUTDOWN在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON当用户连接到数据库并建立会话时触发LOGOFF当一个会话从数据库中断开时触发SERVERERROR发生服务器错误时触发触发器事件种类简称作用数据操纵语言触发器DML触发器创建在表上,由DML事件引发的触发器替代触发器INSTEADOF触发器创建在视图上,用来替换对视图进行的插入、删除和修改操作数据定义语言触发器DDL触发器定义在模式上,触发事件是数据库对象的创建和修改数据库事件触发器—定义在整个数据库或模式上,触发事件是数据库事件触发器的类型和作用5.4.2DML触发器
DML触发器是定义在表上的触发器,由DML事件引发。编写DML触发器的要素是:确定触发的表,即在其上定义触发器的表;确定触发的事件,DML触发器的触发事件有INSERT、UPDATE和DELETE三种;确定触发时间。触发的时间有BEFORE和AFTER两种,分别表示触发动作发生在DML语句执行之前和语句执行之后;确定触发级别,有语句级触发器和行级触发器两种。创建DML触发器需要CREATETRIGGER系统权限。创建DML触发器的语法如下:CREATE[ORREPLACE]TRIGGER触发器名
{BEFORE|AFTER|INSTEADOF}触发事件1[OR触发事件2...]
ON表名
WHEN触发条件
[FOREACHROW]
DECLARE
声明部分
BEGIN
主体部分
END触发器名;
/1.
创建DML触发器1.创建者:表的拥有者2.触发器名3.表名:触发器的目标表4.触发事件:INSERT、DELETE、UPDATE
对于UPDATE事件,可以用以下形式表示对某些列的修改会引起触发器的动作:
UPDATEOF列名1,列名2...5.触发器类型行级触发器(FOREACHROW)语句级触发器(FOREACHSTATEMENT)定义触发器的语法说明类型取值说明语句INSERT、UPDATE、DELETE定义哪种DML语句会使得触发器点火定时BEFORE或AFTER定义是否在语句执行以前或以后点火触发器级别行或语句如果触发器是行级触发器,那么它仅对由触发语句影响的每一行点火一次。如果触发器是语句级触发器,那么它会在语句之前或之后点火一次。行级触发器是由触发器定义中的FOREACHROW子句标识的。DML触发器类型触发器主体是触发器的主要处理代码。WHEN子句的触发条件如果被使用的话,将首先进行求值。触发器的主体仅当此条件求值为“TRUE”时才被执行;如果有多个触发器被定义成为相同时间、相同事件触发,且最后定义的触发器是有效的,则最后定义的触发器被触发,其他触发器不执行;触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程;说明:每个触发器有两个特殊的表:插入表(INSERTED)和删除表(DELETED)。这两个表是只读的,不允许用户直接对其修改,即用户不能向这两个表写入内容,但可以引用表中的数据;一个触发器可由多个不同的DML操作触发。在触发器中,可用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。这些谓词可以在IF分支条件语句中作为判断条件来使用;
在行级触发器中,用:new和:old(称为伪记录)来访问数据变更前后的值。但要注意,INSERT语句插入一条新记录,所以没有:old记录,而DELETE语句删除掉一条已经存在的记录,所以没有:new记录。UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。引用具体的某一列的值的方法是:
:old.字段名或:new.字段名
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息处理技术员经典考题及答案
- 软件测试的重要性和方法试题及答案
- 计算机应用案例分析试题及答案
- 材料疲劳寿命评估数据可视化重点基础知识点
- 行政管理综合素质试题及答案分享
- 军训火灾应急预案范文(3篇)
- 选择的里程碑2024年高考作文考试试题及答案
- 2025年战略管理中的组织变革试题及答案
- 行政法学与其他学科融合试题及答案
- 设计模式在实际项目中的应用案例试题及答案
- 部编版(2016) 七年级下册 第五单元整体备课 教学设计
- 转化英语后进生之我见
- 长城:一部世界文化遗产的史诗
- 2023年文印服务实施方案
- 2023年医学高级职称-眼科(医学高级)考试冲刺-历年真题演练带答案
- 财务岗位笔试试题附有答案
- 二次供水水箱清洗合同
- 医务科依法执业自查表
- (完整word版)企业对账函模板
- DB42-T 1107-2023 保温装饰板外墙外保温系统工程技术规程
- 领导干部任前谈话记录表
评论
0/150
提交评论