友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


    else  

      return(empl_sal * 0。3 + empl_sal * 0。2 + empl_sal * 0。15 +  

             empl_sal * 0。1);  

    end if;  

  end sal_m_fun;  



4、存储程序单元  



  存储过程(Procedure)  

    create 'or replace' procedure pro_name   

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

    is/as  

    。。。。。//声明部分  

    begin  

    。。。。//函数主题  

    exception  

    。。。。//异常处理  

    end;  

     mode:  

        1。   in 传入(形参)默认,可以有默认值;  

            create or replace procedure empl_sal_pro(empl_id employees。employee_id %type)  

is  

            begin  

            update employees set salary = 170000 where employee_id = empl_id;  

            end empl_sal_pro;  

            exec empl_sal_pro(empl_id=》 100)  

        2。  out(实参)先将初始值传入经过处理后在传出;必须定义名称;  

           先在 SQLPLUS 中定义 VAR 变量,然后执行 EXEC 将定义好的 VAR 变量 传入到存储 

  过程中的参数位置。  

            SQL》 create or replace procedure empl_info(empl_id    

  employees。employee_id%type;  

              2  empl_name out employees。last_name%type;  

              3  empl_sal  out employees。salary%type) is  

                  4  begin  

              5  select last_name;salary into empl_name;empl_sal from employees  

              6  where employee_id=empl_id;  

              7  end empl_info;  

              8  /  



                                     第 90 页,共 106 页 


…………………………………………………………Page 91……………………………………………………………

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



    

            过程已创建。  

            SQL》 exec empl_info(100;:name;:sal)           

            PL/SQL 过程已成功完成。  

            SQL》 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_errors;  



                                    第 91 页,共 106 页 


…………………………………………………………Page 92……………………………………………………………

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



    query_emp;对过程的描述。          

    



6、包(package)  



  一组相关类型的变量,常量,游标,存储过程,函数的集合。  



1。组成:  



    包头:声明部分;只声明PUBLIC PROCEDURE/VARIABLE;  

    包体:程序实体,包含 PRIVATE PROCEDURE/VARIABLE 、PUBLIC PROCEDURE/VARIABLE 和 LOCAL  

  VARIABLE;     

  包头没有包体是可以独立存在的。  

    包头:  

    CREATE 'OR REPLACE' PACKAGE package_name  

    IS  

    public_type   

    PROCEDURE procdeure_name (parameter。。。。 );  

    END package_name;       

    包体:  

    CREATE 'OR REPLACE' PACKAGE BODY package_name  

    IS   

    private type and item declarations  

    subprogram bodies  

    end package_name;    



2。构建没有包头的包:  



    为了在整个会话中的全局变量设计。  

    如果其他会话访问的话,和定义时候的回话得到的包的值有可能是不一样的。  

  包体的部分可以通过 WRAP 程序加密。  

    

  只有局部过程和被打包的过程才能 OVERLOAD(重载)。  

    前项声明:  

    将过程或函数的名称和参数放在包体的头部声明;  

    

    建立一次性的过程:  

    就是在包体中插入了一个匿名块,在包体执行的时候,该匿名块一定会先执行一次该匿名块,  

    然后再执行包体中的其他部分。  



3。SQL中使用包函数的限制  



    函数中不能包含影响当前事务的语句;  

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

      

  包中变量的稳定性:  

  PUBLIC VARIABLE 发生改变的情况:  



                                 第 92 页,共 106 页 


…………………………………………………………Page 93……………………………………………………………

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



            重新建立会话  

            符合规则  



4。与开发相关的系统包:  



     DBMS_SQL  

        (1)能过生成动态的 SQL 语句;  

        (2)能过执行 DDL 语句;  

     包使用的主要步骤:  

            OPEN_DURSOR  

            PARSE  

            BIND_VARIABLE  

            EXECUTE  

            FETCH_ROWS  

            CLOSE_CURSOR  

    EXECUTE IMMEDIATE  

     

        EXECUTE IMMEDIATE dynamic_string  

            'INTO {define_variable  

                '; define_variable' 。。。 | record}'  

        'USING 'IN|OUT|IN OUT' bind_argument  

                   '; 'IN|OUT|IN OUT' bind_argument' 。。。 ';  

     DBMS_DDL  

        ALTER_PILE(object_type;owner;object_name);强制编辑  

     DBMS_JOB   

        设置用户的任务;  

        在某个指定的时刻执行一定的操作;  

        手动强制执行;  

        挂起任务;            

        提交  

        删除  

        修改  

        要执行什么,可以跟语句或过程  

        下一次的执行时间  

        任务执行的时间间隔  

        挂起  

        手动强制执行  

        查看:  

             USER_JOBS;   

     DBMS_OUTPUT  

        PUT     输出多行数据  

        NEW_LINE   起一个新行    

        PUT_LINE   输出一行数据  

        GET_LINE   得到一行信息   

        GET_LINES  得到多行信息            

     UTL_FILE  

        对操作系统文件进行操作;                 



                                   第 93 页,共 106 页 


