一、为什么要用存储过程?

如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程。通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能。

二、过程的优点?

1、预编译:存储过程预先编译好放在数据库内,减少编译语句所花的时间。

2、缓存:预编译的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其它次数的执行速度会明显提高。

3、减少网络传输:特别是对于一些处理数据的存储过程,不必像直接使用SQL语句那样多次传送数据到客户端。

4 、可维护性高:更新存储过程通常要比更改、测试和部署应用程序需要的时间和精力要少。

5、代码的重用:一个可以重用的存储过程可以应用到应用程序的多个位置。

6、增强安全性:通过对用户授权对存储过程的访问权限,它们可以提供对特定数据的访问;提高数据安全性,来防止SQL注入。

三、缺点:

1、如果需要对存储过程的输入输出参数做更改的话,还要更改程序。

2、可移植性差:因为存储过程将应用程序的业务处理绑定到数据库中,以此使用存储过程来处理业务逻辑限制了应用程序的可移植性。

四、创建存储过程

  1. --1、简单的存储过程
  2. create or replace procedure procedure_test
  3. (p_id in varchar,p_status out varchar)  --p_id为输入参数 ,p_status为输出参数
  4. as
  5. t_name varchar2(20);
  6. t_count number:=0;
  7. begin
  8. select votetitle,vatesum into t_name,t_count from votemaster where id=p_id; --注意:此处没有:来赋值
  9. if t_count <=0 then
  10. p_status:= t_name||':差';
  11. elsif t_count >0 and t_count <3 then
  12. p_status:= t_name||':良好';
  13. else
  14. p_status:= t_name||':优秀';
  15. end if;
  16. end;
  17. --执行
  18. declare
  19. out_param varchar2(50);
  20. begin
  21. procedure_test('1',out_param);
  22. dbms_output.put_line(out_param);
  23. end;
  24. --2、带游标的存储过程
  25. create or replace procedure procedure_cursor_test
  26. (p_id in varchar2,p_status out varchar2)
  27. as
  28. vote votemaster%rowtype; --声明一个对象(votemaster)类型的对象
  29. cursor my_cur is select * from votemaster; --声明一个游标并填充数据
  30. begin
  31. open my_cur; --打开游标
  32. loop
  33. fetch my_cur into vote ; --循环游标,并放入对象
  34. exit when my_cur%notfound; --如果没有数据,则直接exit
  35. if vote.id=p_id then
  36. p_status := vote.votetitle||':'||vote.vatesum;
  37. --如果想终止循环,可以直接exit;
  38. end if;
  39. end loop;
  40. close my_cur; --关闭游标
  41. end;
  42. --执行
  43. declare
  44. out_param varchar2(50);
  45. begin
  46. procedure_cursor_test('1',out_param);
  47. dbms_output.put_line(out_param);
  48. end;

五、程序包

1、程序包:包是一组相关过程、函数、变量、游标、常量等PL/SQL程序设计元素的组合。它具有面向对象程序设计语言的特点,是对这些PL/SQL程序设计元素的封装。包类似于C++或Java程序中的类,而变量相当于类中的成员变量,过程和函数相当于方法,把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。与类相同,包中的程序元素也分为公用元素和私有元素两种,这两种元素的区别是他们允许访问的程序范围不同,即他们的作用域不同。公用元素不仅可以被包中的函数、过程调用,也可以被包外的PL/SQl块调用。而私有元素只能被该包内部的函数或过程调用。

2、使用程序包的优点:在PL/SQL设计中,使用包不仅可以使程序模块化,对外隐藏包内所使用的信息,而写程序包可以提高程序的运行效率。因为,当程序首次调用程序包内部的函数或过程时,Oracle将整个程序包调入内存,当再次调用程序包中的元素时,Oracle直接从内存中读取,而不需要进行磁盘的IO操作,从而使程序的执行效率提高。

3、一个程序包分为两部分组成:

