| Sql代码?? 说明:该程序中将字段内容垂直排列。V_count变量记录循环次数,即部门个数。?
 【训练4】? 已知每个部门有一个经理,编写程序,统计输出部门名称、部门总人数、总工资和部门经理。?
 输入并执行如下程序:?
 
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?过程已成功完成。??? Sql代码?说明:游标中使用到了起分组功能的SELECT语句,统计出各部门的总人数和总工资。再根据部门编号和职务找到部门的经理。该程序假定每个部门有一个经理。?
 【训练5】? 为雇员增加工资,从工资低的雇员开始,为每个人增加原工资的10%,限定所增加的工资总额为800元,显示增加工资的人数和余额。?
 输入并调试以下程序:?
 
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?过程已成功完成。??
 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |