我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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%
sql-- 案例:编写一个过程,可以输入一个员工姓名,如果该员工工资低于2000,则给该员工工资增加10% create or replace procedure sp_update_sal(spName varchar2) is v_sal emp.sal%type; begin select sal into v_sal from emp where ename=spName; -- 判断工资是否低于2000 if 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
sqlcreate or replace procedure sp_update_comm(spName varchar2) is v_comm emp.comm%type; begin select comm into v_comm from emp where ename=spname; if nvl(v_comm,0)<>0 then update emp set comm=comm+100 where ename=spname; else update emp set comm=200 where ename=spname; end if; commit; end;
- 多重条件分支 <if...then...elsif...else...>
-
案例:编写一个过程,输入一个员工编号,如果该员工的职位是PRESIDENT就给他的工资增加1000,如果该员工的职位是MANAGER,就给他的工资增加500,如果是其他职位则给他工资增加200
sqlcreate or replace procedure sp_update_sal2(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;
-
多重条件分支(case...when...then...)
sqlcreate or replace procedure sp_update_sal2(spno number) is v_job emp.job%type; begin select JOB into v_job from emp where empno=spno; case v_job when 'PRESIDENT' then update emp set sal=sal+1000 where empno=spno; when 'MANAGER' then update 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开始增加
sqlcreate 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开始增加
sqlcreate 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循环
-
基本语法:
- 正序
sqlfor i in 1..10 loop insert into users values(i,'失心疯') end loop
- 倒序
sqlfor i in reverse 1..10 loop insert into users values(i,'失心疯') end loop
-
案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号从21开始增加
sqlcreate or replace procedure sp_insert3_users(spname varchar2) is begin for i in 21..30 loop insert into users values(i,spname); end loop; end;
-
拓展:for循环无法直接设置步长,但是可以通过if判断+mod函数来实现
-
案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号均为偶数
sqlcreate or replace procedure sp_insert3_users(spname varchar2) is begin for i in 1..20 loop if mod(i,2)=0 then insert into users values(i,spname); end if; end loop; end;
-
顺序控制结构
goto语句
null语句
-
GoTo语句<不建议使用goto语句
-
gogo语句:用于跳转到特定标号取执行语句。
-
注意:使用goto语句会增加程序的复杂性,并使得应用程序的可读性变差,所以在做一般应用程序开发时,建议大家不要使用goto语句
-
基本语法:goto lable,其中lable是已经定义好的标号名
-
示例
sqldeclare -- 定义变量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的可读性
- 示例
sqldeclare -- 定义变量,用于接收查询结果 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 then update emp set comm=v_sal*0.1 where ename=v_ename; else -- 添加null语句。什么都不干,只为了提高可读性 null; end if; end;