当前位置: 代码迷 >> SQL >> SQL Server 事务、错误和游标
  详细解决方案

SQL Server 事务、错误和游标

热度:56   发布时间:2016-05-05 11:52:10.0
SQL Server 事务、异常和游标

--小测:输出各部门员工的部门名称和工号、姓名,工资。
??要求:
??各部门工资最高的放在前面
??在“DALLAS”地方的部门名称后加上“*”。
·三种实现方式
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;

?

?

? 动态sql

?

<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>

?

?

?

?

?

?

  相关解决方案