加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网_ASP源码网 (https://www.1asp.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle中的cursor

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


执行结果为:?

Sql代码?
  1. DECLARE??
  2. ????????* ??
  3. ????????ERROR?位于第?1?行: ??
  4. ????????ORA-20001:?编号小于7000的下限! ??
  5. ????????ORA-06512:?在line?9??


? 说明:在本训练中,使用RAISE_APPLICATION_ERROR引发自定义异常,并以系统错误的方式进行显示。错误编号为20001和20002。?
注意:同上一个训练比较,此种方法不需要事先定义异常,可直接引发。?
可以参考下面的程序片断将出错信息记录到表中,其中,errors为记录错误信息的表,SQLCODE为发生异常的错误编号,SQLERRM为发生异常的错误信息。?
DECLARE?
? v_error_code????? NUMBER;?
? v_error_message?? VARCHAR2(255);?
BEGIN?
...?
EXCEPTION?
...?
WHEN OTHERS THEN?
??? v_error_code := SQLCODE ;?
??? v_error_message := SQLERRM ;?
??? INSERT INTO errors?
??? VALUES(v_error_code,v_error_message);?
END;?
? 【练习1】修改雇员的工资,通过引发异常控制修改范围在600~6000之间。?
阶段训练?
【训练1】? 将雇员从一个表复制到另一个表。?
步骤1:创建一个结构同EMP表一样的新表EMP1:?
CREATE TABLE emp1 AS SELECT * FROM SCOTT.EMP WHERE 1=2;?
步骤2:通过指定雇员编号,将雇员由EMP表移动到EMP1表:?

Sql代码?
  1. SET?SERVEROUTPUT?ON? ??
  2. DECLARE??
  3. v_empno?NUMBER(5):=7788; ??
  4. emp_rec?emp%ROWTYPE; ??
  5. BEGIN??
  6. ?SELECT?*?INTO?emp_rec?FROM?emp?WHERE?empno=v_empno; ??
  7. ?DELETE?FROM?emp?WHERE?empno=v_empno; ??
  8. INSERT?INTO?emp1?VALUES?emp_rec; ??
  9. ?IF?SQL%FOUND?THEN??
  10. ??COMMIT; ??
  11. ??DBMS_OUTPUT.PUT_LINE(‘雇员复制成功!‘); ??
  12. ?ELSE? ??
  13. ??ROLLBACK; ??
  14. ??DBMS_OUTPUT.PUT_LINE(‘雇员复制失败!‘); ??
  15. ?END?IF; ??
  16. END;??


执行结果为:?
雇员复制成功!?
PL/SQL 过程已成功完成。?
步骤2:显示复制结果:?
SELECT empno,ename,job FROM emp1;?
执行结果为:?
?

Sql代码?
  1. EMPNO?ENAME??????JOB ??
  2. -------------?--------------?----------------???
  3. ????7788??SCOTT??????ANALYST??


说明:emp_rec变量是根据emp表定义的记录变量,SELECT...INTO...语句将整个记录传给该变量。INSERT语句将整个记录变量插入emp1表,如果插入成功(SQL%FOUND为真),则提交事务,否则回滚撤销事务。试修改雇员编号为7902,重新执行以上程序。?
【训练2】? 输出雇员工资,雇员工资用不同高度的*表示。?
输入并执行以下程序:?

Sql代码?
  1. SET?SERVEROUTPUT?ON? ??
  2. BEGIN??
  3. ?FOR?re?IN?(SELECT?ename,sal?FROM?EMP)??LOOP ??
  4. ??DBMS_OUTPUT.PUT_LINE(rpad(re.ename,12,‘?‘)||rpad(‘*‘,re.sal/100,‘*‘)); ??
  5. ?END?LOOP; ??
  6. END;??


输出结果为:?

Sql代码?
  1. SMITH???????******** ??
  2. ALLEN???????????**************** ??
  3. WARD????????************* ??
  4. JONES???????????****************************** ??
  5. MARTIN??????************* ??
  6. BLAKE???????***************************** ??
  7. CLARK???????????***************************** ??
  8. SCOTT???????????****************************** ??
  9. KING????????????************************************************** ??
  10. TURNER??????*************** ??
  11. ADAMS???????*********** ??
  12. JAMES???????????********** ??
  13. FORD????????????****************************** ??
  14. MILLER??????????************* ??
  15. ?????????执行结果为: ??
  16. ????????PL/SQL?过程已成功完成。??


? 说明:第一个rpad函数产生对齐效果,第二个rpad函数根据工资额产生不同数目的*。该程序采用了隐式的简略游标循环形式。?
【训练3】? 编写程序,格式化输出部门信息。?
输入并执行如下程序:?

Sql代码?
  1. SET?SERVEROUTPUT?ON? ??
  2. ????????DECLARE??
  3. ?????????v_count?number:=0; ??
  4. ?????????CURSOR?dept_cursor?IS?SELECT?*?FROM?dept; ??
  5. ????????BEGIN??
  6. ??????????DBMS_OUTPUT.PUT_LINE(‘部门列表‘); ??
  7. DBMS_OUTPUT.PUT_LINE(‘---------------------------------‘); ??
  8. ?????????FOR?Dept_record?IN?dept_cursor?LOOP??? ??
  9. ?????????DBMS_OUTPUT.PUT_LINE(‘部门编号:‘||?Dept_record.deptno); ??
  10. ?????????DBMS_OUTPUT.PUT_LINE(‘部门名称:‘||?Dept_record.dname); ??
  11. ????????????DBMS_OUTPUT.PUT_LINE(‘所在城市:‘||?Dept_record.loc); ??
  12. DBMS_OUTPUT.PUT_LINE(‘---------------------------------‘); ??
  13. ??????v_count:=?v_count+1; ??
  14. ????????END?LOOP; ??
  15. ?????????DBMS_OUTPUT.PUT_LINE(‘共有‘||to_char(v_count)||‘个部门!‘); ??
  16. ????????END;??


输出结果为:?

Sql代码?
  1. 部门列表 ??
  2. ------------------------------------???
  3. 部门编号:10 ??
  4. 部门名称:ACCOUNTING ??
  5. 所在城市:NEW?YORK ??
  6. ------------------------------------???
  7. 部门编号:20 ??
  8. 部门名称:RESEARCH ??
  9. 所在城市:DALLAS ??
  10. ... ??
  11. 共有4个部门! ??
  12. PL/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?过程已成功完成。???

(编辑:安卓应用网_ASP源码网)

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

推荐文章
    热点阅读