存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在Oracle 中,若干个有联系的过程可以组合在一起构成程序包。

存储过程的创建

使用CREATE OR REPLACEPROCEDURE命令语法如下:

CREATE [OR REPLACE] PROCEDURE PROCEDURE_name(argument1 [mode1] datatype1,argument2 [mode2] datatype2, …)
IS [AS]PL/SQLBlock;

如上所示,procedure_name 用于指定过程名,argument 用于指定过程参数,IS 或 AS用于开始PL/SQL块。注意,当定义参数时,只能指定数据类型,不能指定长度。

如上图,是员工信息表,现在使用存储过程来修改员工信息,job为CLERK的工资增加10%,job为SALESMAN的工资增加20%,job为ANALYST的工资增加30%,其他员工工资不变,失败则回滚。
使用PLSQL程序设计语言来为它创建一个存储过程。
代码如下:

create or replace procedure update_sal
as--根据主键进行修改u_sal number(7,2) := 0;--修改后的工资
beginfor dump in(select job,empno,sal from emp) loopcasewhen dump.job = 'CLERK' thenu_sal := dump.sal*1.1;when dump.job = 'SALESMAN' thenu_sal := dump.sal*1.2;when dump.job = 'ANALYST' thenu_sal := dump.sal*1.3;elseu_sal := dump.sal;end case;update emp t set t.sal = u_sal where t.empno = dump.empno;end loop;commit;exception when others thenrollback;
end;

新建一个测试窗口,运行上面的代码,成功之后,打开存储过程文件夹---->procedures。我们可以看到新建的存储过程update_sal,右击选择测试。

运行之后查看运行结果,如下图,工资的更新操作已经完成。

这里需要注意的是,定义数据长度时要与数据表的一致或大于数据表,如果存储过程中定义的长度小于表中数据长度时执行不会成功。
在开发中,也经常会编写一个带参数的过程,现在传入2个参数,向部门表dept中插入一笔数据。
首先先查询看一下部门表的信息,如下图:

写一个带参数的存储过程,如果执行成功,返回1,失败则返回0,代码如下:

create or replace procedure
do_insert_dept(dept_name in varchar2,
dept_loc in varchar2,is_success out number)
as
begininsert into dept(deptno,dname,loc)values(scott_squence.nextval,dept_name,dept_loc);commit ;is_success := 1;exception when others thenrollback;is_success:=0;
end do_insert_dept;

按上面所述方法执行,右击存储过程名do_insert_dept,点击测试之后可以填写参数,新增部门dname为销售部,地址loc为山西太原,如下图:

点击运行,如下图,新增成功,返回数据1.

查询部门信息,我们可以看到,数据插入成功了

需要注意的是,由于部门编号是主键,不能出现重复的部门编号,所以我们这里要用到序列。
序列是一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主键值。
关于序列sequence的介绍,可以看这里http://blog.csdn.net/weixin_36380516/article/details/68520098
过程中参数必须符合规范,在一个存储过程中可以传递也可以不传递参数,可以传递一个或者多个参数,和函数是一样,参数的类型有三种:
·in:表示执行过程传入的参数
·out:表示执行过程返回的参数
·in out:表示即可以作为传入的参数,也可以作为返回的参数(不建议使用的)
如果在参数中,定义一个out,一般的开发中,在没有异常发送的情况下,返回1,否则返回0。

在PLSQL Developer中测试成功了,我们也可以使用JDBC来调用它:

public class JDBCTest {//定义数据库驱动程序类public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";//定义数据库连接池public static final String URL = "jdbc:oracle:thin:@localhost:1521:ceshi";//数据库用户public static final String DBNAME = "scott";//用户密码public static final String PASSWORD = "1111";public static void main(String[] args) {Connection conn = null;CallableStatement calls = null;//是用来调用过程和函数的操作接口try {//使用反射机制加载驱动程序Class.forName(DRIVER);//取得连接conn = DriverManager.getConnection(URL, DBNAME, PASSWORD);String sql = "{call do_insert_dept(?,?,?)}";calls= conn.prepareCall(sql);//取得操作对象calls.setString(1,"技术部");calls.setString(2,"山西太原");calls.registerOutParameter(3, java.sql.Types.INTEGER);//注册返回类型calls.execute();//执行int returnNum = cstate.getInt(3);//取得返回结果System.out.println(returnNum);} catch (Exception e) {e.printStackTrace();//打印异常} finally{try {calls.close();conn.close();//连接关闭} catch (Exception ex) {ex.printStackTrace();}}}
}

