Oracle存储过程总结(一、基本应用)

2023-11-13

1、创建存储过程

create or replace procedure test(var_name_1 in type,var_name_2 out type) as

--声明变量(变量名 变量类型)

begin

--存储过程的执行体

end test;

打印出输入的时间信息

E.g:

create or replace procedure test(workDate in Date) is

begin

dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd'));

end test;

2、变量赋值

变量名 := 值;

E.g:

create or replace procedure test(workDate in Date) is

x number(4,2);

 begin

 x := 1;

end test;

3、判断语句:

if 比较式 then begin end; end if;

E.g

create or replace procedure test(x in number) is

begin

        if x >0 then

         begin

        x := 0 - x;

        end;

    end if;

    if x = 0 then

       begin

        x: = 1;

    end;

    end if;

end test;

4、For 循环

For ... in ... LOOP

--执行语句

end LOOP;

(1)循环遍历游标

create or replace procedure test() as

Cursor cursor is select name from student; name varchar(20);

begin

for name in cursor LOOP

begin

 dbms_output.putline(name); 

end;

end LOOP;

end test;

(2)循环遍历数组

 create or replace procedure test(varArray in myPackage.TestArray) as

--(输入参数varArray 是自定义的数组类型,定义方式见标题6)

i number;

begin

i := 1;  --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。因为在Oracle中本是没有数组的概念的,数组其实就是一张

--表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历

for i in 1..varArray.count LOOP     

dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));   

 end LOOP;

end test;

5、While 循环

while 条件语句 LOOP

begin

end;

end LOOP;

E.g

create or replace procedure test(i in number) as

begin

while i < 10 LOOP

begin    

 i:= i + 1;

end;

end LOOP;

 end test;

6、数组

首先明确一个概念:Oracle中本是没有数组的概念的,数组其实就是一张表(Table),每个数组元素就是表中的一个记录。

使用数组时,用户可以使用Oracle已经定义好的数组类型,或可根据自己的需要定义数组类型。

(1)使用Oracle自带的数组类型

x array; --使用时需要需要进行初始化

e.g:

create or replace procedure test(y out array) is

 x array;  

 begin

x := new array();

y := x;

end test;

(2)自定义的数组类型 (自定义数据类型时,建议通过创建Package的方式实现,以便于管理)

E.g (自定义使用参见标题4.2) create or replace package myPackage is

  -- Public type declarations   type info is record(     name varchar(20),     y number);

  type TestArray is table of info index by binary_integer;   --此处声明了一个TestArray的类型数据,其实其为一张存储Info数据类型的Table而已,及TestArray 就是一张表,有两个字段,一个是

name,一个是y。需要注意的是此处使用了Index by binary_integer 编制该Table的索引项,也可以不写,直接写成:type TestArray is

table of info,如果不写的话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray();

end TestArray;

7.游标的使用 Oracle中Cursor是非常有用的,用于遍历临时表中的查询结果。其相关方法和属性也很多,现仅就常用的用法做一二介绍:

(1)Cursor型游标(不能用于参数传递)

create or replace procedure test() is  

cusor_1 Cursor is select std_name from student where  ...;  --Cursor的使用方式1   cursor_2 Cursor;

begin

select class_name into cursor_2 from class where ...;  --Cursor的使用方式2

可使用For x in cursor LOOP .... end LOOP; 来实现对Cursor的遍历

end test;

(2)SYS_REFCURSOR型游标,该游标是Oracle以预先定义的游标,可作出参数进行传递

create or replace procedure test(rsCursor out SYS_REFCURSOR) is

cursor SYS_REFCURSOR; name varhcar(20);

begin

OPEN cursor FOR select name from student where ... --SYS_REFCURSOR只能通过OPEN方法来打开和赋值

LOOP

 fetch cursor into name   --SYS_REFCURSOR只能通过fetch into来打开和遍历 exit when cursor%NOTFOUND;              --SYS_REFCURSOR中可使用三个状态属性:                                         ---%NOTFOUND(未找到记录信息) %FOUND(找到记录信息)                                         ---%ROWCOUNT(然后当前游标所指向的行位置)

 dbms_output.putline(name);

