一、过程与函数区别

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 过程函数,包的区别和联系的更多相关文章

  1. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  2. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

  3. MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法

    在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...

  4. oracle中函数和存储过程的区别和联系

    oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...

  5. oracle 存储过程,存储函数,包,

    http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...

  6. ORA-04044: 此处不允许过程, 函数, 程序包或类型和

    用Orale代码建表时,出现 SQL> comment on column SCORE.cno 2 is '学号(外键)';comment on column SCORE.cno is '学号( ...

  7. Oracle过程及函数的参数模式,In、out、in out模式

    Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...

  8. 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数

      1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...

  9. Oracle中函数/过程返回结果集的几种方式

    原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式:    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.    ...

随机推荐

  1. 【转】EditText获取焦点不自动弹出键盘设置--失去焦点的方法,不错

    原文网址:http://zouhuajian01.blog.163.com/blog/static/1176987720121128115813176/ 当我们在activity中加入EditText ...

  2. C#设计模式(23种设计模式)

    转自:http://www.cnblogs.com/abcdwxc/archive/2007/10/30/942834.html 创建型:        1. 单件模式(Singleton Patte ...

  3. HDU-2368 Alfredo's Pizza Restaurant

    http://acm.hdu.edu.cn/status.php Alfredo's Pizza Restaurant Time Limit: 1000/1000 MS (Java/Others)   ...

  4. Unity给力插件之ShaderForge(一)

    这是一个用来制作shader的插件,也是一个很好的学习shader的工具.这个插件上手很容易,但是要用它来制作理想的Shader,需要下点功夫. 这儿先列举出基础知识,以及我的一些实践.以后我还会继续 ...

  5. nyoj 37回文串

    述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可 ...

  6. vmware 收缩硬盘大小(compat,shrink,vmware-vdiskmanager)

    3.vmware-vdiskmanager 虚拟机在使用过程中,虚拟磁盘的大小会不断变大.即使你删除了磁盘中的文件,虚拟磁盘的大小仍然不会缩小.VMWare在VMWare Tools中推出了Shrin ...

  7. Bzoj 1984: 月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1282  Solved: 410[Submit][Status][Discu ...

  8. Python中的引用的使用注意

    关于Python中的引用的一些使用注意 在python中,在创建一个对象并给它赋予一个变量时,这个赋予的变量仅仅是一个引用它所代表的对象.也就是说新创建的对象只是指向计算机中储存那个对象的内存. 比如 ...

  9. 上海Uber优步司机奖励政策(2月1日~2月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. 【转】shell 教程——04 什么时候使用Shell

    因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化.因此,Shell脚本只要“用心写”一次,即可应用到很多系统上.因此,之所以要使用Shell脚本是基于: 简单性:Shel ...