加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle中的cursor

发布时间:2021-02-25 03:15:38 所属栏目:站长百科 来源:网络整理
导读:? ?游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才


? 说明:该程序中将字段内容垂直排列。V_count变量记录循环次数,即部门个数。?
【训练4】? 已知每个部门有一个经理,编写程序,统计输出部门名称、部门总人数、总工资和部门经理。?
输入并执行如下程序:?

Sql代码?
  1. SET?SERVEROUTPUT?ON? ??
  2. DECLARE??
  3. ?v_deptno?number(8); ??
  4. ?v_count?number(3); ??
  5. ?v_sumsal?number(6); ??
  6. ?v_dname??varchar2(15); ??
  7. v_manager??varchar2(15); ??
  8. ?CURSOR?list_cursor?IS??
  9. ???SELECT?deptno,count(*),sum(sal)?FROM?emp?group?by?deptno; ??
  10. BEGIN??
  11. ??OPEN?list_cursor;? ??
  12. ??DBMS_OUTPUT.PUT_LINE(‘-----------?部?门?统?计?表?-----------‘); ??
  13. DBMS_OUTPUT.PUT_LINE(‘部门名称???总人数??总工资???部门经理‘); ??
  14. ??FETCH?list_cursor?INTO?v_deptno,v_count,v_sumsal;? ??
  15. ??WHILE?list_cursor%found?LOOP?? ??
  16. ?SELECT?dname?INTO?v_dname?FROM?dept ??
  17. ????WHERE?deptno=v_deptno; ??
  18. ????SELECT?ename?INTO?v_manager?FROM?emp? ??
  19. ????WHERE?deptno=v_deptno?and?job=‘MANAGER‘; ??
  20. DBMS_OUTPUT.PUT_LINE(rpad(v_dname,13)||rpad(to_char(v_count),8) ??
  21. ??????||rpad(to_char(v_sumsal),9)||v_manager); ??
  22. ????FETCH?list_cursor?INTO?v_deptno,v_sumsal;? ??
  23. ????END?LOOP; ??
  24. ????????DBMS_OUTPUT.PUT_LINE(‘--------------------------------------‘); ??
  25. ????????CLOSE?list_cursor; ??
  26. ????????END;??


输出结果为:?

Sql代码?
  1. --------------------?部?门?统?计?表?-----------------???
  2. ????????部门名称?????总人数??总工资?????部门经理 ??
  3. ????????ACCOUNTING????3??????8750???????CLARK ??
  4. ????????RESEARCH??????5?????10875???????JONES ??
  5. ????????SALES?????????????6??????9400???????BLAKE ??
  6. ????????-------------------------------------------------------------???
  7. ????????PL/SQL?过程已成功完成。???


说明:游标中使用到了起分组功能的SELECT语句,统计出各部门的总人数和总工资。再根据部门编号和职务找到部门的经理。该程序假定每个部门有一个经理。?
【训练5】? 为雇员增加工资,从工资低的雇员开始,为每个人增加原工资的10%,限定所增加的工资总额为800元,显示增加工资的人数和余额。?
输入并调试以下程序:?

Sql代码?
  1. SET?SERVEROUTPUT?ON? ??
  2. DECLARE? ??
  3. ??V_NAME?CHAR(10); ??
  4. ??V_EMPNO?NUMBER(5); ??
  5. ??V_SAL?NUMBER(8); ??
  6. ??V_SAL1?NUMBER(8); ??
  7. ??V_TOTAL?NUMBER(8)?:=?800;?????--增加工资的总额???
  8. V_NUM?NUMBER(5):=0;?????--增加工资的人数???
  9. ?????????CURSOR?emp_cursor?IS? ??
  10. ??????????SELECT?EMPNO,ENAME,SAL?FROM?EMP?ORDER?BY?SAL?ASC; ??
  11. ????????BEGIN??
  12. ?????????OPEN?emp_cursor; ??
  13. ????????DBMS_OUTPUT.PUT_LINE(‘姓名??????原工资??新工资‘);? ??
  14. ????????DBMS_OUTPUT.PUT_LINE(‘---------------------------‘);? ??
  15. ?????????LOOP ??
  16. ????????????FETCH?emp_cursor?INTO?V_EMPNO,V_NAME,V_SAL; ??
  17. EXIT?WHEN?emp_cursor%NOTFOUND; ??
  18. ?????????V_SAL1:=?V_SAL*0.1; ??
  19. ????????????IF?V_TOTAL>V_SAL1?THEN??
  20. ????????????V_TOTAL?:=?V_TOTAL?-?V_SAL1; ??
  21. ????????????V_NUM:=V_NUM+1; ??
  22. ????DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,‘99999‘)|| ??
  23. ????????TO_CHAR(V_SAL+V_SAL1,‘99999‘)); ??
  24. ?????????????UPDATE?EMP?SET?SAL=SAL+V_SAL1 ??
  25. ?????????????WHERE?EMPNO=V_EMPNO; ??
  26. ?????????ELSE??
  27. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,‘99999‘)||TO_CHAR(V_SAL,‘99999‘)); ??
  28. ?????????END?IF; ??
  29. ????????END?LOOP; ??
  30. ????????DBMS_OUTPUT.PUT_LINE(‘---------------------------‘); ??
  31. ????????DBMS_OUTPUT.PUT_LINE(‘增加工资人数:‘||V_NUM||‘?剩余工资:‘||V_TOTAL);?? ??
  32. ?????????CLOSE?emp_cursor;? ??
  33. ?????????COMMIT; ??
  34. ?????????END;??


输出结果为:?

Sql代码?
    1. 姓名????????原工资??新工资 ??
    2. ????????---------------------------------------------???
    3. SMITH???????1289???1418 ??
    4. JAMES???????1531???1684 ??
    5. MARTIN??????1664???1830 ??
    6. MILLER??????????1730???1903 ??
    7. ALLEN???????????1760???1936 ??
    8. ADAMS???????1771???1771 ??
    9. TURNER??????1815???1815 ??
    10. WARD????????1830???1830 ??
    11. BLAKE???????2850???2850 ??
    12. CLARK???????2850???2850 ??
    13. JONES???????????2975???2975 ??
    14. FORD????????????3000???3000 ??
    15. KING????????????5000???5000 ??
    16. -----------------------------------------------???
    17. 增加工资人数:5?剩余工资:3 ??
    18. PL/SQL?过程已成功完成。??

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!