八宝书库 > 文学其他电子书 > oracle从入门到精通(PDF格式) >

第19部分

oracle从入门到精通(PDF格式)-第19部分

小说: oracle从入门到精通(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 类型的函数应用到 SQL 语句中。    

      

     函数的限制:  

    只能出现查询语句;  

    不允许出现 DML 操作;  

    如果在对表 T 进行DML 语句操作调用函数 F,该函数 F 不能对编辑表 T 进行查询;  

    不允许出现 DDL 语句;  

  例:  

  create or replace function sal_m_fun(empl_sal number) return number is  

  Result number;  

  begin  



                                    第 89 页,共 106 页 


…………………………………………………………Page 90……………………………………………………………

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



    if empl_sal  print name  

            NAME  

            ………………………………………………………………………………… 

            King  

    

            SQL》 print sal  

    

               SAL  

            ……………………… 

                24000  

    

      

            begin  

             …Call the procedure  

             query_emp(p_id =》 :p_id;  

                   p_name =》 :p_name;  

                   p_salary =》 :p_salary;  

                       p_m =》 :p_m);  

               end;  

    

        3。  inout 先传入后传出,可以直接赋予默认值;    

    编辑并存储;  

    SHO ERR 查看编辑时错误的命令;  

    exec 执行存储过程命令;  

  删除:DROP procedure;  

      



5、管理 PL/SQL 程序块:  



管理 PL/SQL程序块:    

        在用户自己的方案下有 CREATE 权限  

        对于其他用户的方案有 CREATE ANY 权限  

  存储过程,函数和包需要执行权限,触发器不需要。                             

  当用户使用其他用户的存储过程或函数去访问其他用户的对象,  

  能否访问到对象取决与该存储过程或函数的拥有者的权限。  

  TUTHID CURRENT_USER 表示存储过程不依赖他的拥有者,而依赖与当前调用他的用户。   

  在 CREATE PROCEDURE 的最后添加。     

    

     查看信息:  

    user_objects;  

    user_source;  

    user

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的