发布日期:2015-10-16 17:20 来源: 标签: oracle教程 oracle函数大全 PL/SQL触发器 PL/SQL自定义对象
本章节我们将学习PL/SQL中触发器的使用及怎样自定义对象,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
触发器
--------------------------------------------------------------------------------
创建触发器:
    CREATE [OR REPLACE] TRIGGER <触发器名>
    BEFORE|AFTER
    INSERT|DELETE|UPDATE [OF <列名>] ON <表名>
    [FOR EACH ROW]
     WHEN (<条件>)
     <pl/sql块>

     关键字"BEFORE"在操作完成前触发;"AFTER"则是在操作完成后触发;
     关键字"FOR EACH ROW"指定触发器每行触发一次.
      关键字"OF <列名>" 不写表示对整个表的所有列.
     WHEN (<条件>)表达式的值必须为"TRUE".

特殊变量:
     :new --为一个引用最新的列值;
     :old --为一个引用以前的列值; 
这些变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

使用RAISE_APPLICATION_ERROR
     语法:RAISE_APPLICATION_ERROR(错误号(-20000到-20999),消息[,{true|false}]);
     抛出用户自定义错误.
     如果参数为'TRUE',则错误放在先前的堆栈上.

INSTEAD OF 触发器
     INSTEAD OF 触发器主要针对视图(VIEW)将触发的dml语句替换成为触发器中的执行语句,而不执行dml语句.

禁用某个触发器
     ALTER TRIGGER <触发器名> DISABLE
重新启用触发器
     ALTER TRIGGER <触发器名> ENABLE
禁用所有触发器
     ALTER TRIGGER <触发器名> DISABLE ALL TRIGGERS
启用所有触发器
     ALTER TRIGGER <触发器名> ENABLE ALL TRIGGERS
删除触发器
     DROP TRIGGER <触发器名>

自定义对象
--------------------------------------------------------------------------------
创建对象:
    CREATE [OR REPLACE] TYPE <对象名> AS OBJECT(
    属性1 类型
    属性2 类型
          .
    方法1的规范(MEMBER PROCEDURE <过程名>
    方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型)
          .
    PRAGMA RESTRIC_REFERENCES(<方法名>,WNDS/RNDS/WNPS/RNPS);
      关键字"PRAGMA RESTRIC_REFERENCES"通知ORACLE函数按以下模式之一操作;
      WNDS-不能写入数据库状态;
      RNDS-不能读出数据库状态;
      WNPS-不能写入包状态;
      RNDS-不能读出包状态;


创建对象主体:
      CREATE [OR REPLACE] TYPE body <对象名> AS 
     方法1的规范(MEMBER PROCEDURE <过程名> is   <PL/SQL块>
    方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型 is <PL/SQL块>  
     END;

使用MAP方法和ORDER方法
     用于对自定义类型排序。每个类型只有一个MAP或ORDER方法。
     格式:MAP MEMBER FUNCTION <函数名> RETURN 类型 
            ORDER MEMBER FUNCTION <函数名> RETURN NUMBER 

创建对象表 
      CREATE TABLE <表名> OF <对象类型>

示例:
     1. 创建name 类型 
     create or replace type name_type as object(
          f_name varchar2(20),
          l_name varchar2(20),
          map member function name_map return varchar2); 
     
     create or replace type body name_type as
          map member function name_map return varchar2 is --对f_name和l_name排序
          begin 
               return f_name||l_name;
          end;
          end;
      2 创建address 类型 
     create or replace type address_type as object
       ( city varchar2(20),
           street varchar2(20),
           zip number,
      order member function address_order(other address_type) return number);


      create or replace type body address_type as
      order member function address_order(other address_type) return number is --对zip排序
      begin
           return self.zip-other.zip;
      end;
      end;

3 创建stu对象
       create or replace type stu_type as object (
       stu_id number(5),
       stu_name name_type,
       stu_addr address_type,
       age number(3),
       birth date, 
       map member function stu_map return number,
      member procedure update_age);

      create or replace type body stu_type as
       map member function stu_map return number is --对stu_id排序
       begin
             return stu_id;
       end;
      member procedure update_age is --求年龄用现在时间-birth
       begin 
             update student set age=to_char(sysdate,'yyyy')-to_char(birth,'yyyy') where stu_id=self.stu_id;
       end; 
       end; 
4. 创建对象表
      create table student of stu_type(primary key(stu_id));
5.向对象表插值
      insert into student values(1,name_type('关','羽'),address_type('武汉','成都路',43000), null,sysdate-365*20);
6.使用对象的方法
     delcare
          aa stu_type;
     begin
          select value(s) into aa from student s where stu_id=1; --value()将对象表的每一行转成行对象括号中必须为表的别名
          aa.update_age();
     end; 
7.select stu_id,s.stu_name.f_name,s.stu_name.l_name from student s; --查看类型的值
8.select ref(s) from student s ; --ref()求出行对象的OID,括号中必须为表的别名;deref()将oid变成行队像; 

其他
--------------------------------------------------------------------------------
1.在PL/SQL中使用DDL
     将sql语句赋给一个varchar2变量,在用execute immediate 这个varchar2变量即可;
     示例:
     declare
          str varchar2(200);
     begin 
          str:='create table test(id number,name varchar2(20))'; --创建表
          execute immediate str;   
          str:='insert into test values(3,''c'')'; --向表里插数据
          execute immediate str; 
     end;     
     但是要队这个表插入数据也必须使用execute immediate 字符变量

2.判断表是否存在;
     示例: 
     declare
          n tab.tname%type;
     begin
          select tname into n from tab where tname='&请输入表名';
          dbms_output.put_line('此表以存在');
     exception
          when no_data_found then
          dbms_output.put_line('还没有此表');
     end; 

2.查看以有的过程;
     示例: 
     select object_name,object_type,status from user_objects where object_type='PROCEDURE';

相关评论

专题信息
    Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。本教程重点讲解Oracle函数、SQL语言、PL/SQL语言、oracle安装、SQL技巧等多方面的知识,对大家学习Oracle以及Oracle的实际应用有很大帮助。