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

时间:2022-04-15 01:11:01

一、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;