oracle pl分支,循环,控制(oracle循环执行过程)
mhr18 2024-10-02 16:45 100 浏览 0 评论
一、pl/sql的进阶--控制结构
在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构。
在本部分学习完成后,希望大家达到:
1.使用各种if语句
2.使用循环语句
3.使用控制语句——goto和null(goto语句不推荐使用);
二、条件分支语句
pl/sql中提供了三种条件分支语句if—then,if–then–else,if–then–else if–then。
这里我们可以和java语句进行一个比较。
1)、简单的条件判断if–then
问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。
SET serveroutput ON; CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS --定义 V_SAL EMP.SAL%TYPE; BEGIN --执行 SELECT SAL INTO V_SAL FROM EMP WHERE ENAME = SPNAME; --判断 IF V_SAL < 2000 THEN UPDATE EMP SET SAL = SAL + SAL * 0.1 WHERE ENAME = SPNAME; COMMIT; END IF; END; / --调用存储过程 exec SP_PRO6('ALLEN');
2)、二重条件分支 if–then–else
问题:编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200;
CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS --定义 V_COMM EMP.COMM%TYPE; BEGIN --执行 SELECT COMM INTO V_COMM FROM EMP WHERE ENAME = SPNAME; --判断 IF V_COMM <> 0 THEN UPDATE EMP SET COMM = COMM + 100 WHERE ENAME = SPNAME; ELSE UPDATE EMP SET COMM = COMM + 200 WHERE ENAME = SPNAME; END IF; COMMIT; END; / --调用存储过程 exec SP_PRO6('ALLEN');
3)、多重条件分支 if–then–ELSIF–then
问题:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER 就给他的工资增加500,其它职位的雇员工资增加200。
CREATE OR REPLACE PROCEDURE SP_PRO6(SPNO NUMBER) IS --定义 V_JOB EMP.JOB%TYPE; BEGIN --执行 SELECT JOB INTO V_JOB FROM EMP WHERE EMPNO = SPNO; IF V_JOB = 'PRESIDENT' THEN UPDATE EMP SET SAL = SAL + 1000 WHERE EMPNO = SPNO; ELSIF V_JOB = 'MANAGER' THEN UPDATE EMP SET SAL = SAL + 500 WHERE EMPNO = SPNO; ELSE UPDATE EMP SET SAL = SAL + 200 WHERE EMPNO = SPNO; END IF; COMMIT; END; / --调用存储过程 exec SP_PRO6(7499);
三、循环语句–loop
是pl/sql中最简单的循环语句,这种循环语句以loop开头,以end loop结尾,这种循环至少会被执行一次。
案例:现有一张表users,表结构如下:
用户vid | 用户名 uname
CREATE TABLE USERS( vid NUMBER(5), uname VARCHAR2(30) );
请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加。
CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS --定义 :=表示赋值 V_NUM NUMBER := 1; BEGIN LOOP INSERT INTO USERS VALUES (V_NUM, SPNAME); --判断是否要退出循环 EXIT WHEN V_NUM = 10; --自增 V_NUM := V_NUM + 1; END LOOP; COMMIT; END; / --调用存储过程 EXEC SP_PRO6('ALLEN');
四、循环语句–while循环
基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以while...loop开始,以end loop 结束。
案例:现有一张表users,表结构如下:
用户vid | 用户名 uname
问题:请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。
CREATE OR REPLACE PROCEDURE SP_PRO6(SPNAME VARCHAR2) IS --定义 :=表示赋值 V_NUM NUMBER := 11; BEGIN WHILE V_NUM <= 20 LOOP --执行 INSERT INTO USERS VALUES (V_NUM, SPNAME); V_NUM := V_NUM + 1; END LOOP; COMMIT; END; / --调用存储过程 EXEC SP_PRO6('ALLEN');
五、循环语句–for循环
基本for循环的基本结构如下
CREATE OR REPLACE PROCEDURE SP_PRO6 IS--注意如果无参记得不要加() BEGIN FOR I IN REVERSE 1 .. 10 LOOP --REVERSE反转函数,表示I从10到1递减,去掉REVERSE表示I从1到10递增 INSERT INTO USERS VALUES (I, 'shunping'); END LOOP; END; / --调用存储过程 EXEC SP_PRO6;
我们可以看到控制变量i,在隐含中就在不停地增加。
六、顺序控制语句–goto、null
1)、goto语句
goto语句用于跳转到特定符号去执行语句。注意由于使用goto语句会增加程序的复杂性,并使得应用程序可读性变差,所以在做一般应用开发时,建议大家不要使用goto语句。
基本语法如下goto lable,其中lable是已经定义好的标号名
set serveroutput on; DECLARE I INT := 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE('输出i=' || I); IF I = 1 THEN GOTO END_LOOP; END IF; I := I + 1; END LOOP; <<END_LOOP>> DBMS_OUTPUT.PUT_LINE('循环结束'); END; /
2)、null语句
null语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高pl/sql的可读性。
SET serveroutput ON; DECLARE V_SAL EMP.SAL%TYPE; V_ENAME EMP.ENAME%TYPE; BEGIN SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM EMP WHERE EMPNO = &NO; IF V_SAL < 3000 THEN UPDATE EMP SET COMM = SAL * 0.1 WHERE ENAME = V_ENAME; dbms_output.put_line('1111'); ELSE NULL; dbms_output.put_line('2222');--不会被执行 END IF; END; /
RNG输了,致敬RNG~
相关推荐
- Vmware虚拟机迁移数据库时踩过的坑
-
从Vmware迁移数据库虚拟机到其他平台,起来后认不到asm盘,不禁傻眼了。很多时候为了保证虚拟机系统的完整可启动,在做任何变更前,领导都会要求克隆一份镜像保存,或者直接在镜像上操作。这是传统的备份理...
- Java 中 java.util.Date 与 java.sql.Date 有什么区别?
-
Java里的java.util.Date和java.sql.Date绝对是那种看起来不起眼但能搞得你Debug到半夜的“坑王”。我们先从表面上看,java.sql.Date是继承自j...
- 主流数据库的不同点在哪?MySQL和SQL Server的区别介绍
-
在本教程中,树懒君介绍了两种最普遍应用的RDBMS—MySQL和MicrosoftSQLServer。通过介绍MySQL和SQLServer的几个关键区别,希望大家能在这两者之间做出最适合自己的...
- Java安全-Java Vuls(Fastjson、Weblogic漏洞复现)
-
复现几个Java的漏洞,文章会分多篇这是第一篇,文章会分组件和中间件两个角度进行漏洞复现复现使用环境VulhubVulFocus组件Fastjson1.2.24反序列化RCEFastJson...
- 电影业的数据泄露灾难剧:黑客公开索尼影业泄露文件清单
-
自称GOP(代表GuardiansofPeace,和平卫士)的黑客组织近日入侵了索尼影业的计算机网络,在索尼雇员的电脑屏幕上弹出一个骷髅头像(题图)。黑客还劫持了索尼影业几部电影的Twitter账...
- 黑客入侵系统第一步“信息收集”过程详解
-
记一次黑客大牛的信息收集,不看后悔!!!1.操作系统收集方法操作系统:Windows和Linux大小写敏感Windows大小写不敏感:如果一个文件存在大小写,名字一致,在Windows上面,它是一个...
- 黑客暗示攻击索尼影业借助内部人员的配合
-
本周一,由于自称“和平卫士”(GOP)的黑客组织发起的攻击,索尼影业被迫关闭其企业网络。和平卫士通过劫持索尼雇员的工作站以威胁这个娱乐巨头。最新的消息显示,和平卫士通过物理访问索尼网络以获得攻击的成功...
- 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》
-
又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!注:这份神技是由内部十余名Ja...
- 国产化红利到底在哪?好多人都在瞎折腾
-
单位信创改造折腾了足足三轮,当中科可控的天阔T40扔给过来时,原本准备通宵改代码的手突然闲了——这货居然直接跑起了Oracle数据库,连驱动都不用重装!这场国产替代马拉松,C86路线的生态碾压局才是隐...
- 重庆移动营业库闪存阵列上线(重庆移动专项营业厅)
-
本报讯为更好地提供系统支撑能力、保障业务连续性,近日,重庆移动上线营业库全闪存阵列,实施底层硬件平台的升级。据悉,重庆移动引进了EMC最新的XtremIO全闪存存储阵列技术。通过传输中心的大力配合,打...
- 对不起委内瑞拉 你的钱一文不值(2021委内瑞拉还欠多少钱)
-
报道,委内瑞拉的经济正在崩溃。该国的货币玻利瓦尔,已经一文不值。就在一个月前,1美元可兑换279玻利瓦尔,对于委内瑞拉来说,这已经很凄凉了。但是,根据非官方汇率,眼下1美元可兑换408玻利瓦尔。反过来...
- 国产数据库的AWR差在哪了?(国产数据库对比)
-
昨天我发了篇文章,是因为一大早看到有个客户发来让我帮忙分析的一份AWR报告。几分钟看完,就基本上抓住了主要问题。整个过程行云流水,点点深入,用来分析问题十分顺畅。而阅读国产数据库的所谓的“AWR报...
- 印度:圣烟、后殖民贵族和带枪的舞者
-
印度是神庙的海洋。无论豪街陋巷,狭窄小径,均能见到不同规模、精致粗糙不一的神庙,有的甚至只有垃圾桶这么大,摆在路口。虔诚的教徒经过这里会停下来,躬身摸一下雕像,再用沾了神性的手点下自己的眉心,继续上路...
- 盘点Java中最没用的知识⑧:这3个过时套路,你还在代码里硬撑?
-
一、Vector与Hashtable:“线程安全”的过时标签,为何成了性能绊脚石?你是否在老代码里见过"Vector.add()"或"Hashtable.get()"这...
- 全面学习 MySQL 基础知识(mysql基础知识总结)
-
MySQL是一种关系型数据库管理系统,它被广泛应用于各种类型的应用程序中,包括Web应用程序、企业应用程序、移动应用程序等等。MySQL的优点包括高性能、可靠性、扩展性和安全性。本篇教程将介绍MyS...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)