Oracle SQL(五)

7. 存储过程

7.1 简介

7.1.1 定义

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

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

7.1.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 :中间编写的就是存储过程的具体操作。

7.1.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、存储过程带参数需要注意参数的传递参数时的一致性,按顺序依次传递。

7.2 例子

7.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 ;

7.2.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:本例中通过||符号达到连接字符串的功能

7.3 使用存储过程的好处

7.3.1 降低总体开发成本。

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

7.3.2 增加数据的独立性。

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

7.3.3 提高性能。

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



Oracle SQL(五)

原文地址:https://www.cnblogs.com/cy-8593/p/12559320.html

时间: 2024-08-04 15:54:07

Oracle SQL(五)的相关文章

ORACLE SQL练习(五)

--日期转换为字符串 SELECT DATE_HIRE, TO_CHAR(DATE_HIRE, 'Month dd yyyy') HIRE FROM EMPLOYEE_PAY_TBL; SELECT EMPLOYEE_TBL.EMP_ID, EMPLOYEE_TBL.LAST_NAME, EMPLOYEE_PAY_TBL.POSITION FROM EMPLOYEE_TBL, EMPLOYEE_PAY_TBL WHERE EMPLOYEE_TBL.EMP_ID = EMPLOYEE_PAY_TB

oracle sql优化

第一掌 避免对列的操作 任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数.计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数. 例1:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢: select * from record where  substrb(CardNo,1,4)='5378'(13秒) select * from record where  amount/30< 1000(11秒) select * from recor

Oracle SQL执行计划基线总结(SQL Plan Baseline)

一.基础概念 Oracle 11g开始,提供了一种新的固定执行计划的方法,即SQL plan baseline,中文名SQL执行计划基线(简称基线),可以认为是OUTLINE(大纲)或者SQL PROFILE的改进版本,基本上它的主要作用可以归纳为如下两个: 1.稳定给定SQL语句的执行计划,防止执行环境或对象统计信息等等因子的改变对SQL语句的执行计划产生影响! 2.减少数据库中出现SQL语句性能退化的概率,理论上不允许一条语句切换到一个比已经执行过的执行计划慢很多的新的执行计划上! 注意:

使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g

ORACLE官方提供的Sql Developer自带的Oracle Migration Workbench. 什么是Oracle SQL Developer?在官方页面上,是这样介绍它的: Oracle SQL Developer is a free and fully supported graphical tool for database development. With SQL Developer, you can browse database objects, run SQL st

oracle sql语句大全

ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约束中指定的条件是否得到了满足. UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的. PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束. POREIGN KEY (外部键)--通过使用公共列在

Oracle SQL tuning 步骤

Oracle SQL tuning 步骤 SQL是的全称是Structured Query Language(结构化查询语言).SQL是一个在80年代中期被使用的工业标准数据库查询语言.不要把SQL语言与商业化产品如Microsoft SQL server或开源产品MySQL相混淆.所有的使用SQL缩略词的这些都是SQL标准的一部分. 一.SQL tuning之前的调整    下面这个粗略的方法能够节省数千小时乏味的SQL tuning,因为一旦调整它将影响数以百计的SQL查询.记住,你必须优先

Oracle-01-数据库分类/oracle sql*plus常用命令

一.数据库分类 一.数据库分类1.小型数据库:access.foxbase2.中型数据库:informix.sql server.mysql3.大型数据库:sybase.db2.oracle 二.项目中如何合理地使用数据库,可以依据如下三个方面入手1.项目的规模a.负载量有多大,即用户数有多大b.成本c.安全性 eg.小型数据库1.负载量小,用户大概100人之内比如:留言板.信息管理系统2.成本在千元之内3.对安全性要求不高 中型数据库比如负载量 日访问量5000~10000成本在万元内比如商务

Oracle SQL语言基础及环境准备_超越OCP精通Oracle视频教程培训26

Oracle SQL语言基础及环境准备_超越OCP精通Oracle视频教程培训26 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第1/5套:SQL语言之基础入门及环境准备.主要学习Oracle数据库SQL语言基础介绍.PL/SQL语言介绍.数据库SQL对象与数据类型介绍.SQL语言实战环境准备等. Oracle SQL语言之基础及环境准备,课程内容详细如下: Oracle数据库SQL语言基础介绍Oracle数据

Oracle SQL语言DDL和对象管理_超越OCP精通Oracle视频教程培训27

Oracle SQL语言DDL和对象管理_超越OCP精通Oracle视频教程培训27 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第2/5套:Oracle SQL语言DDL和对象管理.主要学习Oracle数据库模式对象和表中可用的数据类型,表/临时表的创建与使用,索引/约束的创建与管理,视图/同义词/序列的创建和使用,触发器/存储过程/包的创建和使用. Oracle SQL语言DDL和对象管理,课程内容详细如下