存储过程、包、数据库触发器设计(Oracle9iProceduralOption)《Oracle9iPL/SQL程序设计》存储过程与应用级存储过程的区别1.存储于数据库中2.文档存储在数据字典3.可以被应用、及开发工具调用4.可以被其他存储过程调用1.存储于Form应用中2.文档可以从应用中得到3.只可以由Form调用4.可以调用存储过程StorageProcedureFormProcedure创建存储过程(CreateProcedure)CreateorReplaceProcedure过程名(变量数据类型)变量定义;Begin…End过程名;过程体可以省略INOUTINOUTISAS缺省创建函数(CreateFunction)CreateorReplaceFunction函数名(变量数据类型)变量定义;Begin…Return值;End函数名;可以省略INOUTINOUTISASReturn数据类型缺省5存储过程例外处理(EXCEPTION)在PL/SQL中,警告信息、出错信息、或返回信息统称为例外(Exception)。Oracle中有两种类型的例外。预定义的例外:是由PL/SQL运行过程中,系统自动产生的信息。用户自定义例外:是用户根据需要,自己定义使用的例外,执行时由用户自己引起。Oracle预定义的常用例外:CURSOR_ALREADY_OPENVALUE_ERRORNO_DATA_FOUNDINVALID_NUMBERTOO_MANY_ROWSZERO_DIVIDEINVALID_CURSOR用户自定义例外用户定义的例外必须在DECLARE段中说明,在Begin段中用RAISE引起,在EXCEPTION段中使用。SQL语句执行结果:在处理SQL时,这类消息所使用的SQL语句包括:INSERT,UPDATE,DELETE子句。执行结果属性:SQL%FOUNDSQL%NOTFOUNDSQL%ROWCOUNT例外处理方法:Beginupdateempsetsal=1200whereempno=1234;ifSQL%NOTFOUNDtheninsertintoErrors(empno,sal)values(1234,1200);endif;End;存储过程例外处理(EXCEPTION)7存储过程例外处理(EXCEPTION)例外的使用DeclareBeginExceptionWhenNO_DATA_FOUNDTHEN…WhenCURSOR_ALREADY_OPENTHENWhenTOO_MANY_ROWSTHEN...…WhenOTHERSTHEN...END;例外段在Exception段中对返回信息一一作出响应8存储过程例外处理(EXCEPTION)用户定义例外的使用Declareout_of_rangeEXCEPTION;Begin…ifv_salMAX_SALthenRAISEout_of_range;endif;…ExceptionWhenNO_DATA_FOUNDTHEN…WhenCURSOR_ALREADY_OPENTHENWhenTOO_MANY_ROWSTHEN...Whenout_of_rangeTHEN...END;例外段在Declare段定义在Begin段中引起在Exception段中使用Package包的设计创建包(CreatePackage)CreateorReplacePackage包名Procedure过程名();Function函数名()Return数据类型;变量定义;例外定义;光标定义;……;End包名;定义公共元素ISAS创建包体(CreatePackageBody)CreateorReplacePackageBody包名Procedure过程定义;Procedure过程定义;Function函数定义;Function函数定义;……;End包名;ISAS创建包创建包体1----定义过程创建包体23----定义过程包的调用OracleDatabaseTrigger数据库触发器设计17数据库触发器作用防止非法的数据库操纵、维护数据库安全对数据库的操作进行审计,存储历史数据完成数据库初始化处理控制数据库的数据完整性进行相关数据的修改完成数据复制自动完成数据库统计计算限制数据库操作的时间、权限等,控制实体的安全性。18数据库触发器与存储过程比较:数据库触发器是在进行数据操纵时自动触发的,存储过程要通过程序调用。在数据库触发器中可以调用存储过程、函数。在触发器中禁止使用COMMIT、ROLLBACK语句,存储过程中可以使用PL/SQL中可以使用的全部SQL语句。在触发器中不得间接调用含有COMMIT、ROLLBACK语句的存储过程。创建语句级触发器CreateorReplaceTrigger触发器名BeforeInsertAfterDeleteOn表名Update{of}Declare…….Begin……End;PL/SQL块SQL创建行级触发器CreateorReplaceTrigger触发器名BeforeInsertAfterDeleteOn表名Update{of}FOREACHROWDeclare…….Begin……End;PL/SQL块SQL21创建行级触发器:当触发器已经存在时,使用Replace选项。Update中的of是可选项,用于指定Update语句要修改的列。根据进行一个操作时触发器的触发次数决定是用语句级、还是行级触发器。当某一操作结果只影响一行时,语句级触发器与行触发器效果相同。当操作影响到数据库多行数据时,语句级触发器只触发一次,而行级触发器触发多次。