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