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

oracle中的cursor

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


比如,如果程序向表的主键列插入重复值,则将发生DUP_VAL_ON_INDEX错误。?
如果一个系统错误没有在标准包中定义,则需要在说明部分定义,语法如下:?
错误名 EXCEPTION;?
定义后使用PRAGMA EXCEPTION_INIT来将一个定义的错误同一个特别的Oracle错误代码相关联,就可以同系统预定义的错误一样使用了。语法如下:?
PRAGMA EXCEPTION_INIT(错误名,- 错误代码);?
【训练1】? 定义新的系统错误类型。?

Sql代码?
  1. SET?SERVEROUTPUT?ON??
  2. ????????DECLARE??
  3. ????????V_ENAME?VARCHAR2(10); ??
  4. ????????NULL_INSERT_ERROR?EXCEPTION; ??
  5. ????????PRAGMA?EXCEPTION_INIT(NULL_INSERT_ERROR,-1400); ??
  6. ????????BEGIN??
  7. ????????INSERT?INTO?EMP(EMPNO)?VALUES(NULL); ??
  8. EXCEPTION ??
  9. WHEN?NULL_INSERT_ERROR?THEN??
  10. ????DBMS_OUTPUT.PUT_LINE(‘无法插入NULL值!‘); ??
  11. ??WHEN?OTHERS??THEN??
  12. ????DBMS_OUTPUT.PUT_LINE(‘发生其他系统错误!‘); ??
  13. END;??


执行结果为:?

Sql代码?
  1. 无法插入NULL值! ??
  2. ????????PL/SQL?过程已成功完成。??


? 说明:NULL_INSERT_ERROR是自定义异常,同系统错误1400相关联。?
自定义异常?
程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型。可以在声明部分定义新的异常类型,定义的语法是:?
错误名 EXCEPTION;?
用户定义的错误不能由系统来触发,必须由程序显式地触发,触发的语法是:?
RAISE 错误名;?
RAISE也可以用来引发模拟系统错误,比如,RAISE ZERO_DIVIDE将引发模拟的除零错误。?
使用RAISE_APPLICATION_ERROR函数也可以引发异常。该函数要传递两个参数,第一个是用户自定义的错误编号,第二个参数是用户自定义的错误信息。使用该函数引发的异常的编号应该在20 000和20 999之间选择。?
自定义异常处理错误的方式同前。?
【训练1】? 插入新雇员,限定插入雇员的编号在7000~8000之间。?

Java代码?
  1. SET?SERVEROUTPUT?ON ??
  2. DECLARE ??
  3. new_no?NUMBER(10); ??
  4. new_excp1?EXCEPTION; ??
  5. new_excp2?EXCEPTION; ??
  6. BEGIN ??
  7. new_no:=6789; ??
  8. INSERT?INTO?emp(empno,ename) ??
  9. ??VALUES(new_no,?‘小郑‘); ??
  10. ??IF?new_no<7000?THEN ??
  11. ????RAISE?new_excp1; ??
  12. ??END?IF; ??
  13. ??IF?new_no>8000?THEN ??
  14. ????RAISE?new_excp2; ??
  15. ??END?IF; ??
  16. ??COMMIT; ??
  17. EXCEPTION ??
  18. WHEN?new_excp1??THEN ??
  19. ????ROLLBACK; ??
  20. ????DBMS_OUTPUT.PUT_LINE(‘雇员编号小于7000的下限!‘); ??
  21. ????WHEN?new_excp2??THEN ??
  22. ????ROLLBACK; ??
  23. ????DBMS_OUTPUT.PUT_LINE(‘雇员编号超过8000的上限!‘); ??
  24. ????END;??


执行结果为:?
雇员编号小于7000的下限!?
PL/SQL 过程已成功完成。?
说明:在此例中,自定义了两个异常:new_excp1和new_excp2,分别代表编号小于7000和编号大于8000的错误。在程序中通过判断编号大小,产生对应的异常,并在异常处理部分回退插入操作,然后显示相应的错误信息。?
【训练2】? 使用RAISE_APPLICATION_ERROR函数引发系统异常。?

Sql代码?
  1. SET?SERVEROUTPUT?ON??
  2. DECLARE??
  3. New_no?NUMBER(10); ??
  4. BEGIN??
  5. ??New_no:=6789; ??
  6. ?INSERT?INTO????emp(empno,ename) ??
  7. ??VALUES(new_no,?‘JAMES‘); ??
  8. IF?new_no<7000?THEN??
  9. ????ROLLBACK; ??
  10. ????RAISE_APPLICATION_ERROR(-20001,?‘编号小于7000的下限!‘); ??
  11. ??END?IF; ??
  12. ??IF?new_no>8000?THEN??
  13. ????ROLLBACK; ??
  14. ????RAISE_APPLICATION_ERROR?(-20002,?‘编号大于8000的下限!‘); ??
  15. ??END?IF; ??
  16. END;??


执行结果为:?

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

(编辑:晋中站长网)

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

热点阅读