存储过程是保存可以接受或返回用户提供参数的SQL语句集合。在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装。可以在数据库中定义子程序,然后把子程序存储在数据库服务器,之后通过名称调用。

特点

1 提高性能

存储过程是预先编译过,进行优化后,存储在SQL的内存中,使用的时候不需要重新编译,提高工作效率。

2 减少网络流量

存储过程的代码直接存储在数据库中,用户通过名称进行调用,减小网络流量,加快执行速度。如:百万以上的数据查询,存储过程分页要比其他方式的分页快得多

3 提高安全性

存储过程可以减少SQL注入攻击,提高系统的安全性。执行的过程也受到用户的身份权限控制,因此没有数据操作权限的用户只能在权限控制下间接的存储数据。

4 事务处理机制

在同时进行主从表以及夺标的数据维护和有效性验证时,存储过程比较方便,可以有效地利用SQL的事务处理机制。

5 分离设计编码与使用

使用存储过程,可以实现存储过程设计和编码工作分开进行,只要存储过程名、参数、及返回信息告诉编码人员即可。

6 (缺点)不易移植和修改

使用存储过程封装业务逻辑将限制应用程序的可移植性;另外,如果更改参数或者返回的数据以及类型,需要修改相关的代码,比较繁琐。

语法结构

完整的过程结构如下:

create to replace procedure 过程名 as
声明语句段;
begin
执行语句段;
exception
异常处理语句段;
end;

举例子:

-- 学生表student
create table student(
sno number(6),
sname varchar2(25),
pno number(6) primary key
); -- 存储过程
create or replace procedure stu_proc as
p_name varchar2(25);
begin
select sname into p_name from student where sno=1;
dbms_output.put_line(p_name);
end; -- 调用存储过程
call stu_proc();

关于参数的类型,存储过程大致提供下面几种

无参数的存储过程

定义

create or replace procedure stu_proc as
pname varchar2(25);
begin
select sname into pname from student where sno=1;
dbms_output.put_line(pname);
end;

使用方法为:call stu_proc();

仅有输入参数的过程

create or replace procedure stu_proc1(pno in student.sno%type) as
pname varchar2(25);
begin
select sname into pname from student where sno=pno;
dbms_output.put_line(pname);
end;

使用方法为:call stu_proc1('001')

仅有输出参数的过程

create or replace procedure stu_proc2(pname out student.sname%type) as
begin
select sname into pname from student where sno=1;
dbms_output.put_line(pname);
end;

这种存储过程不能直接用call调用,需要在oracle函数调用。使用方法为:call stu_proc2(name)

有输入、输出的存储过程

create or replace procedure stu_proc3(pname out student.sname%type,pname out student.sname%type) as
begin
select sname into pname from student where sno=pno;
dbms_output.put_line(pname);
end;

使用方法为:call stu_proc3(name,'001')

存储过程的异常处理

为了提高存储过程的健壮性,避免运行错误,建立存储过程时,应该包含异常处理的部分。异常包括预定义异常、非预定义异常和自定义异常。

  • 预定义异常:PL\SQL提供的系统异常
  • 费预定义异常:用于处理与预定义异常无关的Oracle错误
  • 自定义异常:处理Oracle错误之外的一些异常

使用方法:

create or replace procedure stu_proc6(pno in student.sno%type,pname out student.sname%type)
is
begin
select sname into pname from student where sno=pno;
EXCEPTION
when NO_DATA_FOUND then
RAISE_APPLICATION_ERROR
(-20011,'ERROR:不存在!');
end;

常用的异常处理:

命名的系统异常 产生原因
ACCESS_INTO_NULL 定义对象
CASE_NOT_FOUND CASE中未包含相应的WHEN,并且没有设置集合元素的初始化
COLLECTION_IS_NULL 集合元素未初始化
CURSER_ALREADY_OPEN 游标已经打开
DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值
INVALID_CURSOR 在不合法的游标上进行操作
INVALID_NUMBER 内嵌的SQL语句不能讲字符穿换成数字
NO_DATA_FOUND 使用select into 未返回行,或者应用索引表未初始化的
TOO_MANY_ROWS 执行select into,结果集超过一行
ZERO_DIVIDE 除数为0
SUBSCRIPT_BEYOND_COUNT 元素下表超过嵌套表或VARRAY的最大值
SUBSCRIPT_OUTSIDE_LIMIT 使用嵌套类或VARRAY时,将下表指定为负数
VALUE_ERROR 赋值时,变量长度不足以容纳实际数据
LOGIN_DENIED PL\SQL应用连接到oracle时,提供了 不正确的用户名密码
NOT_LOGGED_ON PL\SQL应用程序在没有连接oracle数据的情况下访问数据
PROGRAM_ERROR PL\SQL内部问题,可能需要重装数据字典
ROWTYPE_MISMATCH 主游标变量与PLSQL游标变量的返回类型不兼容
SELF_IS_NULL 使用对象类型时,在null对象上调用对象方法
STORAGE_ERROR 运行PL\SQL时,超出内存空间
SYS_INVALIDE_ID 无效的ROWID字符串
TIMEOUT_ON_RESOURCE Oracle在等待资源连接超时

