首页 > 数据库 >10.Oracle存储过程

10.Oracle存储过程

时间:2022-12-15 17:23:00浏览次数:49  
标签:10 存储 -- score ls Oracle 过程 pm

1.Oracle存储过程

语法结构

create [or replace] procedure 过程名
( p1 in|out datatype,
  p2 in|out datatype,
  ...
  pn in|out datatype 
) is 
    ....--声明部分
begin
    ....--过程体
end;

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

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

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

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

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

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

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

create or replace procedure sp_score_pm(
p_in_stuid in varchar2,--学号
p_in_courseid in  varchar2, --课程ID
p_out_pm out number--排名
)
is
ls_score number:=0;
ls_pm number:=0;
begin
  --获取该学生的成绩
  select t.score into ls_score from score t
   where t.stuid = p_in_stuid
     and t.courseid = p_in_courseid;
  --获取成绩比该学生高的人数
  select count(1) into ls_pm from score t
   where t.courseid = p_in_courseid
   and  t.score>ls_score;
   --得到该学生的成绩排名
   p_out_pm:=ls_pm+1;
exception
  when no_data_found  then
     dbms_output.put_line('该学生的课程:'||p_in_courseid|| '的成绩在成绩表中找不到');
end;

通过上面的代码,我们可以直接在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;

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

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

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

标签:10,存储,--,score,ls,Oracle,过程,pm
From: https://www.cnblogs.com/mxx520/p/16985596.html

相关文章

  • 9.Oracle创建函数
    1.Oracle创建函数Oracle创建函数是通过PL/SQL自定义编写的,通过关键字function按照自己的需求把复杂的业务逻辑封装进PL/SQL函数中,函数提供一个返回值,返回给使用者。组成部......
  • 11.Oracle游标
    Oracle游标简介:Oracle游标是通过关键字CURSOR的来定义一组Oracle查询出来的数据集,类似数组一样,把查询的数据集存储在内存当中,然后通过游标指向其中一条记录,通过循环游标达......
  • ASEMI肖特基二极管MBR10100FCT图片,MBR10100FCT大小
    编辑-ZASEMI肖特基二极管MBR10100FCT参数:型号:MBR10100FCT最大重复峰值反向电压(VRRM):100V最大RMS电桥输入电压(VRMS):70V最大直流阻断电压(VDC):100V最大平均正向整流输出电......
  • 104. 二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null......
  • LeetCode HOT 100:旋转图像
    题目:48.旋转图像题目描述:给你一个正方形矩阵数组,将其中的所有元素都顺时针旋转90度,得到旋转之后的矩阵数组。本题要求必须在原地修改,不能使用额外空间。思路:看到这个......
  • SVN的配置和使用 整合VS10
    1.配置SVN服务器 1.1安装subversion(跨平台版本管理服务器) 1.2建立仓库reposity   命令:svnadmincreated:/reposity   利用Tortoise图形工具,创建仓......
  • oracle 建表时表空间的一些参数pctfree initrans maxtrans storage的含义
    createtableX_SMALL_AREA(idx_idNUMBER(20)notnull,pss_idx_idNUMBER(20),update_logVARCHAR2(512),update_dateDATE,constrai......
  • (转载)[Oracle]11g内存占用调整步骤(解决内存占用过大问题)
    开发用的电脑,内存升级到了40G,发现Oracle服务占用内存特别大,甚至高达9个G,搜索了以下,貌似是因为Oracle默认设置占用内存是内存的1/8,照这个数看应该是指物理内存加虚拟......
  • win10系统弹出“数据执行保护(DEP)”提示框的解决方法
    原文链接:https://www.xitongcheng.com/jiaocheng/win10_article_14570.html很多用户在win10系统中运行某些程序时,都遇到了“数据执行保护(DEP)”的提示窗口,该是怎么回事呢?其......
  • 2022-2023-1 20221020漆心雨《 缓冲区溢出实验》
    缓冲区溢出实验一、实验简介缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意......