一、简介

1.定义

  • 所谓存储过程,就是一段存储在数据库中执行某块业务功能的程序模块。
  • 它是由一段或者多段的PL/SQL代码块或者SQL语句组成的一系列代码块。

2.结构分析

create [or replace] procedure 过程名
( p1 in|out datatype,
p2 in|out datatype,
...
pn in|out datatype )
is/as ....--声明部分 begin ....--过程体 end; PS:标紫色的语句去掉后就是无参形式的存储过程
PS:在调用存储过程时,=>前面的变量为存储过程的形参且必须于存储过程中定义的一致,而=>后的参数为实际参数。当然也不可以不定义变量保存实参。
  例:myDemo04(name=>name,age=>18)这种为正确的形参赋值,不能直接写 myDemo04(name=>name,18),这是错误的写法;

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

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

in|out

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

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

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

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

3、调用分析

假设现在有一个无参存储过程myDemo01(有参存过同理)需要调用

--方式1:声明declare关键字调用
declare
begin
myDemo01;
end; --方式2:不声明declare关键字调用
begin
myDemo01; --在此处也可使用myDemo01();完成存储过程的调用
end; --方式3:使用call存储过程名完成调用,注意括号不能少
call myDemo01(); --方式4:在command命令窗口执行
SQL> set serveroutput on
SQL> exec mydemo01 PS:1、在调用存储过程时,如果存储过程没有参数,调用时括号()可以不带。 2、存储过程带参数需要注意参数的传递参数时的一致性,按顺序依次传递。

二、例子

1.编写存储过程

--创建一个存储过程计算学生某一个课程中成绩在班中的排名,使用存储过程进行计算,返回对应的排名
CREATE OR REPLACE PROCEDURE sp_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.获取该学生的成绩
SELECT
T .score INTO ls_score
FROM
score T
WHERE
T .stuid = p_in_stuid
AND T .courseid = p_in_courseid ; --2.获取成绩比该学生高的人数
SELECT
COUNT (*) INTO ls_pm
FROM
score T
WHERE
T .courseid = p_in_courseid
AND T .score > ls_score ; --3.得到该学生的成绩排名
p_out_pm := ls_pm + 1 ; EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line (
'该学生的课程:' || p_in_courseid || '的成绩在成绩表中找不到'
) ;
END ;

2.调用存储过程

--在SQL窗口执行编译上面的代码,编译成功后,我们就可以调用存储过程来获取学生对应的课程成绩排名了,
--存储过程需要出入参赋值,因此我们可以通过PL/SQL语句块进行测试,代码如下:
declare
ls_pm number;--排名
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; PS:本例中通过||符号达到连接字符串的功能

三、使用存储过程的好处

1、降低总体开发成本。

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

2、增加数据的独立性。

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

3、提高性能。

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

Oracle学习(六)存储过程的更多相关文章

  1. oracle学习 六 删除表空间,数据文件的语句以及导入导出dmp文件的方法(持续更新中)

    要想删除表空间就要先删除数据文件 例如这个例子 CREATE TABLESPACE STHSGIMGDB_SPACE11 DATAFILE 'D:\ORACLEDATABASE\JinHuaDataB ...

  2. Oracle学习(六):子查询

    1.知识点:能够对比以下的录屏进行阅读 SQL> --子查询所要解决的问题:问题不能一步求解 SQL> --查询工资比SCOTT高的员工信息 SQL> --(1)使用普通方法 SQL ...

  3. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  4. Oracle job procedure 存储过程定时任务

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

  5. 【转】Oracle job procedure 存储过程定时任务

    原文:Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相 ...

  6. oracle学习笔记(一)用户管理

    --oracle学习第一天 --连接 @后面连接数据库实例,具体连接到那个数据库 conn scott/tiger@MYORA1; --修改密码 passw; --显示用户 show user; -- ...

  7. oracle学习--循环语句

    oracle学习--循环语句  loop循环: create or replace procedure pro_test_loop is i number; begin i:=0; loop i:=i ...

  8. Oracle学习-Power Designer、visio 2003、Oracle sql developer、OEM、expdp

    Oracle的体系太庞大了.对于刚開始学习的人来说,难免有些无从下手的感觉. 经过一学期的学习对Oracle学习有了一些深入的了解,由于之前学习过Oracle的一些主要的知识.所以学习起来上手比較快一 ...

  9. Oracle学习笔记—数据字典和常用命令(转载)

    转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...

  10. Oracle job procedure 存储过程定时任务(转自hoojo)

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

随机推荐

  1. HTTP基础--网页基础

    网页的组成: 网页可以分为三大部分---HTML,CSS和JavaScript.如果把网页比作一个人的话,HTML相当于骨架,JavaScript相当于肌肉,CSS相当于皮肤,三者结合起来才能形成一个 ...

  2. 【转】python调用youtube-dl实现视频下载

    youtube-dl是一个命令行程序,用于从YouTube.com和更多网站下载视频.它需要Python解释器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中运行. ...

  3. Redis高可用——副本机制

    目录 概念 配置 同步方式 起点 主从握手 部分同步 完全同步 执行完全同步判断条件 完全同步代码实现 为实现Redis服务的高可用,Redis官方为我们提供了副本机制(或称主从复制)和哨兵机制.副本 ...

  4. php利用快递100接口获取物流信息

    PHP使用CURL调用快递100接口查询运单信息 类代码如下: <?php/** * 快递100接口调用类 * @author 齐云海 * date: 2019/05/29 */ class E ...

  5. 1008 Elevator (20 分)(模拟)

    The highest building in our city has only one elevator. A request list is made up with N positive nu ...

  6. 11_Python的69个内置函数详解

    1.内置函数分类 思维导图: https://www.processon.com/view/link/5dcabc48e4b0bd68d813b24f 2.基础数据类型-和数字相关的函数(14) 数据 ...

  7. Git 实用操作:撤销 Commit 提交

    有的时候,改完代码提交 commit 后发现写得实在太烂了,连自己的都看不下去,与其修改它还不如丢弃重写.怎么操作呢? 使用 reset 撤销 如果是最近提交的 commit 要丢弃重写可以用 res ...

  8. leetcode刷题-60第k个队列

    题目 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123""132& ...

  9. IDEA创建新空项目

    IDEA创建新空项目 File -> New -> Project -> Empty Project -> 然后OK 这个是什么都不能做的,然后我们创建Module. File ...

  10. [源码分析] OpenTracing之跟踪Redis

    [源码分析] OpenTracing之跟踪Redis 目录 [源码分析] OpenTracing之跟踪Redis 0x00 摘要 0x01 总体逻辑 1.1 相关概念 1.2 埋点插件 1.3 总体逻 ...