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...
  1. 简单条件分支语句<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;
  1. 二重条件分支 <if...then...else...>
  • 案例:编写一个过程,属于员工姓名,如果该员工的补助不是0,则在原基础上增加100,如果补助为0,则将补助设为200

    sql 复制代码
    create 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;
  1. 多重条件分支 <if...then...elsif...else...>
  • 案例:编写一个过程,输入一个员工编号,如果该员工的职位是PRESIDENT就给他的工资增加1000,如果该员工的职位是MANAGER,就给他的工资增加500,如果是其他职位则给他工资增加200

    sql 复制代码
    create 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;
  1. 多重条件分支(case...when...then...)

    sql 复制代码
    create 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<不建议使用>
  1. Loop循环

    • loop循环:至少循环一次。循环一次之后再做判断,是否继续循环
    • 案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号从1开始增加
    sql 复制代码
    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;
  2. While循环

    • 只有满足while条件时,才会执行循环语句

    • 案例:编写一个过程,输入用户名,循环添加十个用户到users表中,用户编号从11开始增加

      sql 复制代码
      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;
  3. For循环

    • for循环中的控制变量i,是在隐含中不停的增加。无法设置步长,所以不建议使用for循环

    • 基本语法:

      • 正序
      sql 复制代码
      for i in 1..10 loop
        insert into users values(i,'失心疯')
      end loop
      • 倒序
      sql 复制代码
      for i in reverse 1..10 loop
        insert into users values(i,'失心疯')
      end loop
    • 案例:编写一个过程,可输入用户名,并循环添加十个用户到users表中,用户编号从21开始增加

      sql 复制代码
      create 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表中,用户编号均为偶数

      sql 复制代码
      create 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语句
  1. GoTo语句<不建议使用goto语句

    • gogo语句:用于跳转到特定标号取执行语句。

    • 注意:使用goto语句会增加程序的复杂性,并使得应用程序的可读性变差,所以在做一般应用程序开发时,建议大家不要使用goto语句

    • 基本语法:goto lable,其中lable是已经定义好的标号名

    • 示例

      sql 复制代码
      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;
  2. Null语句

    • null语句:null语句不会执行任何操作,并且会直接将控制传递到下一条语句。使用null语句的主要好处是可以提高PL/SQL的可读性
    • 示例
    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 then
        update emp set comm=v_sal*0.1 where ename=v_ename;
      else
        -- 添加null语句。什么都不干,只为了提高可读性
        null;
      end if;
    end;
相关推荐
高兴就好(石2 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆2 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下3 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss4 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk4 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK4 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D4 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
Flerken1014 小时前
数据库语言、SQL语言、数据库系统提供的两种语言
数据库·sql·oracle
掘根4 小时前
【网络】高级IO——poll版本TCP服务器
网络·数据库·sql·网络协议·tcp/ip·mysql·网络安全