本篇文章主要介绍了"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、使用触发器