游标,动态,for循环

--小测:输出各部门员工的部门名称和工号、姓名,工资。
  要求:
  各部门工资最高的放在前面
  在“DALLAS”地方的部门名称后加上“*”。
·三种实现方式
1 通过显式游标
2 通过FOR循环
3 通过动态SQL方式

 

 ----------------------------------------显示游标

[sql]  view plain copy
  1. declare  
  2.   type emp_dept is record(  
  3.     name  dept.dname%type,  
  4.     loc   dept.loc%type,  
  5.     empno emp.empno%type,  
  6.     ename emp.ename%type,  
  7.     sal   emp.sal%type);  
  8.   emp_table emp_dept;  
  9.   cursor cur_emp is  
  10.     select d.dname, d.loc, e.empno, e.ename, e.sal  
  11.       from emp e, dept d  
  12.      where d.deptno = e.deptno  
  13.      order by e.deptno, e.sal desc;  
  14. begin  
  15.   open cur_emp;  
  16.   fetch cur_emp  
  17.     into emp_table;  
  18.   loop  
  19.    
  20.     if emp_table.loc = 'DALLAS' THEN  
  21.       dbms_output.put_line(emp_table.loc || '*' || '-->' || emp_table.name ||  
  22.                            '-->' || emp_table.empno || '-->' ||  
  23.                            emp_table.sal);  
  24.     else  
  25.       dbms_output.put_line(emp_table.loc || '-->' || emp_table.name ||  
  26.                            '-->' || emp_table.empno || '-->' ||  
  27.                            emp_table.sal);  
  28.     end if;  
  29.     fetch cur_emp  
  30.       into emp_table;  
  31.     exit when cur_emp%notfound;  
  32.   end loop;  
  33.   close cur_emp;  
  34. end;  
  35.     ----不用if else  
  36.     begin  
  37.        for x in (select(case when d.loc='DALLAS'  
  38.        then d.loc||'*' else d.loc  
  39.         end),d.dname,e.empno,e.ename,e.sal from emp e,dept d where d.deptno=e.deptno order by e.deptno,e.sal desc)  
  40.  loop  
  41.      dbms_output.put_line(x.loc||'-->'||x.dname||'-->'||x.empno||'-->'||x.sal);  
  42.  end loop;  
  43.  END;  
  44.    

------------------------------- for循环

[sql]  view plain copy
  1. begin  
  2.        for x in (select d.dname,d.loc,e.empno,e.ename,e.sal from emp e,dept d where d.deptno=e.deptno order by e.deptno,e.sal desc)  
  3.  loop  
  4.  if x.loc='DALLAS' then  
  5.         x.loc:=x.loc||'*';  
  6.   end if;  
  7.      dbms_output.put_line(x.loc||'-->'||x.dname||'-->'||x.empno||'-->'||x.sal);  
  8.  end loop;  
  9.  END;  

  -------------------------------动态sql

[sql]  view plain copy
  1. <span style="background-color: rgb(255, 255, 255);">declare  
  2.   cursor cur_emp is select d.dname, d.loc, e.empno, e.ename, e.sal  
  3.       from emp e, dept d  
  4.      where d.deptno = e.deptno  
  5.      order by e.deptno, e.sal desc;  
  6.    
  7.   type emp_table_type is table of cur_emp%rowtype index by binary_integer;  
  8.   emp_table emp_table_type;  
  9.   str_sql   varchar2(1000);  
  10. begin  
  11.   str_sql := 'select d.dname, d.loc, e.empno, e.ename, e.sal   
  12.       from emp e, dept d  
  13.      where d.deptno = e.deptno  
  14.      order by e.deptno, e.sal desc';  
  15.   execute immediate str_sql bulk collect into  emp_table;  
  16.   for i in 1 .. emp_table.count  
  17.   loop  
  18.    
  19.     if emp_table(i).loc = 'DALLAS' THEN  
  20.       dbms_output.put_line(emp_table(i).loc || '*' || '-->' || emp_table(i).dname ||  
  21.                            '-->' || emp_table(i).empno || '-->' ||  
  22.                            emp_table(i).sal);  
  23.     else  
  24.       dbms_output.put_line(emp_table(i).loc || '-->' || emp_table(i).dname ||  
  25.                            '-->' || emp_table(i).empno || '-->' ||  
  26.                            emp_table(i).sal);  
  27.     end if;  
  28.    
  29.   end loop;  
  30. end;</span>  

  ----还可以用记录类型来做 如上

你可能感兴趣的:(游标,动态,for循环)