(1)、包定义:包定义部分声明包内数据类型、变量、常量、游标、子程序和函数等元素,这些元素为包的共有元素。

(2)、包主体:包主题则定义了包定义部分的具体实现,在包主体中还可以声明和实现私有元素。

  1. --包定义
  2. create or replace package t_package
  3. is
  4. --定义过程
  5. procedure append_proc(t varchar2,a out varchar2);
  6. --过程的重载
  7. procedure append_proc(t number,a out varchar2);
  8. --定义函数
  9. function append_fun(t varchar2) return varchar2;
  10. end;
  1. --包主题
  2. create or replace package body t_package
  3. is
  4. v_t varchar2(30);
  5. --私有成员函数
  6. function private_fun(t varchar2) return varchar2 is
  7. begin
  8. v_t := t||'hello';
  9. return v_t;
  10. end;
  11. --实现过程
  12. procedure append_proc(t varchar2,a out varchar2) is
  13. begin
  14. a := t||'hello';
  15. end;
  16. --过程的重载
  17. procedure append_proc(t number,a out varchar2) is
  18. begin
  19. a := t||'hello';
  20. end;
  21. --实现函数
  22. function append_fun(t varchar2)
  23. return varchar2 is
  24. begin
  25. v_t := t||'hello';
  26. return v_t;
  27. end;
  28. end;

Oracle存储过程和程序包的更多相关文章

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

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

  2. Oracle基础<4>--程序包

    一:程序包定义(包括1.程序包规范 2.程序包主体) 程序包是一种数据库对象,它是对相关pl/sql 类型.子程序.游标.异常.变量和常量的封装. 1.程序包规范:可以声明类型.变量.常量.异常.游标 ...

  3. oracle 存储过程 包 【转】

    一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...

  4. Oracle程序包

    程序包由两部分构成:规范(specification)和主体(body). 创建表 create table PEOPLE ( ID NUMBER primary key not null, NAME ...

  5. Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包

    子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中.   子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...

  6. Oracle数据库程序包全局变量的应用

    1 前言  在程序实现过程中,经常用遇到一些全局变量或常数.在程序开发过程中,往往会将该变量或常数存储于临时表或前台程序的全局变量中,由此带来运行效率降低<频繁读取临时表>或安全隐患< ...

  7. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  8. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  9. ORACLE 程序包

    程序包由PL/SQL程序元素(变量,类型)和匿名PL/SQL(游标),命名PL/SQL 块(存储过程和函数)组成. 程序包可以被整体加载到内存中,这样可以大大加快程序包中任何一个组成部分的访问速度. ...

随机推荐

  1. LUR和缺页次数

    缺页:缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问. LRU(Least recently used)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问 ...

  2. 本地通信实例(AF_UNIX) (转载)

    转自:http://www.groad.net/bbs/thread-1709-1-1.html 程序说明:  程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信.使用 ...

  3. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(四)图书信息的增删改查

    前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...

  4. Android Studio编写运行测试纯java代码可带main()函数

    问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...

  5. (图论)51NOD 1212 无向图最小生成树

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M ...

  6. Environment中有大量访问目录的函数

    public class Environment { /** * Return root of the "system" partition holding the core An ...

  7. $.each遍历json对象(java将对象转化为json格式以及将json解析为普通对象)

    查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. var json = [ {"id":"1","tagName": ...

  8. Sping Boot返回Json格式自定义

    转载请注明http://www.cnblogs.com/majianming/p/8491020.html 在写项目过程中,遇到了需要定义返回的json字段格式的问题 例如在实体属性中,我有一个字段是 ...

  9. vim快捷键参考

    一. 移动: h,j,k,l: 左,下,上,右. w: 下一个词的词首.W:下一个单词(不含标点). e:下一个词的词尾.E:不含标点. b:上一个词的词首.B:不含标点. <>: v 模 ...

  10. Java 线程实例 刷碗烧水和倒计时

    线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)1 ...