oracle 过程函数,包的区别和联系
一、过程与函数区别
1.过程可以有0~N个返回参数,通过OUT or IN OUT参数返回;函数有且仅有1个返回值,通过return语句返回。
2.调用过程时,可做为单独的语句执行;调用函数时,函数必须把返回结果赋值给一个变量。
3.在SQL语句中,可以不能调用过程;在SQL语句中,可以直接调用函数。
二、过程与函数
过程[procedure]及函数[function]这两种方案对象均由 SQL 语句及 PL/SQL 语言构件组合而成,存储于数据库中,运行时作为一个整体,用于解决某个问题,或完成一组相关的操作。调用者可以在调用过程及函数时为其提供参数,参数可以专用于输入值,专用于输出值,或同时用于输入及输出值。在过程与函数中,用户既可以发挥 SQL 的灵活性与易用性,也能够发挥结构化编成语言的过程控制能力。过程与函数基本类似,唯一区别在于函数总会向调用者返回一个值,而过程无此特性。
三、存储过程在以下方面具有优势:
1.利用定义者权限过程[definer's rights procedure]确保数据安全
使用存储过程有助于确保数据安全。具备数据库对象访问权限的用户可以定义存储过程或函数,其他用户通过已定义的过程访问数据,从而达到限制用户对数据库操作的目的。
例如,现有一个过程能够更新某数据表,管理员不必授予用户直接访问数据表的权限,而是授予用户访问此过程的权限。当用户调用此过程时,过程以其拥有者的权限运行。具备执行此过程权限(但不具备查询,更新,及删除底层表数据权限)的用户可以调用过程对表进行操作,但不能以其他方式操作表数据。
2.通过调用者权限过程[invoker's rights procedure]使用调用者的权限及方案上下文
调用者权限过程可以继承其调用者的权限及方案上下文。即调用者权限过程不与特定的用户或方案绑定,每次执行时利用当前用户的权限操作当前用户的方案对象。应用程序开发者可以通过调用者权限过程使应用逻辑集中化,即便底层数据分散于不同的用户方案中。
例如,以经理身份登录的用户运行针对 employees 表的更新过程时可以修改薪水数据,而以职员身份登录的用户运行同样的的更新过程时只能修改地址数据。
3.提升性能
- 与向 Oracle 提交 SQL 语句或 PL/SQL 块代码相比,使用存储过程时通过网络传输的数据量较小,因为存储过程只有在定义时需要被传输到服务器,而使用时只需进行调用。
- 数据库以编译后的形式保存过程,因此执行期间无需进行编译。
- 如果过程已经被加载到系统全局区[system global area,SGA]的共享池[shared pool]内,则过程可以直接执行,而不必从磁盘获取。
4.内存分配
存储过程可以利用 Oracle 的共享内存特性,多个用户执行同一个过程时只需将一份过程副本加载到内存中。通过在多个用户间共享相同的代码,能够显著地减少应用程序所需的 Oracle 内存。
5.提高开发生产率
利用存储过程能够提高开发生产率。在一组公用的存储过程的基础上开发应用程序,能够避免冗余代码从而提高开发生产率。
例如,开发者可以编写存储过程,分别对 employees 表内的员工数据进行插入,更新及删除操作。任何应用程序都可以调用这些过程,而无需重写 SQL 语句就可以完成相应的工作。如果数据管理的方式发生变化,只需修改存储过程,而不必修改调用过程的应用程序。
6.完整性
存储过程能够提高应用程序所处理数据时的一致性与完整性。由于应用程序是在一组 公用存储过程的基础上开发的,因此能够减少提交代码发生错误的可能性。
例如,用户可以对过程或函数进行测试,确保其返回准确的结果,一旦验证则可以在其他应用程序中重复使用而无需再次测试。如果过程所引用的数据结构发生变化,只需修改存储过程,而不必修改调用过程的应用程序。
四、过程开发指南
以下是设计存储过程时需要遵循的原则:
- 在一个存储过程中应该只实现一个单一的任务。不要定义执行多个子任务的大型存储过程,如果在多个过程中实现了相同的子任务将造成不必要的代码重复。
- 不要定义过程来实现 Oracle 已经提供的功能。例如,不要定义过程来强制实现简单的数据完整性规则,此类功能只需要声明数据完整性约束即可实现。
五、包
包[package]是由一组相关的过程,函数,及其使用的游标,变量等构成的程序单元,存储于数据库中供用户使用。与独立的过程及函数类似,包过程与包函数也可以由应用程序及用户显式地调用。
包在创建时分为两部分:包规范与包体。包规范[package specification]用于声明所有公有程序结构,而包体则用于对所有程序结构进行定义(包括公有及私有)。将包分为两部分具有以下优势:
- 可与使开发周期更灵活。用户可以首先声明包规范而不定义包体,此时已声明的公有过程已经可以被其他过程引用。
- 用户可以分别修改一个过程在包体内的定义及在包规范中的声明。只要在包规范中的过程声明没有发生变化,引用了包中被修改过程的对象就不会被标志为无效状态[invalid]。因此避免了不必要的重新编译工作。
六、包的优势
使用包具有以下优势:
- 封装相关的过程与变量
使用存储包[stored package]用户可以将存储过程,变量,数据类型等程序结构封装[encapsulate](或称为组合)为一个命名的程序单元并存储在数据库中。这使开发过程更易管理。此外,将过程封装还能使权限管理更简单。当授予用户访问包的权限后,用户就可以访问包内的所有程序结构。
- 声明公有或私有的过程,变量,常量及游标
在定义包时,用户可以决定过程,变量,常量及游标是公有或私有的。公有的程序结构意味着其可以被用户直接使用。而私有程序结构对用户是不可见的。
例如,一个包中包含 10 个过程。用户可以将其中的 3 个声明为公有的,包用户可以直接使用。其余过程声明为私有,只能被包内的过程访问。注意,不要将公有及私有包程序结构与授权给 PUBLIC 相混淆。
- 性能更佳
当包内的某个过程第一次被调用时,整个包将被加载到内存中。这个加载操作只需执行一次,而对于分散的独立过程[standalone procedure]则需要执行多次操作。因此,当包内的其他过程被调用时其编译代码已经存在于内存中,而无需进行磁盘 I/O 操作。
包体可以被修改并重新编译而不会影响包规范。因此,引用(总是根据包规范进行引用)了包内被修改程序结构的方案对象无需重新编译,除非包规范也作了修改。使用包可以减少不必要的重新编译操作,从而减少了对数据库整体性能的影响。
oracle 过程函数,包的区别和联系的更多相关文章
- .Net程序员学用Oracle系列(7):视图、函数、过程、包
<.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- oracle中函数和存储过程的区别和联系
oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...
- oracle 存储过程,存储函数,包,
http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...
- ORA-04044: 此处不允许过程, 函数, 程序包或类型和
用Orale代码建表时,出现 SQL> comment on column SCORE.cno 2 is '学号(外键)';comment on column SCORE.cno is '学号( ...
- Oracle过程及函数的参数模式,In、out、in out模式
Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. ...
随机推荐
- 大型邮箱smtp服务器及端口 收集
各大型邮箱smtp服务器及端口收集: 新浪邮箱smtp服务器 外发服务器:smtp.vip.sina.com 收件服务器:pop3.vip.sina.com 新浪免费邮件 外发服务器:smtp.sin ...
- Lambda表达式与匿名方法
在C#2中,由于有了方法组,匿名方法,类型的协变和抗变,使得运用delegate变得很容易,在注册事件时代码变得简单易读,但是在C# 2中,代码仍然有点臃肿,大块的匿名方法会降低代码的可读性,一般我们 ...
- 怎样安装Joomla 1.7网站系统
http://jingyan.baidu.com/article/8065f87fc3de112331249830.html 如果你想使用Joomla(地球上最好的内容管理系统之一)搭建一个网站, ...
- linux文件权限详解
一.文件和目录权限概述在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一 ...
- HTML5 UTF-8 中文乱码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- linux内核--软中断与tasklet
硬件中断通常都需要在最短的时间内执行完毕,如果将所有硬件中断相关的处理都放在硬件中断处理程序中,那么就达不到这个目的. 通过linux提供的软中断和tasklet,可以将硬件中断处理程序中可以延迟处理 ...
- php开发中的页面跳转方法总结
PHP页面跳转实现的功能就是将网站中一个网页跳转到另一个网页中.对于刚刚学习PHP语言的朋友来说,是必须要掌握的基础方法. 页面跳转可能是由于用户单击链接.按钮等触发的,也可能是系统自动产生的.页面自 ...
- word模版另存为网页(*.htm,*.html),转为jsp页面并加入数据后导出成word
word模版另存为网页之后,将html格式的文件转为jsp页面,在页面上加入相应的动态值,加入的值中包含图片,这个该怎么处理??另外导出的文件需要拷贝到不同的地方(无法联网)使用. <%@ pa ...
- MVC-控制器向View传值的三种方法
1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResult Index() { DateTime date = DateTime.Now; return ...
- Codeforces 114A-Cifera(暴力)
A. Cifera time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...