Oracle11g基础学习---------(5) 开发子程序和包

 学习Oracle从哪里入手呢,在这里,我将带你走进Oracle的大门,一天一章,7天入门不是梦
 
 
1. 开发子程序
子程序是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用中多次调用 
PL/SQL有两种类型的子程序:过程和函数 
过程用于执行特定操作,而函数则用于返回特定数据 
通过将商业逻辑和企业规则集成到PL/SQL子程序中,可以简化客户端应用的开发和维护,提高应用的性能 


1. 1 开发过程
1.1  开发过程
过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程
开发过程
CREATE [OR REPLACE] PROCEDURE procedure_name
(argument1 [mode1] datatype1, argument2 [mode2] datatype2, ...)
IS [AS]
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;

创建过程:无参数
开发过程
创建过程:带有IN参数 
当为过程定义参数时,如果不指定参数模式,则默认为输入参数
开发过程
创建过程:带有OUT参数 
过程不仅可以用于执行特定操作,还可以用于输出数据
在过程中输出数据时,需要使用OUT或IN OUT参数来完成 
开发过程
创建过程:带有IN OUT参数 
创建过程时,不仅可以指定IN和OUT参数,也可以指定IN OUT参数 
IN OUT参数也称为输入输出参数,当使用这种参数时,在调用过程之前需要通过变量给该种参数传递数据,调用结束后,Oracle会通过该变量将过程结果传递给应用
1.2 在调用过程时为参数传递变量和数据
为形参传递变量和数据可以采用
位置传递
名称传递
组合传递
在调用过程时为参数传递变量和数据
按位置传递
按位置传递是指在调用时按参数的排列顺序依次写出实参的名称,将形参与实参关联起来进行传递
在这种方法中,形参与实参的名称是相互独立、没有关系的,次序才重要
它比按名称传递方法在书写上简单,但如果更新了一个过程的形参的次序,则对应该过程的所有调用都必须进行相应的更新,所以会增加维护应用程序的难度
在调用过程时为参数传递变量和数据
按名称传递
按名称传递是指在调用时按照形参与实参的名称写出实参所对应的形参,将形参与实参关联起来进行传递
在这种方法中,形参与实参的名称是相互独立、没有关系的,名称的对应关系很重要,但次序不重要
它比按位置传递方法在书写上要复杂,但如果只更新了一个过程的形参的次序,则不需要对该过程的任何调用进行任何更新
但如果更新了一个过程的形参的名称,则对该过程的所有调用都必须进行相应的更新,所以会增加维护应用程序的难度
名称传递在调用子程序时指定参数名,并使用关联符号“=>”为其提供相应的数值或变量
在调用过程时为参数传递变量和数据
组合传递
根据应用的需要,可以将按位置传递、按名称传递两种方法在同一调用中混合使用
但前面的实参必须使用按位置传递方法,而后面其余的实参则可以使用按名称传递的方法
1.3 开发函数
函数用于返回特定数据,如果在应用程序中经常需要通过执行SQL语句来返回特定数据,则可以基于这些操作创建特定的函数
通过使用函数,不仅可以简化客户端应用程序的开发和维护,还可以提高应用程序的执行性能
 CREATE [OR REPLACE] FUNCTION function_name
   (argument1 [model] datatype1,
    argument2 [mode2] datatype2,
...)
RETURN datatype
 IS|AS
   声明部分
  BEGIN
     执行部分
 EXCEPTION 
  异常处理部分
END;


开发函数
创建函数:不带任何参数 
开发函数
创建函数:带有IN参数
当创建函数时,通过使用输入参数,可以将应用的数据传递到函数中,最终通过执行函数可以将结果返回到应用程序中 
当定义参数时,如果不指定参数模式,则默认为输入参数
开发函数
创建函数:带有OUT参数
一般情况下,函数只需要返回单个数据。如果希望使用函数时返回多个数据(如同时返回雇员名和工资),则可以使用OUT输出参数来实现此功能
开发函数
创建函数:带有IN OUT参数 
与创建过程类似,创建函数时也可以指定IN OUT参数
1.4 过程与函数的比较
过程与函数有许多相同的功能及特性
都使用IN模式的参数传入数据、OUT模式的参数返回数据
输入参数都可以接收默认值,都可以传值
调用时的实参都可以使用位置表示法或名称表示法
都有声明部分、执行部分和异常处理部分
一般而言,如果需要返回多个值或不返回值,就使用过程
如果只需要返回一个值,就使用函数
虽然函数带OUT模式的参数也能返回多个值,但是一般都认为这种方法属于不好的编程习惯或风格
过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值
1.5 管理子程序
查看子程序的源码
通过查询数据字典USER_SOURCE,可显示当前用户的所有子程序及其源代码
列出当前用户的子程序 
数据字典视图USER_OBJECTS用于显示当前用户所包含的所有对象   
列出子程序编译错误 
使用SHOW ERRORS命令确定错误出现错误的位置及原因 
列出对象依赖关系 
创建存储对象(过程、函数、包、视图、触发器)时,往往需引用其他对象 
当修改了被引用对象的结构时,都会使得相关依赖对象转变为INVALID状态 
可以使用数据字典视图USER_DEPENDENCIES确定直接依赖关系
重新编译子程序
当修改了被引用对象的结构后,会将相关依赖对象转变为INVALID状态 
为了避免调用的失败,在更新表的结构后,应该重新编译依赖于它的对象   

2. 开发包
2.1 创建包
包(Package)用于组合逻辑相关的PL/SQL类型、PL/SQL项和PL/SQL子程序
通过使用PL/SQL包,不仅可以简化应用设计,提高应用性能,还可以实现信息隐藏、子程序重载等功能
包由包规范和包体两部分组成
当创建包时,需要首先创建包规范,然后再创建包体
创建包规范
包规范是包与应用程序之间的接口,用于定义包的公用组件,包括常量、变量、游标、过程和函数
在包规范中所定义的公用组件不仅可以在包内引用,而且还可以由其他的子程序引用
创建包规范时需要注意的是:为了实现信息隐藏,不应该将所有组件全部放在包规范处定义,而应该只定义公用组件
CREATE [OR REPLACE] PACKAGE package_name
IS|AS
public type and item declarations
subprogram specifications
END package_name;
创建包规范
创建包体
为了实现包规范中所定义的公用过程和函数,必须创建包体 
包体用于实现包规范所定义的过程和函数 
在创建包时,为了实现信息隐藏,应该在包体内定义私有组件   
CREATE [OR REPLACE] PACKAGE BODY package_name
IS | AS
private type and item declarations
subprogram bodies
END package_name;

2.2 调用包的组件
对于包的私有组件,只能在包内调用,并且可以直接调用 
而对于包的公用组件,既可以在包内调用,又可以在其他应用中调用 
在同一包内调用包的组件 
在调用同一包内的其他组件时,可以直接调用,不需要添加包名作为前缀 
调用包的公用变量 
当在其他应用中调用包的公用变量时,必须在公用变量名前添加包名作为前缀 
调用包的公用过程 
当在其他应用中调用包的公用过程时,必须在公用过程名前添加包名作为前缀 
调用包的公用函数 
当在其他应用中调用包的公用函数时,需要在函数名前添加包名作为前缀 
以其他用户身份调用包的公用组件
当以其他用户身份调用包的公用组件时,必须为用户赋予能够执行包的权限,并且必须以“用户名.包名.组件名”的语法格式来调用

2.3 管理包
查看包源代码
通过查询数据字典USER_SOURCE,可以显示当前用户的包及其源代码
删除包
如果只删除包体,则可以使用DROP PACKAGE BODY命令
如果同时删除包规范和包体,则可以使用DROP PACKAGE命令

 总结
子程序是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用中多次调用。PL/SQL有两种类型的子程序:过程和函数
过程一般用于执行一个指定的动作
函数一般用于计算和返回一个值
子程序使用IN模式的参数传入数据、OUT模式的参数返回数据
IN OUT参数也称为输入输出参数,它在调用过程之前需通过变量给参数传递数据,在调用结束之后,Oracle会通过该变量将过程结果传递给应用
为形参传递变量和数据可以采用位置传递、名称传递和组合传递3种方法
可以在SQL语句内部调用函数来完成复杂计算问题,但不能调用过程
包(Package)用于逻辑组合相关的PL/SQL类型、PL/SQL项和PL/SQL子程序
包由包规范和包体两部分组成。当创建包时,需要首先创建包规范,然后再创建包体


 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值