ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 数据库 >> Oracle >> Oracle深入学习

Oracle深入学习(1/2)

来源:网络整理     时间:2016-06-04     关键词:ORACLE

本篇文章主要介绍了"Oracle深入学习",主要涉及到ORACLE方面的内容,对于Oracle感兴趣的同学可以参考一下: 一、异常异常是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。 1、Oracle预定义异常命名的系统异常 ...

一、异常

异常是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。

1、Oracle预定义异常

命名的系统异常                          产生原因
ACCESS_INTO_NULL             未定义对象
CASE_NOT_FOUND  CASE         中若未包含相应的 WHEN ,并且没有设置 ELSE 时
COLLECTION_IS_NULL           集合元素未初始化
CURSER_ALREADY_OPEN          游标已经打开
DUP_VAL_ON_INDEX             唯一索引对应的列上有重复的值
INVALID_CURSOR               在不合法的游标上进行操作
INVALID_NUMBER               内嵌的 SQL 语句不能将字符转换为数字
NO_DATA_FOUND                使用 select into 未返回行,或应用索引表未初始化的元素时
TOO_MANY_ROWS                执行 select into 时,结果集超过一行
ZERO_DIVIDE                  除数为 0
SUBSCRIPT_BEYOND_COUNT       元素下标超过嵌套表或 VARRAY 的最大值
SUBSCRIPT_OUTSIDE_LIMIT      使用嵌套表或 VARRAY 时,将下标指定为负数
VALUE_ERROR                  赋值时,变量长度不足以容纳实际数据
LOGIN_DENIED                 PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码
NOT_LOGGED_ON                PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据
PROGRAM_ERROR                PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包
ROWTYPE_MISMATCH             宿主游标变量与 PL/SQL 游标变量的返回类型不兼容
SELF_IS_NULL                 使用对象类型时,在 null 对象上调用对象方法
STORAGE_ERROR                运行 PL/SQL 时,超出内存空间
SYS_INVALID_ID               无效的 ROWID 字符串
TIMEOUT_ON_RESOURCE Oracle   在等待资源时超时

2、异常演示

--NO_DATA_FOUND  异常
declare  
   v_name t_student.name%type;   --学生姓名
   v_edu t_student.edu%type;   --学历
   v_msg varchar2(100);
begin
   select name,edu into v_name,v_edu  from t_student where id=100;  
   v_msg:=v_name||v_edu;
   dbms_output.put_line(v_msg);  
exception  --捕捉异常
  --判断是否是我们需要的异常
  when no_data_found then
    --处理异常
    dbms_output.put_line('没有找到数据');  
end;

3、自定义异常

--自定义异常方式  声明变量时,类型为exception
--抛出异常  raise 异常名称。
在插入学员数据时,如果性别为其他数据时显示异常输出“请正确输入性别值”
declare
  v_row t_student%rowtype;
  --声明自定义异常
  exc_sex exception;
begin
  select seq_student.nextval into v_row.id from dual;
  v_row.name:='李大明白';
  v_row.sex:=1;
  v_row.edu:='本科';
  v_row.tele:=null;
  v_row.cardno:=null;
  v_row.classid:=1;
  if v_row.sex not in (0,1) then
    --抛出异常 
    raise exc_sex;
  end if;  
  insert into t_student values(seq_student.nextval,v_row.name,
  v_row.sex,v_row.edu, v_row.tele,v_row.cardno,v_row.classid);
  commit;
exception
--捕捉异常
  when exc_sex then
    dbms_output.put_line('请正确输入性别值');
end;

二、触发器

1、触发器介绍

   触发器是数据库对象之一,该对象与编程语言中的函数比较类似,都需要声明和执行等。
但是触发器不需要由程序调用,也不需要手动启动,而是由事件来触发、激活从而实现执行。
   Oracle数据库中数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的
数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。 
例如:学生表中有学生信息、学生总数等记录,当添加一条学生记录时,需要及时更新学生总数。
这时就可以创建一个触发器对象,每次添加一条学生记录时,就执行一次计算学生总数的操作。
触发器一般在执行delete语句、insert语句、update语句时触发,执行其他SQL语句时则不会激活 。
    触发器可以用于数据确认、实施复杂的安全性检查、做审计、跟踪表上所做的数据操作等、数据的备份和同步。

2、创建触发器

格式:
CREATE  [or REPLACE] TRIGGER  触发器名
 BEFORE | AFTER
  [DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
 ON  表名
  [FOR EACH ROW [WHEN(条件) ] ]
declare
   ……
begin
       PLSQL 块 
End ;

解释:
    trigger 表示触发器的意思
    触发器名称建议trigger_xxx
    before|after表示触发器执行时间,before表示触发器在事件执行之前执行,
        after表示触发器在事件执行之后执行。
    dlelet|insert|update表示激活触发器的事件
    表名是指触发器操作的表的名称。
    for each row 表示任何一条记录上的操作都会激活触发器。
    PLSQL块,表示触发器激活之后,执行的SQL语句。

    在触发器中触发语句与伪记录变量的值
    触发语句        :old                      :new
    Insert     所有字段都是空(null)       将要插入的数据
    Update     更新以前该行的值            更新后的值
    delete     删除以前该行的值            所有字段都是空(null)

3、使用触发器

相关图片

相关文章