021.PL-SQL控制结构
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
优 质 教 程 推 荐:👉👉 Python爬虫从入门到入狱系列 合集👈👈
PL-SQL控制结构
- 控制结构
- 条件分支语句
- 循环语句
- 顺序控制结构
控制结构
- 在任何计算机语言(C,JAVA,PASCAL)都有各种控制语句(条件语句、循环结构、顺序控制结构…)。在PL/SQL中也存在这样的控制结构
- 条件分支语句
- 循环结构
- 顺序控制结构
条件分支语句
if...then...
if...then...else...
if...then...elsif...else...
case...when...then...
- 简单条件分支语句<if…then…>
- 案例:编写一个过程,可以输入一个员工姓名,如果该员工工资低于2000,则给该员工工资增加10%
-- 案例:编写一个过程,可以输入一个员工姓名,如果该员工工资低于2000,则给该员工工资增加10% create or replace procedure sp_update_sal(spName varchar2) is v_sal emp.sal%type; beginselect sal into v_sal from emp where ename=spName;-- 判断工资是否低于2000if v_sal<2000 then-- 工资低于2000,则将工资上涨10%update emp set sal=sal*1.1 where ename=spname;commit;end if; end;
- 二重条件分支 <if…then…else…>
- 案例:编写一个过程,属于员工姓名,如果该员工的补助不是0,则在原基础上增加100,如果补助为0,则将补助设为200
create or replace procedure sp_update_comm(spName varchar2) is v_comm emp.comm%type; beginselect comm into v_comm from emp where ename=spname;if nvl(v_comm,0)<>0 thenupdate emp set comm=comm+100 where ename=spname;elseupdate emp set comm=200 where ename=spname;end if;commit; end;
- 多重条件分支 <if…then…elsif…else…>
- 案例:编写一个过程,输入一个员工编号,如果该员工的职位是PRESIDENT就给他的工资增加1000,如果该员工的职位是MANAGER,就给他的工资增加500,如果是其他职位则给他工资增加200
create or replace procedure sp_update_sal2(spno number) is v_job emp.job%type; beginselect JOB into v_job from emp where empno=spno;if v_job='PRESIDENT' thenupdate emp set sal=sal+1000 where empno=spno;elsif v_job='MANAGER' thenupdate emp set sal=sal+500 where empno=spno;elseupdate emp set sal=sal+200 where empno=spno;end if;commit; end;
- 多重条件分支(case…when…then…)
create or replace procedure sp_update_sal2(spno number) is v_job emp.job%type; beginselect JOB into v_job from emp where empno=spno;case v_jobwhen 'PRESIDENT' thenupdate emp set sal=sal+1000 where empno=spno;when 'MANAGER' thenupdate emp set sal=sal+500 where empno=spno;end case;commit; end;
循环语句
loop...end loop
while...loop...end loop
for...loop...end loop<不建议使用>
- Loop循环
- loop循环:至少循环一次。循环一次之后再做判断,是否继续循环
- 案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号从1开始增加
create or replace procedure sp_insert_user(spname varchar2) is -- 定义变量 v_num number:=1; begin-- 执行循环loop-- 执行insert语句insert into users values(v_num,spname);-- 判断是否满足条件,退出循环exit when v_num=10;-- 变量自增v_num:=v_num+1;end loop; end;
- While循环
- 只有满足while条件时,才会执行循环语句
- 案例:编写一个过程,输入用户名,循环添加十个用户到users表中,用户编号从11开始增加
create or replace procedure sp_insert2_users(spname varchar2) is -- 定义变量 v_num number:=11; begin-- 设定循环条件,满足则开始循环while v_num<=20 loop-- 执行insert语句insert into users values(v_num,spname);-- 序号自增v_num:=v_num+1;end loop; end;
- For循环
- for循环中的控制变量i,是在隐含中不停的增加。无法设置步长,所以不建议使用for循环
- 基本语法:
- 正序
for i in 1..10 loopinsert into users values(i,'失心疯') end loop
- 倒序
for i in reverse 1..10 loopinsert into users values(i,'失心疯') end loop
- 案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号从21开始增加
create or replace procedure sp_insert3_users(spname varchar2) is beginfor i in 21..30 loopinsert into users values(i,spname);end loop; end;
- 拓展:for循环无法直接设置步长,但是可以通过if判断+mod函数来实现
- 案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号均为偶数
create or replace procedure sp_insert3_users(spname varchar2) is beginfor i in 1..20 loopif mod(i,2)=0 theninsert into users values(i,spname);end if;end loop; end;
-
顺序控制结构
goto语句
null语句
-
GoTo语句<不建议使用goto语句
- gogo语句:用于跳转到特定标号取执行语句。
- 注意:使用goto语句会增加程序的复杂性,并使得应用程序的可读性变差,所以在做一般应用程序开发时,建议大家不要使用goto语句
- 基本语法:goto lable,其中lable是已经定义好的标号名
- 示例
declare -- 定义变量i,类型为int i int:=1; begin-- 循环结构loop-- 在控制台输出dbms_output.put_line('输出i='||i);if i = 10 then-- goto语句,跳转到指定标号名end_loop处goto end_loop;end if;i:=i+1;end loop;-- 指定标号名<<end_loop>>dbms_output.put_line('循环结束'); end;
-
Null语句
- null语句:null语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高PL/SQL的可读性
- 示例
declare-- 定义变量,用于接收查询结果v_sal emp.sal%type;v_ename emp.ename%type; begin-- 执行查询语句select ename,sal into v_ename,v_sal from emp where deptno=&no;-- 判断工资是否低于3000,如果为真,则执行更新语句if v_sal<3000 thenupdate emp set comm=v_sal*0.1 where ename=v_ename;else-- 添加null语句。什么都不干,只为了提高可读性null;end if; end;