oracle存储过程高级,Oracle学习(六)SQL高级--存储过程

一、简介

1.定义

所谓存储过程,就是一段存储在数据库中执行某块业务功能的程序模块。

它是由一段或者多段的PL/SQL代码块或者SQL语句组成的一系列代码块。

2.结构分析

create [or replace] procedure过程名

( p1in|out datatype,

p2in|out datatype,

...

pnin|out datatype

)is....--声明部分

begin....--过程体

end;

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

2、procedure :创建存储过程的命令。

3、in|out:存储过程具有入参和出参两种参数选择,in表示的是入参,out表示的是出参。

在使用过程的时候,入参必须得有对应的变量传入,出参得有对应的变量接收。

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

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

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

例子:

1.编写存储过程

--创建一个存储过程计算学生某一个课程中成绩在班中的排名,使用存储过程进行计算,返回对应的排名

CREATE OR REPLACE PROCEDUREsp_score_pm (--学号

p_in_stuid IN VARCHAR2,--课程ID

p_in_courseid IN VARCHAR2,--排名

p_out_pm out NUMBER)IS

--过程中使用的声明变量:成绩

ls_score NUMBER := 0;--过程中使用的声明变量:成绩比该学生高的人数

ls_pm NUMBER := 0;BEGIN

--1.获取该学生的成绩

SELECTT .scoreINTOls_scoreFROMscore TWHERET .stuid=p_in_stuidAND T .courseid =p_in_courseid ;--2.获取成绩比该学生高的人数

SELECT

COUNT (*) INTOls_pmFROMscore TWHERET .courseid=p_in_courseidAND T .score >ls_score ;--3.得到该学生的成绩排名

p_out_pm := ls_pm + 1;

EXCEPTIONWHEN no_data_found THENdbms_output.put_line ('该学生的课程:' || p_in_courseid || '的成绩在成绩表中找不到') ;END ;

2.调用存储过程

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

declarels_pmnumber;--排名

begin

--学号SC201801001的学生成绩排名

sp_score_pm('SC201801001','R20180101',ls_pm);

dbms_output.put_line('学号:SC201801001,课程号:R20180101 的成绩排名是:'||ls_pm);

sp_score_pm('SC201801001','R20180102',ls_pm);

dbms_output.put_line('学号:SC201801001,课程号:R20180102 的成绩排名是:'||ls_pm);--学号SC201801002的学生成绩排名

sp_score_pm('SC201801002','R20180101',ls_pm);

dbms_output.put_line('学号:SC201801002,课程号:R20180101 的成绩排名是:'||ls_pm);

sp_score_pm('SC201801002','R20180102',ls_pm);

dbms_output.put_line('学号:SC201801002,课程号:R20180102 的成绩排名是:'||ls_pm);end;

二、使用存储过程的好处

1、降低总体开发成本。

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

2、增加数据的独立性。

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

3、提高性能。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值