Oracle存储过程和程序包
一、为什么要用存储过程?
如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程。通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能。
二、过程的优点?
1、预编译:存储过程预先编译好放在数据库内,减少编译语句所花的时间。
2、缓存:预编译的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其它次数的执行速度会明显提高。
3、减少网络传输:特别是对于一些处理数据的存储过程,不必像直接使用SQL语句那样多次传送数据到客户端。
4 、可维护性高:更新存储过程通常要比更改、测试和部署应用程序需要的时间和精力要少。
5、代码的重用:一个可以重用的存储过程可以应用到应用程序的多个位置。
6、增强安全性:通过对用户授权对存储过程的访问权限,它们可以提供对特定数据的访问;提高数据安全性,来防止SQL注入。
三、缺点:
1、如果需要对存储过程的输入输出参数做更改的话,还要更改程序。
2、可移植性差:因为存储过程将应用程序的业务处理绑定到数据库中,以此使用存储过程来处理业务逻辑限制了应用程序的可移植性。
四、创建存储过程
- --1、简单的存储过程
- create or replace procedure procedure_test
- (p_id in varchar,p_status out varchar) --p_id为输入参数 ,p_status为输出参数
- as
- t_name varchar2(20);
- t_count number:=0;
- begin
- select votetitle,vatesum into t_name,t_count from votemaster where id=p_id; --注意:此处没有:来赋值
- if t_count <=0 then
- p_status:= t_name||':差';
- elsif t_count >0 and t_count <3 then
- p_status:= t_name||':良好';
- else
- p_status:= t_name||':优秀';
- end if;
- end;
- --执行
- declare
- out_param varchar2(50);
- begin
- procedure_test('1',out_param);
- dbms_output.put_line(out_param);
- end;
- --2、带游标的存储过程
- create or replace procedure procedure_cursor_test
- (p_id in varchar2,p_status out varchar2)
- as
- vote votemaster%rowtype; --声明一个对象(votemaster)类型的对象
- cursor my_cur is select * from votemaster; --声明一个游标并填充数据
- begin
- open my_cur; --打开游标
- loop
- fetch my_cur into vote ; --循环游标,并放入对象
- exit when my_cur%notfound; --如果没有数据,则直接exit
- if vote.id=p_id then
- p_status := vote.votetitle||':'||vote.vatesum;
- --如果想终止循环,可以直接exit;
- end if;
- end loop;
- close my_cur; --关闭游标
- end;
- --执行
- declare
- out_param varchar2(50);
- begin
- procedure_cursor_test('1',out_param);
- dbms_output.put_line(out_param);
- end;
五、程序包
1、程序包:包是一组相关过程、函数、变量、游标、常量等PL/SQL程序设计元素的组合。它具有面向对象程序设计语言的特点,是对这些PL/SQL程序设计元素的封装。包类似于C++或Java程序中的类,而变量相当于类中的成员变量,过程和函数相当于方法,把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。与类相同,包中的程序元素也分为公用元素和私有元素两种,这两种元素的区别是他们允许访问的程序范围不同,即他们的作用域不同。公用元素不仅可以被包中的函数、过程调用,也可以被包外的PL/SQl块调用。而私有元素只能被该包内部的函数或过程调用。
2、使用程序包的优点:在PL/SQL设计中,使用包不仅可以使程序模块化,对外隐藏包内所使用的信息,而写程序包可以提高程序的运行效率。因为,当程序首次调用程序包内部的函数或过程时,Oracle将整个程序包调入内存,当再次调用程序包中的元素时,Oracle直接从内存中读取,而不需要进行磁盘的IO操作,从而使程序的执行效率提高。
3、一个程序包分为两部分组成:
(1)、包定义:包定义部分声明包内数据类型、变量、常量、游标、子程序和函数等元素,这些元素为包的共有元素。
(2)、包主体:包主题则定义了包定义部分的具体实现,在包主体中还可以声明和实现私有元素。
- --包定义
- create or replace package t_package
- is
- --定义过程
- procedure append_proc(t varchar2,a out varchar2);
- --过程的重载
- procedure append_proc(t number,a out varchar2);
- --定义函数
- function append_fun(t varchar2) return varchar2;
- end;
- --包主题
- create or replace package body t_package
- is
- v_t varchar2(30);
- --私有成员函数
- function private_fun(t varchar2) return varchar2 is
- begin
- v_t := t||'hello';
- return v_t;
- end;
- --实现过程
- procedure append_proc(t varchar2,a out varchar2) is
- begin
- a := t||'hello';
- end;
- --过程的重载
- procedure append_proc(t number,a out varchar2) is
- begin
- a := t||'hello';
- end;
- --实现函数
- function append_fun(t varchar2)
- return varchar2 is
- begin
- v_t := t||'hello';
- return v_t;
- end;
- end;
Oracle存储过程和程序包的更多相关文章
- oracle 存储过程,存储函数,包,
http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...
- Oracle基础<4>--程序包
一:程序包定义(包括1.程序包规范 2.程序包主体) 程序包是一种数据库对象,它是对相关pl/sql 类型.子程序.游标.异常.变量和常量的封装. 1.程序包规范:可以声明类型.变量.常量.异常.游标 ...
- oracle 存储过程 包 【转】
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
- Oracle程序包
程序包由两部分构成:规范(specification)和主体(body). 创建表 create table PEOPLE ( ID NUMBER primary key not null, NAME ...
- Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包
子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中. 子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...
- Oracle数据库程序包全局变量的应用
1 前言 在程序实现过程中,经常用遇到一些全局变量或常数.在程序开发过程中,往往会将该变量或常数存储于临时表或前台程序的全局变量中,由此带来运行效率降低<频繁读取临时表>或安全隐患< ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- ORACLE 程序包
程序包由PL/SQL程序元素(变量,类型)和匿名PL/SQL(游标),命名PL/SQL 块(存储过程和函数)组成. 程序包可以被整体加载到内存中,这样可以大大加快程序包中任何一个组成部分的访问速度. ...
随机推荐
- EF7学习资料整理
EntityFramework 7 开发纪录 http://www.cnblogs.com/xishuai/archive/2014/11/28/ef7-develop-note.html Entit ...
- 10款Web开发最佳的Python框架
Python是跻身于当代IT世界最流行和代码最高效的编程语言之一.Python框架能帮助你快速启动Web应用. 1.CubicWeb CubicWeb的最重要的功能是其代码的可重用性,由一个个代码单元 ...
- 【黑金教程笔记之006】【建模篇】【Lab 05 SOS信号之一】—笔记
sos_module.v是产生SOS信号的功能模块.即有次序的输出莫斯码:点.画.间隔.control_module.v是一个定时触发器,每一段时间使能sos_module.v. 模块: /***** ...
- Swift4 可选型, 可失败的构造函数
创建: 2018/02/25 完成: 2018/02/26 更新: 补充类内可选型属性不初始化自动设为nil [任务表]TODO 可选型 可选型与nil 可选型声明方法 var 属性: 类型? / ...
- E20180218-hm-xa
更新: 2019/02/19 原来忘记分类,把此博文归入单词类 vocabulary n. (某一语言的) 词汇; (尤指外语教科书中附有释义的) 词汇表; grammar n. 语法; 语法书; ...
- MySQL(调优慢查询、explain profile) 转
转自http://www.linuxidc.com/Linux/2012-09/70459.htm mysql profile explain slow_query_log分析优化查询 在做性能测试中 ...
- HDU2262;Where is the canteen(高斯消元+期望)
传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...
- phpStudy安装配置小记
一.phpStudy简介 该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的PHP调试环境·该程序不 ...
- bzoj 1613: [Usaco2008 Jan]Running贝茜的晨练计划【dp】
设f[i][j]为第i分钟疲劳j,从三种情况转移,记得休息的时候判断从i开始休息到n能不能恢复到疲劳0 #include<iostream> #include<cstdio> ...
- bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...