• ql/sql 循环语句、异常处理、事务处理!


    一、ql sql 循环语句?

    /*1.loop循环  
         
        语法:
           声明循环变量
        loop
           判断循环条件 ,如果循环条件不成立,跳出循if 条件表达式 then
        exit;
        end if;
            语句块;
            改变循环变量的值
        end loop;
         
    举例:输出1到100以内的自然
    */
    
    declare
         --声明循环变量
         v_i number(8):=1;
    begin
      loop
        if v_i>100 then-- 判断循环条件,条件成立,跳出循环
           exit;
        end if;
        dbms_output.put_line('输出数字:'||v_i);-- 输出1到100以内的自然数
        v_i:=v_i+1; -- 改变循环变量的值
      end loop;
    end;
    
    --需求:输出部门表的所有内容?
    --into只能用一个或者一行的方式赋值,我们可以用bulk collect into来给行类型变量整体赋值,也就是说可以一次性
    --把所有数据查询出来,为table类型的变量赋值。
    
    declare
    -- 声明table类型
       type dept_table_type is table of dept%rowtype
       index by binary_integer;
    -- 声明table类型的变量,用来存储部门表的所有数据
       v_dept dept_table_type;
    -- 声明循环变量
       v_i number(8):=1;   
    begin
      -- 查询所有部门表的内容,放到v_dept变量中
      select * bulk collect into v_dept from dept;
      loop
       if v_i>v_dept.count then --设置条件 结束循环
        exit;
        end if;
        dbms_output.put_line(
          '部门编号'||v_dept(v_i).deptno||'  部门名称'||v_dept(v_i).dname||'   部门位置'||v_dept(v_i).loc
        );
        v_i:=v_i+1; --改变循环变量的值
      end loop;
        
    end;
    
    /**2.while循环
    
    语法:
      声明循环变量,给循环变量赋初始值
    while 条件表达式
    loop
          语句块;
          改变循环变量的值
    end loop;
    
    举例:输出1到100以内的自然
    
    */
    
    declare
    
        v_i number(6):=1;-- 声明循环变量
    begin
      while v_i<101--如果条件成立,执行循环
        loop
          dbms_output.put_line(v_i);
          v_i:=v_i+1;-- 改变循环变量的值
        end loop;
    end;
    
    
    /**3.for 循环
         
    语法:
             for 循环变量 in 循环变量的开始值..循环变量的结束值
             loop
    语句块;
             end loop;
             
    注意:for循环,循环变量可以直接使用,不用声明。in 包含循环变量的开始值和结束值
    */
    --举例:输出1到100以内的自然
    
    begin
      for v_i in 1..100 -- 循环变量不用声明  真爽!
        loop
          dbms_output.put_line(v_i);
        end loop;
    end;

    二、异常处理

    /**二、异常处理
            直接让用户看到程序的信息是不好的,最好以友好的方式输出出来。
    */
    --1.内置异常  举例:根据员工编号查询员工姓
    
    declare
        --声明员工姓名的变量
      v_ename emp.ename%type;
      v_num number(5);
      
    begin
      v_num:=56565;
      v_num:=465465465;
      select ename into v_ename from emp;
      dbms_output.put_line('员工姓名:'||v_ename);
      
    exception
     -- 当异常发生的时候做什么处理
     when no_data_found then 
       dbms_output.put_line('没有找到该员工编号');
       
     --除数为0的异常
     when zero_divide then  
       dbms_output.put_line('除数不能为0');
     when too_many_rows then
       dbms_output.put_line('返回行数过多');
     when others then
       dbms_output.put_line('出现了其他异常');
      
    end;
    
    
    /**2.自定义异常
    语法:
       declare
       --声明异常变量
    变量名称 exception;
    begin
         --抛出异常
         raise 变量名称;
    exception
         -- 处理异常
         when 变量名称 then
         业务处理
    end;
    */
    --举例:根据员工编号删除员工信息,如果删除的员工不存在,抛出异常,在控制台打印没有删除成功
    
    declare
       -- 声明异常变量
       v_myex exception;  
    
    begin
      -- 根据员工编号删除员工
      delete from emp where empno=&no;
      -- 暂时要用到隐含游标
      if sql%notfound then 
        --抛异常
        raise v_myex;
      end if;
    -- 处理异常 
    exception
      when v_myex then
        dbms_output.put_line('要删除的员工不存在');
      
    
    end;

    三、事物处理

    /**三、事物处理
             事物的acid特性 and 事物的死锁
    */
    
    --1.原子性  数据库增删改操作,要么全部成功,要么全部失败。
    
    /*2.一致性
      对于数据库的操作必须符合业务逻辑。
      张三给李四转1000元,不能出现张三的钱少了1000 李四就收到800*/
    
    /**3.隔离性
        多个数据库操作之间不能产生干扰
      张三给李四转1000元,不能出现张三的钱少了1000,结果另外一个人王五的钱多了1000.
    */
    
    /**4.持久性
      数据库的操作应该是永久持久化到物理介质(硬盘)上
      张三给李四转1000元,不能出现今天张三的钱少了1000. 李四的增加了1000.过了一天张三的钱又回了。
    */
    
    /**5.pl/sql中事物的操作方式
          在pl/sql中,可以定义事物的回顾点,可以回顾事物,也可以定义回滚点
          savepoint 回滚点名称;
          
          回滚事物
          rollback to 回滚点名称;
          
          提交事物
          commit;
          
          举例:往部门表中插入多条数据
    */
    select * from dept;
    begin
      -- 定义事物回滚点
      savepoint a;
      insert into dept values(1,'技术部','郑州');
      insert into dept values(2,'公关部','郑州');
      
      -- 回滚事物
      rollback to a;
      insert into dept values(12,'小卖部','郑州');
      
      -- 提交事物
      commit;
    
    end;
    
    /**6.事物的死锁 
          数据库中事物如果使用不当,有可能会出现死锁的问题。
          爸爸对儿子说,你给我成绩单,我就给你玩具。
          儿子对爸爸说,你给我玩具,我就给你成绩单。
          
       7.oracle中锁的概念
           oracle中使用锁的机制来实现事物。oracle中分两种常见的锁 排他锁,共享锁。
           增删改数据库记录的时候,就会在
           操作记录的行上加上排他锁。查询的时候会在查询的记录上加上共享锁。
    */
    
    select * from dept;
    insert into dept values(21,'技术部','郑州');
    insert into dept values(22,'公关部','郑州');
    
    --模拟两个事物都对  数据库中的部门表1和2 的数据进行更新
    update dept set dname='技术部' where deptno=1;
    update dept set dname='公关部' where deptno=2;
  • 相关阅读:
    链表和数组的区别在哪里 【微软面试100题 第七十八题】
    关于链表问题的面试题目 【微软面试100题 第七十七题】
    复杂链表的复制 【微软面试100题 第七十六题】
    二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】
    数组中超过出现次数一半的数字 【微软面试100题 第七十四题】
    对称字符串的最大长度 【微软面试100题 第七十三题】
    Singleton模式类 【微软面试100题 第七十二题】
    数值的整数次方 【微软面试100题 第七十一题】
    旋转数组中的最小元素 【微软面试100题 第六十九题】
    把数组排成最小的数 【微软面试100题 第六十八题】
  • 原文地址:https://www.cnblogs.com/ZXF6/p/10840298.html
Copyright © 2020-2023  润新知