课程表

Oracle 基础教程

Oracle 进阶教程

Oracle PL/SQL

Oracle OEM

Oracle 备份和恢复

Oracle RAC

工具箱
速查手册

Oracle 存储过程

当前位置:免费教程 » 数据库/运维 » Oracle

Oracle存储过程在实际数据库开发过程当中会经常使用到,作为一个数据库开发者必备的技能,它有着SQL语句不可替代的作用。所谓存储过程,就是一段存储在数据库中执行某块业务功能的程序模块。它是由一段或者多段的PL/SQL代码块或者SQL语句组成的一系列代码块。

创建Oracle存储过程语法:

  1. create [or replace] procedure 过程名
  2. ( p1 in|out datatype,
  3.   p2 in|out datatype,
  4.   ...
  5.   pn in|out datatype
  6.      
  7. ) is 
  8.      
  9.     ....--声明部分
  10.  
  11.     begin
  12.      
  13.     ....--过程体
  14.  
  15.     end;

语法解析:

1、procedure 关键字是创建存储过程的命令。

2、create [or replace] :如果存储过程已经存在则覆盖替代原有的过程。

3、in|out :存储过程具有入参和出参两种参数选择,in表示的是入参,out表示的是出参,在使用过程的时候,入参必须得有对应的变量传入,出参得有对应的变量接收。

4、datatype表示出入参变量对应的数据类型。

5、is后面跟着的是过程当中使用到的声明变量。

6、begin...end 中间编写的就是存储过程的具体操作。


例子1、创建一个存储过程计算学生某一个课程中成绩在班中的排名,使用存储过程进行计算,返回对应的排名,代码如下:

  1. create or replace procedure sp_score_pm(
  2. p_in_stuid in varchar2,--学号
  3. p_in_courseid in  varchar2, --课程ID
  4. p_out_pm out number--排名
  5. )
  6. is
  7. ls_score number:=0;
  8. ls_pm number:=0;
  9. begin
  10.   --获取该学生的成绩
  11.   select t.score into ls_score from score t
  12.    where t.stuid = p_in_stuid
  13.      and t.courseid = p_in_courseid;
  14.   --获取成绩比该学生高的人数
  15.   select count(1) into ls_pm from score t
  16.    where t.courseid = p_in_courseid
  17.    and  t.score>ls_score;
  18.    --得到该学生的成绩排名
  19.    p_out_pm:=ls_pm+1;
  20. exception
  21.   when no_data_found  then
  22.      dbms_output.put_line('该学生的课程:'||p_in_courseid|| '的成绩在成绩表中找不到');
  23. end;

通过上面的代码,我们可以直接在SQL窗口执行编译,编译成功后,我们就可以调用存储过程来获取学生对应的课程成绩排名了,存储过程需要出入参赋值,因此我们可以通过PL/SQL语句块进行测试,代码如下:

  1. declare
  2. ls_pm number;--排名
  3. begin
  4.   --SC201801001
  5.   sp_score_pm('SC201801001','R20180101',ls_pm);
  6.   dbms_output.put_line('学号:SC201801001,课程号:R20180101 的成绩排名是:'||ls_pm);
  7.   sp_score_pm('SC201801001','R20180102',ls_pm);
  8.   dbms_output.put_line('学号:SC201801001,课程号:R20180102 的成绩排名是:'||ls_pm);
  9.   --SC201801002
  10.   sp_score_pm('SC201801002','R20180101',ls_pm);
  11.   dbms_output.put_line('学号:SC201801002,课程号:R20180101 的成绩排名是:'||ls_pm);
  12.   sp_score_pm('SC201801002','R20180102',ls_pm);
  13.   dbms_output.put_line('学号:SC201801002,课程号:R20180102 的成绩排名是:'||ls_pm);
  14.    
  15. end;

结果如下:

1.jpg

存储过程的作用

存储过程的编写相对比较复杂,但是在实际系统开发过程中,还是利用过程来处理一些特定的业务功能,把业务逻辑编写在过程当中。它有哪些优势呢?

1、降低总体开发成本。存储过程把实际执行的业务逻辑PL/SQL块和多条SQL语句封装到存储过程当中,其它开发者只需要调用写好的过程,获取想要的结果,不需要重新理解业务。把业务抽取出来由专门的人来编写。

2、增加数据的独立性。它的作用和视图的作用类似,假如表的基础数据发生变化,我们只需要修改过程当中的代码,而不需要修改调用程序。使得用户程序不需要直接面对基础数据进行编写代码。使得代码内聚程度更高,耦合度更低。

3、提高性能。实际开发过程中,一个业务模块功能的开发可能需要用到多个SQL语句,多个PL/SQL程序块才能解决问题。把它编写进过程,Oracle只需要一次编译,以后随时可以调用。如果不使用过程,直接把许多SQL语句写进程序当中,需要多次编译,而且需要多次连接数据库,大大的降低了性能。


转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号