其他预定义例外
1.login_denide --非法用户登陆
2.not_logged_on --没登陆就执行dml操作语句
3.storage_error --超出内存空间或是内存被破坏
4.time_on_resource --等待资源出现超时
自定义例外
create or replace procedure ex_test(name1 varchar2) is
myex exception;
begin
update mytable set sal=sal+100 where name=name1;
if sql%notfound then
raise myex;
end if;
exception
when myex then
dbms_output.put_line('没有更新任何用户');
end;
视图: (虚拟的表,在
数据库中不实际存在!动态生成,从不同的表中取出部分数据构成一张虚拟的表)
视图与表的区别:
1.表占用磁盘空间,视图不占用磁盘空间
2.视图不能添加索引
3.使用视图可以简化 复杂查询
4.视图利于提高安全性
创建视图:(把mytable 表 的sal <400的雇员 映射到该视图)
create or replace View myview as select * from mytable where sal<=400;
删除view:
drop View myview;
触发器
--当用户登陆/退出或者操作某个数据对象/或者进行ddl操作时,有一个存储过程被隐藏的执行
,这个特殊的存储过程称之为触发器。
--提出问题
--用户登录时,自动记录用户名字,登陆ip
--删除记录时,自动保存到另一张表中,以便后悔恢复;
--周日不能对一张表进行操作
--触发器的分类
dml触发器
--增删改触发器
ddl触发器
--数据定义触发器(create tabel|view ..dorp)
--与系统相关的触发器(登陆,退出,启动
数据库,关闭数据库)
--触发器的快速入门
--在一张表中添加数据时,提示添加了一条数据;
set serviceoutput on ;
create or replace trigger trigger_test after
insert on omgap.mytable --语句级触发器;
begin
dbms_output.put_line('添加了一条记录');
end;
--在某张表修改多条数据时,提示‘多次修改了数据!’(行级触发器和语句级触发器的区别)
set serviceoutput on ;
create or replace trigger trigger_test after
insert on omgap.mytable
for each row --行级触发器
begin
dbms_output.put_line('添加了一条记录');
end;
--周日不可以对某张表进行操作
create or replace trigger trigger_test
before delete on omgap.mytable
begin
if to_char(sysdate,'day') in('星期日','星期六') then
--虽然提示,但是仍然阻止不了删除操作,需要抛出程序错误才可阻止删除;
dbms_output.put_line('周末不可以删除数据!');
end if;
end;
--抛出程序错误才可阻止删除操作;
create or replace trigger trigger_test
before delete on omgap.mytable
begin
if to_char(sysdate,'day') in('星期日','星期六') then
dbms_output.put_line('周末不可以删除数据!');
--第一个参数范围在-20000~-20099
raise_application_error(-20001,'sorry,周末不可以删除数据!');
end if;
end;
--周日操作可以是inert,update ,delete 明确是哪一种
create or replace trigger triggerf_test before insert or update or delete on
omgap.mytable
begin
case
when inserting then
raise_application_error(-20003,'不能添加');
when updating then
raise_application_error(-20002,'不能更新');
when deleting then
raise_application_error(-20001,'不能删除');
end case;
end;
--使用:old 和 :new
--显示雇员工资修改前和修改后的值
--如何确保修改员工工资不能低于原有工资
create or replace trigger trigger_test
before update on omgap.mytable
for each row
begin
if :new.sal <:old.sal then
raise_application_error(-20004,'原来工资不能低于现在工资');
else
dbms_output.put_line('原来工资:'||:old.sal||' 现在工资:'||:new.sal);
end if;
end;
--使用触发器备份一张表格
create table mytable_bak(name varchar2(30),passwd varchar2(30),sal number(6,2));
create or replace trigger trigger_test
before delete on omgap.mytable
for each row
begin
insert into mytable_bak values(:old.name,:old.passwd,:old.sal);
end;
--系统触发器
ora_login_user//返回登录用户名
ora_sysevent//返回系统事件名
--记录登录和退出触发器;
--登录
create table log_table(userName varchar2(30),logon_time date,logoff_time date,address varchar2(30));
create or replace trigger trigger_test after logon on database
begin
insert into log_table(userName,logon_time,address) values(ora_login_user,sysdate,ora_client_ip_address)