…………………………………………………………Page 94……………………………………………………………

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



    DBMS_LOB  

       对 LOB 对象的读和写    

    UTL_HTTP       

       可以把指定的网页的内容摘取下来                            

                        

    静态的 SQL语句的执行过程:  

    分析     PARSE    

    绑定     BIND  

    执行     EXECUTE  

    取操作  FETCH  

  用户可以通过 DML 语句对 LONG 类型的数据可以直接访问;  



7、触发器  



    触发器:  

         不能直接调用,必须得事件触发,一般情况下是与对象、数据库和方案有关。  

       1。  数据库触发器  

       2。  应用触发器  

           当一个操作与另一个操作有密切关系的时候;  

           触发器不要太大,如果代码量大,要把触发器放到一个可执行的存储过程中;  

           不要在一个对象上建立太多的触发器;    

       3。  表触发器  

               BEFORE 做数据校验  

               AFTER  在操作以后对操作和数据进行记录  

       4。  视图触发器  

               INSTEAD OF 对视图的操作替换成对视图的基表的操作   

       5。  行级触发器  

               对多行的操作,每操作一行都会触发触发器。  

       6。  语句级触发器  

               当一条语句执行的时候触发,执行一次触发一次,与操作的行数无关。  

           WHEN CLAUSE 触发器执行条件   



1。语句级:              



    CREATE 'OR REPLACE' TRIGGER trigger_name   

       timing(before/after)  

         event1 'or event2 or event3' ON table_name  

    trigger_body  

  在同一个方案下不允许重名。                           

  CREATE OR REPLACE TRIGGER secure_emp  

  BEFORE INSERT OR UPDATE OR DELETE ON employees  

  BEGIN  

   IF (TO_CHAR (SYSDATE; 'HH24') NOT BETWEEN '08' AND '12') AND DELETING  

   THEN  

        RAISE_APPLICATION_ERROR (…20502;'You may delete from EMPLOYEES table  

                only during business hours。');  



                                 第 94 页,共 106 页 


…………………………………………………………Page 95……………………………………………………………

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



     ELSIF (TO_CHAR (SYSDATE; 'HH24') NOT BETWEEN '12' AND '18') AND INSERTING THEN  

    

       RAISE_APPLICATION_ERROR (…20500;'You may insert into   

         EMPLOYEES table only during business hours。');  

    

     ELSIF (TO_CHAR (SYSDATE; 'HH24') NOT BETWEEN '8' AND '18') AND UPDATING ('SALARY')  

  THEN  

    

       RAISE_APPLICATION_ERROR (…20503;'You may update   

           SALARY only during business hours。');  

     ELSE  

       RAISE_APPLICATION_ERROR (…20504;'You may update   

              EMPLOYEES table only during normal hours。');  

   END IF;  

  END;  



2。行级触发器:  



    CREATE 'OR REPLACE' TRIGGER trigger_name  

    timing   

            event1 'OR event2 OR event3'  

            ON table_name   

        'REFERENCING OLD AS old / NEW AS new'  

    FOR EACH ROW  

        'WHEN (condition)' //执行条件  

    trigger_body  

    

  :OLD。字段名/:NEW。字段名 引用格式。  

  例:  

  CREATE OR REPLACE TRIGGER restrict_salary  

    BEFORE  INSERT OR 'UPDATE OF' salary ON employees  

      FOR EACH ROW  

   WHEN (new。salary is not null)     //在出发器头里,new。salary 相当与本身的变量  

      BEGIN  

        IF  :NEW。salary》2*:old。salary    //在TRIGGER_BODY 里,:NEW。salary 相当与一个绑 

  定变量  

            or :NEW。salary 
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!