end LOOP;

rsCursor := cursor;

end test;

下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:

现假设存在两张表,一张是学生成绩表(studnet),字段为:stdId,math,article,language,music,sport,total,average,step                   一张是学生课外成绩表(out_school),字段为:stdId,parctice,comment

通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A,就在总成绩上加20分。

create or replace procedure autocomputer(step in number) is

rsCursor SYS_REFCURSOR;

commentArray myPackage.myArray;

math number;

article number;

language number;

music number;

sport number;

total number;

average number;

stdId varchar(30);

record myPackage.stdInfo;

i number;

begin

i := 1;

get_comment(commentArray); --调用名为get_comment()的存储过程获取学生课外评分信息

OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;

LOOP

fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND;

total := math + article + language + music + sport;

for i in 1..commentArray.count LOOP 

 record := commentArray(i);    

if stdId = record.stdId then  

 begin     

 if record.comment = &apos;A&apos; then     

  begin         

 total := total + 20;   

   go to next; --使用go to跳出for循环       

  end;    

end if;  

end;  

end if;

end LOOP;

<<continue>>  average := total / 5;

 update student t set t.total=total and t.average = average where t.stdId = stdId;

end LOOP;

end;

end autocomputer;

--取得学生评论信息的存储过程

create or replace procedure get_comment(commentArray out myPackage.myArray) is

rs SYS_REFCURSOR;

record myPackage.stdInfo;

stdId varchar(30);

comment varchar(1);

i number;

begin

open rs for select stdId,comment from out_school

i := 1;

LOOP

 fetch rs into stdId,comment; exit when rs%NOTFOUND;

record.stdId := stdId;

 record.comment := comment;

recommentArray(i) := record;

i:=i + 1;

end LOOP;

end get_comment;

--定义数组类型myArray

create or replace package myPackage is begin

type stdInfo is record(stdId varchar(30),comment varchar(1));

type myArray is table of stdInfo index by binary_integer;

end myPackage;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle存储过程总结(一、基本应用) 的相关文章

