Oracle PL/SQL高级特性

   定义:PL/SQL该语言只针对Oracle,是SQL过程语言的扩展,它将SQL数据库语言与一个过程程序设计语言结合在一起,此程序设计语言基于称为块的单元,一个块包含SQL和PL/SQL语句.
    触发器:是指存放在数据库中,并被隐含执行的过程,体现了数据完整约束.Oracle不仅支持DML(操作语言)触发器,也允许基于系统事件和DDL(数据定义语言)操作建立触发器.

    触发器简介:触发器由触发事件,触发条件和触发操作三部分组成.
            触发事件:是指引触发器触发的SQL语句,数据库事件或用户事件,
            触发条件(触发时机):根据逻辑处理而进行触发程序集的一系列的条件.
            触发操作:是指包含SQL语句和其它执行代码的PL/SQL块,触发器大大小不能超过32k.

   DML触发器:建立DML触发器时,需要指定触发器时机,触发事件,表明,触发类型,触发条件以及触发操作.
           触发时机:用于指定触发器的触发时间(before表示执行DML操作之前触发,after表示执行DML操作之后触发).
           触发事件:指定导致触发器执行的DML操作(INSERT ,UPDAET,DELETE).
           表名:指定DML操作所对应的表.
           触发类型:(行级别,语句级别和单元格级别)
             DML触发器触发顺序:在单行执行DML操作时先执行表的Before语句触发器,再执行before行触发器.

            

            语法:create or replace trigger t_name   

              {before/after} {insert or update or delete}    

              {of column} on {table or view}--单元格级别

              {for each row}--行级别(row表中有old和row表)   

              {when }   

               begin     

                    逻辑处理......

                end;

             例如:  创建表   

               create table emp_log  

                (       

                      id number not null,  

                          mydate date not null,   

                          mark varchar2(30)  

                )   

              创建序列  

              create sequence seq_log  

                start with 1   

              nomaxvalue

              increment by 1    

            创建触发器   

               create or replace trigger t_emp_log  

                 after insert on scott.emp for each row  

               begin             

                   insert into emp_log values(seq_log.nextval,sysdate,'这是插入操作' || :new.empno);     

                    dbms_output.put_line(:new.empno);   

               end;

    管理触发器:
            显示触发器信息:select * from user_tigger where table _name='emp'
            禁用触发器:alter trigger tr_check_sal disable;
            激活触发器:alter trigger tr_check_sal enable;
            禁用或激活表的所有触发器:alter table emp disable all trigers;
                                alter table emp enable all triggers;
            重新编译触发器:alter trigger tr_check_sal compile;
            删除触发器:drop trigger tr_check_sal(触发器名称)

    

   程序包:用于逻辑组合相关的PL/SQL类型,可以简化应用设计,提高应用性能,还可以实现信息的隐蔽,子程序的重载功能.

    内置程序包:扩展数据库的功能,为PL/SQL提供SQL功能的访问.一般具有sys权限的高级管理人员使用.

          

         常用的程序包:  

              dbms_alter:用于支持数据库事件的异步通知.

                dbms_standard:提供语言工具.    

              dbms_ddl:某些DDL命令的PL/SQL等效项.

                calendar:提供日历维护功能.   

              dbms_lob:操作oralce的lob数据.  

              dbms_output:在SQL*PLUS或服务管理器中提供屏幕输出.   

              dbms_rowid:允许从rowid获得信息,相当与rowno分页.

                dbms_session:alter session的PL/SQL等效项.   

              dbms_sql:动态PL/SQL和SQL.

                dbms_output程序包允许显示PL/SQL块和子程序的输出结果.         

                       put:用于将一个信息存储在缓冲区中.        

                       put line:用于将一个信息存储在缓冲区中,后接一个换行结束标记.

                       new line:没有参数,它用于向缓冲区添加换行符,换行符充当行结束标记.

               dbms_lob程序包包含处理大型对象的过程和函数.在oracle中lob分为以下几种类型.

                      blob:二进制大对象,clob:字符大对象和bfile外部存储的二进制文件.

        常用的函数和过程:
                 getlength:此函数返回指定的blob,clob或bfile的长度.
                instr:此函数从lob数据中查找字串.
                 read:此过程从lob数据中读取指定长度的数据到缓冲区.
                 substr:此函数从lob数据中取字串.
                 write:此过程用于将指定数量的数据写入lob.

     建立包:包由包头和包体两部分组成,包头用于预定函数,存储过程,没有实现,包体用于具体实现.
         定义包头:
           例如:create or replace package pack_test
                 as
                    function delete_emp2 return number;--函数
                    procedure delete_emp(v_no number);--存储过程
                end;

        

        定义包体:

           例如:create or replace package body pack_test      

             as      

                 procedure delete_emp(v_no number)    

                  as    

                  begin   

                       delete emp where empno = v_no;  

                   end delete_emp;

                    function delete_emp2 return number  

                    as  

                   begin    

                           return 1;

                    end delete_emp2;       

             end pack_test;  

      调用程序包:declare
               begin
                  pack_test.delete_emp(2222);
               end;

原文地址:https://www.cnblogs.com/ranfang/p/3503660.html