友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

oracle从入门到精通(PDF格式)-第31章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                 语句。  

       例:  

       declare  

       cursor empl_dep is  

       select last_name;department_name from employees;departments  

       where employees。department_id=departments。department_id;  

       empl_name employees。last_name %type;  

       depart_name departments。department_name %type;  

       begin  

       open empl_dep;  

       fetch empl_dep into empl_name;depart_name;  

       dbms_output。put_line(empl_name ||chr(32)||'work in'||chr(32)||depart_name);  

       while empl_dep%found loop  

       fetch empl_dep into empl_name;depart_name;  

       dbms_output。put_line(empl_name ||chr(32)||'work in'||chr(32)||depart_name);  

       end loop;  

       if empl_dep%isopen then  

       dbms_output。put_line(empl_dep%rowcount);  

       end if;  

       close empl_dep;  

       end;  



     5。FOR循环的游标使用:  



         for record_name in cursor_name loop  

         statement1;  

         statement2;  

         。。。。。。  

         end loop;    

       游标不需要打开,FETCH和关闭,直接在循环中使用 record_name。col_name(子查询中的 



                                        第 86 页,共 106 页 


…………………………………………………………Page 87……………………………………………………………

资源来自网络,仅供学习!                                                            Oracle 从入门到精通 



  col_name)就可以。  

   declare  

   cursor cur_empl_dep is  

   select last_name;department_name from employees;departments  

   where employees。department_id=departments。department_id;  

   begin  

   for re_empl_dep in cur_empl_dep loop  

   dbms_output。put_line(re_empl_dep。last_name||' work in  

  '||re_empl_dep。department_name);  

   end loop;  

   end;  

    

   begin  

   for re_empl_dep in (select last_name;department_name from employees;departments  

   where employees。department_id=departments。department_id) loop  

   dbms_output。put_line(re_empl_dep。last_name||' work in  

  '||re_empl_dep。department_name);  

   end loop;  

   end;  



6。带参数的游标:  



            处理串行化数据(一个执行完才能执行下一个)。  

            CURSOR  cursor_name '(parameter_name datatype;。。。。。)'  

            IS  

            select_statement;  

            OPEN cursor_name '(parameter_name datatype;。。。。。)';  

     限制:不能实现多个游标的并行打开。  

  例:  

   declare  

   cursor dep_cur  

   (dep_id employees。department_id %type)  

   is  

   select employee_id;last_name;department_id from employees  

   where department_id=dep_id;  

   begin  

   for j in 1 。。 5 loop  

   for i in dep_cur(j*10) loop  

   dbms_output。put_line(i。employee_id||' : '||i。last_name||' in ' ||i。department_id);  

   end loop;  

   end loop;  

   end;  

    

     在查询的同时锁定数据:  

  select 。。。。 from 。。。。 for update 'of column reference' 'nowait';   

  'nowait' 如果得不到访问资源就立即返回。  

  如果要使用游标修改数据的话,一定要在游标定义中 SELECT 语句中加上 FOR UPDATE。  



                                    第 87 页,共 106 页 


…………………………………………………………Page 88……………………………………………………………

资源来自网络,仅供学习!                                                          Oracle 从入门到精通 



  在游标执行过程中的 UPDATE 语句:  

  UPDATE。。。。SET。。。WHERE CRRENT OF cursor_name;  



7。异常处理  



    异常:在执行过程中出现的错误。  

    错误触发:语句执行错误(规则)。  

    显式触发:人为认定的异常,人为规定出现异常的数据范围(逻辑)。  



8。预定义异常:  



    有编号,有名称。使用异常名称扑捉;  

    NO_DATA_FOUND  

    TOO_MANY_ROWS  

    INVALID_CURSOR  

    ZERO_DIVIDE  

    DUP_VAL_ON_INDEX  在索引上出现重复数;    

        exception   

        when NO_DATA_FOUND then  

        statement1;  

        statement2;  

        。。。。。。。。;  

        when TOO_MANY_ROWS then  

        statement1;  

        statement2;  

        。。。。。。。。。。。;  

        when others then  

        statement1;  

        statement2;  

        。。。。。。。。。。。;             



9。非预定义异常:  



    有编号,没名称。需要先定义名称再扑捉;  

    (1)在 DECLARE 部分定义一个异常的名称;   exc_name EXCEPTION;  

    (2)把名称和异常编号连接起来;                   PARGMA EXCEPTION_INIT(exc_name;…exc_number); 

      



3、函数:  



    SQLCODE :返回错误编号  

    SQLERRM :返回错误信息  

  写入错误日志的内容: 用户,时间,对象,操作,错误编号,错误信息。  

    

     用户定义异常:  

            (1)命名;  

            (2)raise关键字在 BEGIN 后触发;  



                                   第 88 页,共 106 页 


…………………………………………………………Page 89……………………………………………………………

资源来自网络,仅供学习!                                                            Oracle 从入门到精通 



            (3)捕捉;  

     语法:  

    exception   

    when exception1 or exception2 then  

    statement1;  

    statement2;  

    。。。。。。。。;  

    when exception3 or exception4 then  

    statement1;  

    statement2;  

    。。。。。。。。。。。;  

    when others then  

    statement1;  

    statement2;  

    。。。。。。。。。。。;          

    

  能够判断出的异常放到 WHEN 语句中,将那些无法预测的异常放在 OTHERS 中做成错误日志表。  

  在程序内部的在程序内部捕捉,程序外部的程序外部捕捉,只有都没捕捉到,才会传到环境中。  

    

     抛出异常:  

    RAISE_APPLICATION_ERROR  

    RAISE_APPLICATION_ERROR(自定义错误编号,自定义信息);  

    不会被 EXCEPTION 捕捉到,而是直接回显到界面上给用户看到。  

    在 EXCEPTION 。。。WHEN 。。。THEN 之前或之中都可以使用。  

     函数:  

    不能独立出现,只能作为表达式来使用。  

    create 'or replace' function fun_name   

    '(parameter1 'mode' datatype;parameter2 'mode' datatype; 。。。)'  

    return datetype  

    is/as  

    pl/sql block;  

      

    只能返回一个且必须有一个返回类型。  

    在 pl/sql block 中必须有一个可以执行的 RETURN子句。  

    只允许接受 IN 模式的参数。  

    函数可以返回 BOOLEAN类型,但不能将返回 BOOLEAN 类型的
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!