随机推荐

  • docker + ngrok + nginx内网穿透访问本地,方便本地调试

    ngrok客户端生成 docker run rm it e DOMAIN jiadays com v root ngrok myfiles hteen ngrok bin sh build sh 对应生成的目录 bin ngrokd 服务端
  • hadoop 的 namenode 宕机如何解决

    先分析宕机后的损失 宕机后直接导致client无法访问 内存中的元数据丢失 但是硬盘中的元数据应该还存在 如果只是节点挂了 重启即可 如果是机器挂了 重启机器后看节点是否能重启 不能重启就要找到原因修复了 但是最终的解决方案应该是在设计集群
  • wedo2.0编程模块介绍_wedo2.0课程包

    实例简介 开放性实验的视觉概述 16课时实验课程 包含生命科学 宇宙科学 物质科学 技术与工程 b11 We20简介 欢迎使用乐高教育WeD20 课程包 本章主要介绍产品操作的基本步骤 15V 们Wa02简介 乐高教育W2课程包 乐高教育W
  • 【Python】学生管理系统——详细解释+代码+详细注释(课设必过)

    带你编写学生管理系统 Python 很多学生在学校学习完Python 就要做一个课设考验你对知识的掌握程度 这次就教大家如何来用Python来实现一个学生管理系统 对学生管理系统的分析 学生管理系统是对学生信息的学生信息的增删查改 另外如需
  • DOS下执行robotframework脚本

    在当前python环境中的路径添加pybot bat文件 文件中添加 Echo off python m robot run 启动时添加路径即可 pybot 项目路径
  • python自动化办公--QQ发送邮件包含中文名附件

    python自动化办公 本节目标 python调用QQ邮箱API发送邮件 本节内容 自动化定时发送邮件 本节技术点 smtplib datetime 本节阅读需要 15 min 本节实操需要 20 min 文章目录 python自动化办公
  • 田忌赛马

    田忌赛马 问题描述 中国古代的历史故事 田忌赛马 是为大家所熟知的 话说齐王和田忌又要赛马了 他们各派出N匹马 每场比赛 输的一方将要给赢的一方200两黄金 如果是平局的话 双方都不必拿出钱 现在每匹马的速度值是固定而且已知的 而齐王出马也
  • 玩转Netty – 从Netty3升级到Netty4

    这篇文章主要和大家分享一下 在我们基础软件升级过程中遇到的经典Netty问题 当然 官方资料 也许是一个更好的补充 另外 大家如果对Netty及其Grizzly架构以及源码有疑问的 欢迎交流 后续会为大家奉献我们基于Grizzly和Nett
  • java基础之String类

    String类里面的内容必须会 必须熟悉 public final class String 字符串是一个特殊的对象 这个类不能有子类 String s new String 与String s1 是等价的 String s1 abc s1
  • 基于CH340的一键下载电路

    一 CH340简介 CH340 是一个 USB 总线的转接芯片 实现 USB 转串口或者 USB 转打印口 CH340是国产芯片 应用场合居多 市场占有率很高 常用的USB转串口芯片还有CP2102 PL2303 FT232等 相比之下CH
  • Vue的页面跳转与刷新

    Vue刷新页面 在开发的过程中 有时候我们需要刷新整个页面 this router go 0 Vue页面跳转 例如 在用户登录成功之后跳转到系统首页 this router push home
  • 基础算法题——虫洞(简单版、vector)

    虫洞 简单 题目链接 解题步骤 求出第 i 个星球作为中心子星系时 f i 的大小 对每个 i 与 n f i 异或后的结果相加 再对998244353取模即可得到答案 问题关键点 求第 i 个星球 f i 的大小 个人解题思路 暴力 利用
  • cpython下载_一、Python简介及下载安装

    一 关于Python Python是目前比较受欢迎的脚本语言之一 具有简洁性 易读性以及可扩展性的特点 Python与Java均可以写网页 也可以写后台功能 区别是Python执行效率低 开发效率高 而Java执行效率高 开发效率低 pyt
  • Linux--vim安装、简介、模式及命令

    目录 1 vim简介 1 命令模式转为插入模式 2 命令模式转为末行模式 3 转换图 4 vim常用命令 复制 删除 1 删除 2 拷贝 3 粘贴 4 撤销 5 恢复撤销 6 替换 7 光标移动 1 行开头 2 行末尾 3 最后一行 4 第
  • SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

    在跨公司销售业务中 跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中 所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心 事务代码 0KEM 配置步骤 1 创建一个新的替代 2 创建一个步骤 3 维护一个先
  • 华为数通方向HCIP-DataCom H12-831题库(单选题:1-20)

    第1题 关于IPSG下列说法错误的是 A IPSG可以防范IP地址欺骗攻击 B IPSG是一种基于三层接口的源IP地址过滤技术 C IPSG可以开启IP报文检查告警功能 联动网管进行告警 D 可以通过IPSG防止主机私自更改IP地址 答案
  • 更改默认滚动条的样式

    在前端开发的过程中 通常会需要更改滚动条的默认样式 代码如下 webkit scrollbar 滚动条整体样式 width 4px 高宽分别对应横竖滚动条的尺寸 height 1px webkit scrollbar thumb 滚动条里面
  • echarts前后端交互数据_Web的前后端交互

    1503年 列奥纳多 达 芬奇回到佛罗伦萨 开始绘制 蒙娜丽莎 耗时四年 塑造了资本主义上升时期一位城市有产阶级的妇女形象 将自己内心的的妇女通过画卷展示给了众人 期间无数的灵感 无数的情绪 无数的状态这是大家不能所得知的 更不用说付出的心
  • MAC系统 批量删除一个项目中的所有.svn

    打开终端 进入项目所在的文件夹 使用命令find type d name svn xargs rm rvf就可将项目的 svn全部删除
  • Oracle存储过程总结(一、基本应用)

    1 创建存储过程 create or replace procedure test var name 1 in type var name 2 out type as 声明变量 变量名 变量类型 begin 存储过程的执行体 end tes