百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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

取消回复欢迎 发表评论: