oracle第四章循环分支语句练习

--1.使用记录变量的方式插入部门一条记录;
select * from dept;
declare
v_dept dept%rowtype;
begin
  v_dept.deptno := 99;
  v_dept.dname := 'hanhan';
  v_dept.loc := 'pipi';
  insert into dept values (v_dept.deptno,v_dept.dname,v_dept.loc);
end;
--2.使用for循环查询出各个部门工资最高的雇员信息的名称;
--第一种
select e.*,d.dname from emp e,dept d where e.deptno=d.deptno and (e.deptno,e.sal) in (select deptno,max(sal) from emp group by deptno);
declare
type mvps is record(
 ename emp.ename%type,
 sal emp.sal%type,
 dname dept.dname%type
);
mvp mvps;
begin
  for mvp in (select e.*,d.dname from emp e,dept d where e.deptno=d.deptno and (e.deptno,e.sal) in (select deptno,max(sal) from emp group by deptno))
    loop 
      dbms_output.put_line('姓名:'||mvp.ename||' 工资:'||mvp.sal||' 部门:'||mvp.dname);
    end loop;
end;

--第二种
--查询各个部门拿最高工资的员工
--循环各个部门
--循环到哪个部门就求出哪个部门的最高工资
--求出该部门中拿最高工资的员工,然后放到数组里,进行遍历
--输出部门信息,以及拿最高工资的员工信息

declare
type emparray is table of emp%rowtype index by binary_integer;
v_max emp.sal%type;
emps emparray;
begin
  for d in (select * from dept)loop
    --当前循环部门的最高工资
  select max(sal) into v_max from emp where deptno = d.deptno;
  --求出该部门中拿最高工资的员工,然后放到数组里,进行遍历
  select * bulk collect into emps from emp 
  where deptno = d.deptno and sal = v_max;
  --输出部门
  dbms_output.put_line(d.deptno||'-->'||d.dname);
  --输出部门下的那最高工资的员工
  if emps.count>0 then
    --输出员工
    for i in emps.first..emps.last loop
      dbms_output.put_line(emps(i).ename||'--'||emps(i).sal);
    end loop;
   else
     dbms_output.put_line('该部门下么有员工!');
  end if; 
  
  dbms_output.put_line('============================================');
   end loop;
end;
--3.使用case  when then end 对员工的工资进行级别的划分;
  --大于等于5000,精英;
  --大于等于4000,小于5000,高级;
  --大于等于2500--4000,中等;
  --小于2500 属于底薪;
select ename,sal,(case
 when sal>=5000 then '精英'
 when sal>=4000 and sal<5000 then '高级'
 when sal>=2500 and sal<4000 then '中等'
 when sal<2500 then '底薪'
 end) lv from emp;
--4.使用loop  while  for 输出五遍 '武汉加油!'
--(1)loop
declare
 v_i number(2) := 1;
begin
  loop
    exit when v_i>5;
    dbms_output.put_line('武汉加油');
    v_i := v_i+1;
  end loop;
end;
--(2)while
declare
 v_i number(2) := 1;
begin
  while v_i<=5
    loop
      dbms_output.put_line('武汉加油');
      v_i := v_i+1;
    end loop;
end;
--(3)for
declare
 v_i number(2) := 1;
begin
  for v_i in 1..5
    loop
      dbms_output.put_line('武汉加油');
    end loop;
end;
--5.使用table 以及for循环实现部门表3条数据的插入操作;
select * from dept;
delete from dept where deptno not in (10,20,30,40);

declare
 type depttable is table of dept%rowtype index by binary_integer;
 v_i number(2) := 1;
 depts depttable;
begin
  depts(1).deptno := '21';
  depts(1).dname := 'z21';
  depts(2).deptno := '22';
  depts(2).dname := 'z22';
  depts(3).deptno := '23';
  depts(3).dname := 'z23';
  for v_i in 1..3 loop
    insert into dept(deptno,dname) values (depts(v_i).deptno,depts(v_i).dname);
  end loop;
end;


--6.使用两种方式遍历所有部门信息;
select * from dept;
declare
depts dept%rowtype;
begin
  for depts in (select * from dept) loop
    dbms_output.put_line('编号:'||depts.deptno||' 名称:'||depts.dname);
  end loop;
end;

declare
type depttable is table of dept%rowtype index by binary_integer;
v_i number(2) := 1;
v_max number(2);
depts depttable;
begin
  select count(*) into v_max from dept;
  select * bulk collect into depts from dept;
  loop
    exit when v_i>v_max;
    dbms_output.put_line('编号:'||depts(v_i).deptno||' 名称:'||depts(v_i).dname);
    v_i := v_i+1;
  end loop;
end;
--7.自己定义一个查无此人的异常;
declare
 v_ex exception;
begin
  delete dept where deptno=99;
  if sql%notfound then
    raise v_ex;
  end if;
exception
  when v_ex then dbms_output.put_line('gaj');
end;

你可能感兴趣的:(oracle第四章循环分支语句练习)