200 likes | 392 Views
8.5 Oracle 常用对象. 本节根据 Oracle 的特点,介绍 Oracle 的一些对象,如存储过程、函数、触发器、包、序号生成器等 。 8.5.1 存储过程 8.5.2 触发器 8.5.3 用户自定义函数 8.5.4 包 8.5.5 序号生成器. 8.5.1 存储过程. Oracle 中的存储过程由 SQL 语句和一些控制流语句组成并封装起来,经编译和优化后存储在数据库服务器中,使用时只需调用。使用存储过程有如下优点: ( 1 ) 存储过程功能全面、接口灵活。 ( 2 ) 可减少网络数据传输量。
E N D
8.5 Oracle常用对象 • 本节根据Oracle的特点,介绍Oracle的一些对象,如存储过程、函数、触发器、包、序号生成器等 。 • 8.5.1 存储过程 • 8.5.2 触发器 • 8.5.3 用户自定义函数 • 8.5.4 包 • 8.5.5 序号生成器
8.5.1 存储过程 • Oracle 中的存储过程由SQL语句和一些控制流语句组成并封装起来,经编译和优化后存储在数据库服务器中,使用时只需调用。使用存储过程有如下优点: • (1) 存储过程功能全面、接口灵活。 • (2) 可减少网络数据传输量。 • (3) 可减少调用延迟,提高程序的执行效率。 • (4) 可保证数据的安全性和完整性。 • (5)可维护性好。
1.存储过程的建立 • CREATE [OR REPLACE] PROCEDURE procedure_name [(argument [IN|OUT|IN OUT] datatype [argument [IN|OUT|IN OUT] datatype]…)] • IS|AS • [declaration_statements] • BEGIN • Executable_statements • [EXCEPTION • exception-handler_statemebts] • END [procedure_name];
2.存储过程的重新编译与删除 • (1)存储过程的重新编译 • 虽然用CREATE OR REPLACE 命令可以重新编译存储过程,但还有一种方法不需要有源程序的拷贝就可重新编译存储过程,其命令格式为: • ALTER PROCEDURE procedure_name COMPILE; • 当存储过程引用的对象的某种方式发生改变时,这时Oracle不能确定其状态,存储过程被标记为无效,但使用该方法能很快解决问题。 • (2) 存储过程的删除 • DROP PROCEDURE procedure_name
3.存储过程的调用 • (1)参数表示法 • 名表示法: • 其格式如下: • argument _name=> argument _value • 参数的位置不需要与存储过程中参数的定义顺序一致。 • 位置表示法: • 调用有参数的存储过程时,参数值的顺序与存储过程中参数定义的顺序应一致。
(2)PL/SQL对象或匿名PL/SQL块调用 • 在PL/SQL对象或匿名PL/SQL块调用存储过程与调用Oracle内部函数方法一致,其格式为: • procedure_name (argument _name=> argument _value [,argument _name=> argument _value[,…]]) • 或 • procedure_name(argument _value1[,argument _value2[,…]])
8.5.2 触发器 • 触发器是一种特殊类型的存储过程,主要用于维护数据库中的表。它有以下作用: • (1)安全性 • (2)审计 • (3)实现复杂的数据完整性规则 • (4)实现复杂非标准的数据库的相关完整性规则
1.触发器的建立 • CREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER|INSTEAD OF DELETE|INSERT|UPDATE [OF column[,column]…][OR DELETE|INSERT|UPDATE [OF column[,column]…]… ON table_name [[REFERENCING OLD [AS] old1|NEW [AS] new1] FOR EACH ROW|statement [WHEN condition] • IS|AS • [declaration_statements] • BEGIN • Executable_statements • [EXCEPTION • exception-handler_statemebts]
注意: • (1)触发器中不能对与触发器定义所在表相关的表进行操作。 • (2)触发器中不能使用COMMIT、ROLLBACK及与之相关的语句,如果触发器调用含有这类语句的存储过程也可能出现问题。 • (3)在建立触发器时应避免循环触发,即建立在表A上的触发器对表B进行某种操作,而建立在表B的触发器对表A进行同种操作。
2.触发器的重新编译与删除 • (1)触发器的重新编译 • 虽然用CREATE OR REPLACE 命令可以重新编译触发器,但还有一种方法不需要有源程序的拷贝就可重新编译触发器,其命令格式为: • ALTER TRIGGER trigger_name COMPILE; • (2) 触发器的删除 • 如果一个创建的触发器不再需要了,可使用下列命令删除: • DROP TRIGGER trigger_name
8.5.3 用户自定义函数 • Oracle虽然有许多内置函数,但这些函数并不能完全满足用户的要求。用户有时进行大量相同类型的计算,但没有Oracle内置函数可供使用。Oracle提供了用户自定义函数功能。用户自定义函数作为一个命名的程序单元,可带参数,并可返回一个计算值。利用函数可完成指定的任务并提高模块的可靠性、减少开发时间。
1.函数的建立 • CREATE [OR REPLACE] FUNCTION function_name [(argument [IN|OUT|IN OUT] datatype [argument [IN|OUT|IN OUT] datatype]…)] RETURN datatype • IS|AS • [declaration_statements] • BEGIN • Executable_statements • [EXCEPTION • exception-handler_statemebts] • END;
2.函数的重新编译与删除 • (1)函数的重新编译 • 虽然用CREATE OR REPLACE 命令可以重新编译函数,但还有一种方法不需要有源程序的拷贝就可重新编译函数,其命令格式为: • ALTER FUNCTION function_name COMPILE; • (2) 函数的删除 • 如果一个创建的函数不再需要了,可使用下列命令删除: • DROP FUNCTION function_name
3.函数的调用 • 函数一般是被系统的客户机端调用,但有时也被其它Oracle对象或匿名PL/SQL块调用。利用不同的系统开发工具,对函数的调用方式也略有不同。 • (1)参数表示法 • 与存储过程一样,函数的参数也有两种表示法:名表示法和位置表示法。 • (2)PL/SQL对象或匿名PL/SQL块调用 • 在PL/SQL对象或匿名PL/SQL块调用函数与调用Oracle内部函数方法一致。可将函数值赋给一个变量,也可以在SQL语句中使用内置函数的地方使用自定义函数。
8.5.4 包 • 包是一种数据库对象,它将其逻辑相关的PL/SQL类型、存储过程、函数等对象组合在一起。具有如下特点: • (1)可将逻辑上相关的类型、对象、函数、存储过程封闭在一个命名的PL/SQL块内。 • (2)使应用程序的设计更容易。 • (3)隐藏信息 • (4)具有更好的性能
1. 包说明 • 包说明为应用程序的接口。建立包说明的语法为: • CREATE [OR REPLACE] PACKAGE package_name IS|AS • 变量说明; • 游标说明; • 例外说明; • 函数说明; • 存储过程说明; • END;
2.包体 • 包体包括在包说明中定义的存储过程和函数。语法为: • CREATE [OR REPLACE] PACKAGE package_name IS|AS • 变量说明; • 游标说明; • 例外说明; • 函数体; • 存储过程体; • END;
3. 包中函数与存储过程的调用 • (1)在另一存储过程中调用包中存储过程 • 包名. 存储过程名(实际参数); • (2) 在PL/SLQ中调用包中存储过程 • EXECTE 包名. 存储过程名(实际参数); • (3)包中函数的调用 • 与Oracle内置函数调用方法一致,但应在函数名前加上包名。
8.5.5 序号生成器 • 在很多应用系统中要用到序号,如仓储管理中入库与出库的流水号等。 Oracle提供了一个序号对象,通过序号对象可自动生成序号,多个用户可并发读取,无需相互等待。其命令格式为: • CREATE SEQUENCE sequence_name [ INCREMENT BY integer] [START WITH integer] [ MAXVALUE integer | NOMAXVALUE] [ MINVALUE integer | NOMINVALUE] [CYCLE | NOCYCLE] [ CACHE integer | NOCACHE ] [ORDER | NOORDER]