Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24969
  • 博文数量: 25
  • 博客积分: 1010
  • 博客等级: 少尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-22 20:04
文章分类

全部博文(25)

文章存档

2011年(1)

2009年(24)

我的朋友
最近访客

分类: Oracle

2009-08-14 17:08:32

------------触发器
当特定事件发生时自动执行的命名段
create or replace trigger 触发器名
after|before  事件
on 表名
[for each row]
begin
语句;
end;
/
create or replace trigger t1
after delete
on student
for each row
begin
dbms_output.put_line('你删除了记录');
end;
/
create or replace trigger t1
after delete
on student
for each row
declare
str varchar2(20);
begin
str:='你删除了记录';
dbms_output.put_line(str);
end;
/
------------:old表保存最近一次删除的记录
create or replace trigger t2
after delete
on student
for each row
begin
insert into stu
values(:old.sno,:old.sname,:old.ssex,:old.sage,:old.sdept);
end;
/
注意:只要触发器中包含:new或者:old表,必须使用for each row

--------------:new表保存最近一次插入的记录
create or replace trigger t3
after insert
on student
for each row
begin
insert into stu
values(:new.sno,:new.sname,:new.ssex,:new.sage,:new.sdept);
end;
/
---------------:new和:old
create or replace trigger t4
after update of sno
on student
for each row
begin
update stu
set sno=:new.sno
where sno=:old.sno;
end;
/
注意:update是唯一能接of的事件
-----------raise_application_error(-200001,'错误信息')
-----------学生表不允许做DML操作(insert,update,delete)
create or replace trigger t5
after insert or update or delete
on student
for each row
begin
raise_application_error(-20001,'学生表不允许做DML操作');
end;
/
 
注意:触发器中不能写事务语句(commit,rollback)

------------学生表只允许在周一到周五做dml操作
create or replace trigger t5
after insert or update or delete
on student
for each row
begin
if to_char(sysdate,'day') in ('星期六','星期日') then
raise_application_error(-20001,'学生表不允许做DML操作');
end if;
end;
/

---------------inserting,updating,deleting
create or replace trigger t6
after insert or update or delete
on student
begin
if deleting then
dbms_output.put_line('你删除了记录');
elsif inserting then
dbms_output.put_line('你插入了记录');
else
dbms_output.put_line('你修改了记录');
end if;
end;
/
 
-----商品表
商品id
商品名称
数量
-----进货表
id
商品ID
商品名
数量

----------------编写触发器
-----进货表
1.当对进货表做插入的时候,判断商品表是否有该商品,有修改数量,无就插入
2.进货表不允许删除和修改
-----出货表
1.当对出货表做插入的时候,判断商品表是否有该商品,数量是否够,有商品并且数量够修改数量,否者禁止插入
2.出货表不允许删除和修改

create table 商品表
(
商品ID    number,
商品名称  varchar2(20),
数量      number
);
create table 进货表
(
id         number,
商品ID     number,
商品名称   varchar2(20),
数量       number
);
create table 出货表
(
id         number,
商品ID     number,
商品名称   varchar2(20),
数量       number
);

create  or replace trigger t7
after insert or update or delete
on  进货表
for each row
declare
n number;
begin
if inserting then
 select count(*) into n from 商品表 where 商品id=:new.商品id;
 if n>0 then
  update 商品表
  set 数量=数量+:new.数量
  where 商品id=:new.商品id;
 else
  insert into 商品表 values(:new.商品id,:new.商品名称,:new.数量);
 end if;
elsif deleting then
        raise_application_error(-20001,'进货表不允许做删除操作');
else
 raise_application_error(-20001,'进货表不允许做修改操作');
end if;
end;
/
create  or replace trigger t8
after insert or update or delete
on  出货表
for each row
declare
n number;
m number;
begin
if inserting then
 select count(*) into n from 商品表 where 商品id=:new.商品id;
 if n>0  then
                select 数量 into m from 商品表 where 商品id=:new.商品id;
    if m>=:new.数量 then
   update 商品表
   set 数量=数量-:new.数量
   where 商品id=:new.商品id;
   else
    raise_application_error(-20001,'库存数量不够,不允许出货');
                end if;
        else
         raise_application_error(-20001,'没有该商品不允许出货');
 end if;
elsif deleting then
        raise_application_error(-20001,'出货表不允许做删除操作');
else
 raise_application_error(-20001,'出货表不允许做修改操作');
end if;
end;
/

insert into 进货表 values(1,1,'锅巴',10);
insert into 进货表 values(2,1,'锅巴',10);
insert into 进货表 values(3,2,'啤酒',20);
insert into 进货表 values(4,2,'啤酒',25);
insert into 出货表 values(1,1,'锅巴',10);
insert into 出货表 values(2,1,'锅巴',10);
insert into 出货表 values(3,2,'啤酒',20);
insert into 出货表 values(4,2,'啤酒',25);
insert into 出货表 values(5,2,'啤酒',25);
select * from 商品表;
select * from 进货表;
select * from 出货表;
-------------------------before
create table goods
(
单价   number,
数量   number,
总计   number
);

insert into goods(单价,数量) values(5,2);
insert into goods(单价,数量) values(2,3);

create or replace trigger t9
before  insert
on goods
for each row
begin
:new.总计:=:new.单价*:new.数量;
end;
/
 

注意:如果触发器中存在修改:new表或者:old表中的值时,必须使用before
--------------------oracle主键自动增长
create table temp
(
id   number,
name varchar2(20),
primary key(id)
);

create sequence s1
increment by 1
start with 1;
create or replace trigger t10
before insert
on temp
for each row
begin
select s1.nextval into :new.id from dual;
end;
/

insert into temp(name) values('张3');
insert into temp(name) values('张4');
insert into temp(name) values('张5');

------------------mysql
old
new
create table temp
(
id   int primary key auto_increment,
name varchar(20)
)

-------------------mssql
deleted
inserted
create table temp
(
id   int primary key identity(1,1),
name varchar(20)
)

select * from user_triggers--------查询竟有哪些触发器
drop trigger 名字;-----删除触发器。(如果表被删除,表上面的触发器将全部被删除)
select * from user_objects;---查询当前用户下所有对象
 

--------------数据导入导出
********************以下命名都是在dos下执行,切忌没有分号**********
---------导出
C:\>exp file=c:\zou.dmp---把用户zou下的所有对象全部导出
C:\>exp file=c:\zou.dmp tables=(student,sc,course)---把用户zou下的student,sc,course表导出

--------导入
C:\>imp file=c:\zou.dmp full=y
C:\>imp file=c:\zou.dmp tables=(student,sc,course)
C:\>imp file=c:\zou.dmp tables=(student,sc,course)  IGNORE=Y
 
 

---------------------------------
1.net manager中配置服务命名(lxw,cbh)
2.配置数据库连接
-----配置数据库连接luoxiwei去连接eg账户
create database link luoxiwei connect to eg identified by eg using 'lxw';
-----配置数据库连接chengbaihua去连接winc账户
create database link chengbaihua connect to winc identified by winc using 'cbh';
3.创建同义词
SQL> create synonym student for ;
同义词已创建。
SQL> create synonym course for ;
同义词已创建。
4.直接用
select sname,cname,grade
from student,sc,course
where student.sno=sc.sno and course.cno=sc.cno;
 
 
 
 
 
 

 
阅读(396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~