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 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
小汤猿人类15 分钟前
open Feign 连接池(性能提升)
数据库
阳冬园36 分钟前
mysql数据库 主从同步
数据库·主从同步
XiaoH2331 小时前
培训机构Day15
sql·mysql
Mr.132 小时前
数据库的三范式是什么?
数据库
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Python之栈2 小时前
【无标题】
数据库·python·mysql
风_流沙2 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣2 小时前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析