zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    前端程序员容易忽视的一些基础知识
    一道前端学习题
    Unity调用Windows对话框保存时另存为弹框
    Unity镜子效果的实现(无需镜子Shader)
    Unity射线检测的用法总结
    unity中实现简单对象池,附教程原理
    Unity调用Window提示框Yes/No(英文提示窗)
    Unity调用Windows弹框、提示框(确认与否,中文)
    C#LinQ语法
    服务器的购买与网站的创建
  • 原文地址:https://www.cnblogs.com/ranfang/p/3503660.html
Copyright © 2011-2022 走看看