--小测:输出各部门员工的部门名称和工号、姓名,工资。
·三种实现方式
1 通过显式游标
2 通过FOR循环
3 通过动态SQL方式
- declare
- type emp_dept is record(
- name dept.dname%type,
- loc dept.loc%type,
- empno emp.empno%type,
- ename emp.ename%type,
- sal emp.sal%type);
- emp_table emp_dept;
- cursor cur_emp is
- 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;
- begin
- open cur_emp;
- fetch cur_emp
- into emp_table;
- loop
- if emp_table.loc = 'DALLAS' THEN
- dbms_output.put_line(emp_table.loc || '*' || '-->' || emp_table.name ||
- '-->' || emp_table.empno || '-->' ||
- emp_table.sal);
- else
- dbms_output.put_line(emp_table.loc || '-->' || emp_table.name ||
- '-->' || emp_table.empno || '-->' ||
- emp_table.sal);
- end if;
- fetch cur_emp
- into emp_table;
- exit when cur_emp%notfound;
- end loop;
- close cur_emp;
- end;
- ----不用if else
- begin
- for x in (select(case when d.loc='DALLAS'
- then d.loc||'*' else d.loc
- 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)
- loop
- dbms_output.put_line(x.loc||'-->'||x.dname||'-->'||x.empno||'-->'||x.sal);
- end loop;
- END;
------------------------------- for循环
- begin
- 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)
- loop
- if x.loc='DALLAS' then
- x.loc:=x.loc||'*';
- end if;
- dbms_output.put_line(x.loc||'-->'||x.dname||'-->'||x.empno||'-->'||x.sal);
- end loop;
- END;
- <span style="background-color: rgb(255, 255, 255);">declare
- cursor cur_emp is 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;
- type emp_table_type is table of cur_emp%rowtype index by binary_integer;
- emp_table emp_table_type;
- str_sql varchar2(1000);
- begin
- str_sql := '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';
- execute immediate str_sql bulk collect into emp_table;
- for i in 1 .. emp_table.count
- loop
- if emp_table(i).loc = 'DALLAS' THEN
- dbms_output.put_line(emp_table(i).loc || '*' || '-->' || emp_table(i).dname ||
- '-->' || emp_table(i).empno || '-->' ||
- emp_table(i).sal);
- else
- dbms_output.put_line(emp_table(i).loc || '-->' || emp_table(i).dname ||
- '-->' || emp_table(i).empno || '-->' ||
- emp_table(i).sal);
- end if;
- end loop;
- end;</span>