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;
相关推荐
南城花随雪。3 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了4 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度6 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮8 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康2 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...2 小时前
索引(MySQL)
数据库·mysql·索引