存储过程与函数的区别

在定义上

定义的名称这个就不说了,一个是FUNCTION,一个是PROCEDURE;

  • 存储过程的参数列表有输入参数、输出参数、输入输出参数
  • 函数的参数只有输入参数,最后会加上一个return返回值。

在返回值上

  • 存储过程的返回值,可以有多个
  • 函数的返回值只有一个

调用方式上

  • 存储过程的调用方式有:exec、execute、语句块调用
  • 函数的调用方式有:可以在函数块中、也可以直接在sql中使用,比如:
create or replace function add_three_numbers
(
a NUMBER:=0,b NUMBER:=0,c NUMBER:=0
)
return number is
begin
return a+b+c;
end; select add_three_numbers(1,2,3) from dual;

事务处理

  • 1 事务用于确保数据的一致性,要么全部确认,要不全部取消。
  • 2 档执行事务操作的时候,Oracle会作用在表上加锁,防止其他的用户改变表。同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作
  • 3 执行事务提交或者事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁

参考

1 Oracle存储过程

Java程序员的日常——存储过程知识普及的更多相关文章

  1. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  2. Java程序员的日常——经验贴(纯干货)

    工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...

  3. JAVA程序员必须要学习的知识

    Java是热门的语言之一,TIOBE编程语排名Java排名第二,仅在C语言之后.Java可以用来开发web应用和桌面应用,更重要的是Java具有跨平台性:write once, run everywh ...

  4. Java程序员必须掌握的知识

    1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项, ...

  5. Java程序员的日常—— 《编程思想》关于类的使用常识

    Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...

  6. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  7. Java程序员的日常—— Properties文件的读写

    在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...

  8. Java程序员的日常 —— 多进程开发

    最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...

  9. Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比

    早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今 ...

随机推荐

  1. rbx1 package 下载安装过程

    学习INSTALLING THE ROS-BY-EXAMPLE CODE,是书中第五章的内容,如果我们按照上一篇教程执行过了,就可以直接进入第五章,安装一个叫rbx1的包.这个包里面包括了本书中用到的 ...

  2. 对象序列化成Json字符串 及 反序列化成对象

    一. public static string JsonSerializer<T>(T t)        {            DataContractJsonSerializer ...

  3. Linux的.a、.so和.o文件

    在说明Linux的.a..so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的.lib是静 ...

  4. localStorage, localforage, web sql三者的比较

    最近的项目中用到了前端存储,最初选用的是localStorage,这个是html5里面新增的API,用法很简单.setItem getItem clear. 值得注意的是,localStorage中存 ...

  5. NRF24L01--使用STM32F103

    看了两天的24l01的相关资料了,一直有点模糊,今天下午感觉有点懂了,在板子上调试成功了,但是还没进行通讯测试.stm32和arduino进行通信还没成功 ,:( 先把stm32的NRF24L01配置 ...

  6. [转]Liunx上安装svn客户端

    [转]Liunx上安装svn客户端 虽然说很简单的用yum install subversion就可以将svn安装到系统中,但是yum库中的版本实在是有点低——1.4.2.因此我选择以源码方式安装.安 ...

  7. Software Testing hw3

    (a):可绘制出如下图所示的流程图 (b):对于测试用例t1=(n=3)和t2=(n=5),MAXPRIMES = 4时,t1不能检查出错误,而t2则会发生数组越界错. (c):要使测试路径不通过wh ...

  8. 快速排序-java

    排序-快速排序 基本思想: 将数据划分为两部分,左边的所有元素都小于右边的所有元素:然后,对左右两边进行快速排序. 划分方法: 选定一个参考点(中间元素),所有元素与之相比较,小的放左边,大的放右边. ...

  9. 甲乙(数理逻辑)转自http://www.cnblogs.com/devymex/p/3329635.html

    这是一道历史悠久,又很困难的面试题. 你在旁观主持人和甲.乙两个天才数学家玩猜数字游戏.主持人准备了两个数,告知甲乙:这两个数不同,且大于等于1,小于等于30.然后主持人将两数之积告诉甲,把两数之和告 ...

  10. 用canvas制作酷炫射击游戏--part3

    今天介绍下 游戏中的sprite模块,也就是构建玩家及怪物的模块.有了这个模块,就可以在咱们的游戏里加入人物了. 想必用过css的朋友都知道sprite,一种将需要加载的图片拼接在一张图里以减少请求的 ...