使用存储过程的优点:
(1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。

  (2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。

  (3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。

  (4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。

使用存储过程的缺点:
(1)可移植性差

(2)如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,这时候操作就比较繁琐了

Oracle存储过程介绍相关推荐

  1. 存储过程while_超详细的Oracle存储过程基础入门介绍

    概述 前面已经对存储过程.函数.包做了个介绍,但是毕竟是写成了一篇,所以没那么细,今天单独介绍一下存储过程基础方面,后面再说遍历什么游标啊,数组啊~ 1.语法 CREATE [OR REPLACE] ...

  2. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  3. Oracle存储过程基本语法介绍-存储过程

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1:  CREATE OR R ...

  4. oracle存储过程、声明变量、for循环|转|

    oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...

  5. oracle存储过程参考资料(网上转载)

    网址一:http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html 给朋友讲解oracle proc的记录: ...

  6. oracle存储过程、声明变量、for循环(转)

    oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...

  7. Oracle存储过程创建及调用(转)

    在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...

  8. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  9. Oracle 存储过程入门

    一,基本入门介绍看创建存储过程的基本定义.注意,带有[]的都是可选的,可有可无的.只是语法能通过,当然根据自己需要 处理.CREATE [OR REPLACE] PROCEDURE procedure ...

最新文章

  1. Netty堆外内存泄露排查与总结
  2. redis 主从切换
  3. 图解Java 开发教程
  4. 账簿登记重要十条规则
  5. 字符串比较strcmp
  6. input自适应_一种Dynamic ReLU:自适应参数化ReLU激活函数(调参记录13)
  7. android design support library最新版,总结一下现在关于Design Support Library的几个博客...
  8. 工业用Linux版本,工业主板支持哪些版本的LINUX系统?
  9. EasyUI 使用图标不显示问题
  10. 经典混响插件免安装+50拓展 – Audio Ease Altiverb 7 XL 7.2.8 WiN
  11. 84行C++代码教你实现洛谷占卜功能
  12. 高校计算机水平能力联合测试成绩,学校关于开展2017年度专业技术职务任职资格评审工作的通知...
  13. Destroying assets is not permitted to avoid data loss.
  14. AirPods pro 连接Macbook pro左耳无声音
  15. 解决Win10系统激活office2019时出现 0xc004f074 无法激活问题,亲测可用!!!
  16. win10专业版使用vmware安装虚拟机时“出现此主机支持Intel VT-x,但Intel VT-x处于禁用状态”。
  17. 操作系统分类及Linux
  18. 【推荐系统】今日头条推荐算法原理全文详解
  19. Cocos2dx游戏开发系列笔记5:继续润色《忍者飞镖射幽灵》
  20. 在StarRocks中建立ClickHouseJDBC外表

热门文章

  1. 垃圾分类逼疯上海人 微信官方终于出手!
  2. 惊了!中国移动互联网用户已达这个数:短视频贡献大
  3. 45W快充没了?三星Galaxy Note10 Pro可能还是25W快充
  4. 易车与中国海洋报社达成深度合作 开拓海洋主题汽车内容
  5. 既稳又狂!黑鲨游戏手机2官宣发布时间:3月18日北京见
  6. 华为确定2019年目标:超三星成全球最大智能手机供应商
  7. 拒绝PPT手机?魅族首款真无孔手机将开启众筹
  8. JavaScript基础(五分钟让你了解js全貌)
  9. python 开源框架学习
  10. linux 虚拟文件系统 源码,Linux内核源代码情状分析-虚拟文件系统