? 说明:该程序中将字段内容垂直排列。V_count变量记录循环次数,即部门个数。? 【训练4】? 已知每个部门有一个经理,编写程序,统计输出部门名称、部门总人数、总工资和部门经理。? 输入并执行如下程序:?
Sql代码?
- SET?SERVEROUTPUT?ON? ??
- DECLARE??
- ?v_deptno?number(8); ??
- ?v_count?number(3); ??
- ?v_sumsal?number(6); ??
- ?v_dname??varchar2(15); ??
- v_manager??varchar2(15); ??
- ?CURSOR?list_cursor?IS??
- ???SELECT?deptno,count(*),sum(sal)?FROM?emp?group?by?deptno; ??
- BEGIN??
- ??OPEN?list_cursor;? ??
- ??DBMS_OUTPUT.PUT_LINE(‘-----------?部?门?统?计?表?-----------‘); ??
- DBMS_OUTPUT.PUT_LINE(‘部门名称???总人数??总工资???部门经理‘); ??
- ??FETCH?list_cursor?INTO?v_deptno,v_count,v_sumsal;? ??
- ??WHILE?list_cursor%found?LOOP?? ??
- ?SELECT?dname?INTO?v_dname?FROM?dept ??
- ????WHERE?deptno=v_deptno; ??
- ????SELECT?ename?INTO?v_manager?FROM?emp? ??
- ????WHERE?deptno=v_deptno?and?job=‘MANAGER‘; ??
- DBMS_OUTPUT.PUT_LINE(rpad(v_dname,13)||rpad(to_char(v_count),8) ??
- ??????||rpad(to_char(v_sumsal),9)||v_manager); ??
- ????FETCH?list_cursor?INTO?v_deptno,v_sumsal;? ??
- ????END?LOOP; ??
- ????????DBMS_OUTPUT.PUT_LINE(‘--------------------------------------‘); ??
- ????????CLOSE?list_cursor; ??
- ????????END;??
输出结果为:?
Sql代码?
- --------------------?部?门?统?计?表?-----------------???
- ????????部门名称?????总人数??总工资?????部门经理 ??
- ????????ACCOUNTING????3??????8750???????CLARK ??
- ????????RESEARCH??????5?????10875???????JONES ??
- ????????SALES?????????????6??????9400???????BLAKE ??
- ????????-------------------------------------------------------------???
- ????????PL/SQL?过程已成功完成。???
说明:游标中使用到了起分组功能的SELECT语句,统计出各部门的总人数和总工资。再根据部门编号和职务找到部门的经理。该程序假定每个部门有一个经理。? 【训练5】? 为雇员增加工资,从工资低的雇员开始,为每个人增加原工资的10%,限定所增加的工资总额为800元,显示增加工资的人数和余额。? 输入并调试以下程序:?
Sql代码?
- SET?SERVEROUTPUT?ON? ??
- DECLARE? ??
- ??V_NAME?CHAR(10); ??
- ??V_EMPNO?NUMBER(5); ??
- ??V_SAL?NUMBER(8); ??
- ??V_SAL1?NUMBER(8); ??
- ??V_TOTAL?NUMBER(8)?:=?800;?????--增加工资的总额???
- V_NUM?NUMBER(5):=0;?????--增加工资的人数???
- ?????????CURSOR?emp_cursor?IS? ??
- ??????????SELECT?EMPNO,ENAME,SAL?FROM?EMP?ORDER?BY?SAL?ASC; ??
- ????????BEGIN??
- ?????????OPEN?emp_cursor; ??
- ????????DBMS_OUTPUT.PUT_LINE(‘姓名??????原工资??新工资‘);? ??
- ????????DBMS_OUTPUT.PUT_LINE(‘---------------------------‘);? ??
- ?????????LOOP ??
- ????????????FETCH?emp_cursor?INTO?V_EMPNO,V_NAME,V_SAL; ??
- EXIT?WHEN?emp_cursor%NOTFOUND; ??
- ?????????V_SAL1:=?V_SAL*0.1; ??
- ????????????IF?V_TOTAL>V_SAL1?THEN??
- ????????????V_TOTAL?:=?V_TOTAL?-?V_SAL1; ??
- ????????????V_NUM:=V_NUM+1; ??
- ????DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,‘99999‘)|| ??
- ????????TO_CHAR(V_SAL+V_SAL1,‘99999‘)); ??
- ?????????????UPDATE?EMP?SET?SAL=SAL+V_SAL1 ??
- ?????????????WHERE?EMPNO=V_EMPNO; ??
- ?????????ELSE??
- DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,‘99999‘)||TO_CHAR(V_SAL,‘99999‘)); ??
- ?????????END?IF; ??
- ????????END?LOOP; ??
- ????????DBMS_OUTPUT.PUT_LINE(‘---------------------------‘); ??
- ????????DBMS_OUTPUT.PUT_LINE(‘增加工资人数:‘||V_NUM||‘?剩余工资:‘||V_TOTAL);?? ??
- ?????????CLOSE?emp_cursor;? ??
- ?????????COMMIT; ??
- ?????????END;??
输出结果为:?
Sql代码?
- 姓名????????原工资??新工资 ??
- ????????---------------------------------------------???
- SMITH???????1289???1418 ??
- JAMES???????1531???1684 ??
- MARTIN??????1664???1830 ??
- MILLER??????????1730???1903 ??
- ALLEN???????????1760???1936 ??
- ADAMS???????1771???1771 ??
- TURNER??????1815???1815 ??
- WARD????????1830???1830 ??
- BLAKE???????2850???2850 ??
- CLARK???????2850???2850 ??
- JONES???????????2975???2975 ??
- FORD????????????3000???3000 ??
- KING????????????5000???5000 ??
- -----------------------------------------------???
- 增加工资人数:5?剩余工资:3 ??
- PL/SQL?过程已成功完成。??
(编辑:东莞站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|