日期:2014-05-16  浏览次数:20384 次

存储过程---函数---触发器
存储过程(store procedure)
带有名字的PL/SQL程序块

创建过程:
create or replace procedure is(as) 过程名
begin
  过程体
end 过程名;

执行过程:
exture 过程名;
begin
过程名;
end;

create or replace procedure p(v_a in number,v_b number,v_ret out number,v_temp in out number) is..........
in是接受过程外传递来的值(不写默认为in类型)
out是指将在过程中被赋值
in out同时具有in和out类型特性

函数(function)
函数的创建:
create or replace function sal_tax(v_sal number) return number
is
begin
if (v_sal<2000) then return 0.10;
。。。。。。。。。
。。。。。。。。 。
end if;
end;

函数调用:
select sal_tax(sal) from emp;

触发器(trigger)
当数据发生变化时自动触发,不能独立存在要依附于一张表。
触发事件:DML语句,执行insert update  delete等语句触发的事件
          DDL语句,执行create alter drop 等语句触发的事件

触发器的创建
create or replace trigger trig after(before)---指触发的时间在事件发生的前或后
insert or delete or update on emp for each row--触发的级别,是对事件影响的每一行触发还是对语句触发,语句触发只能触发一次,而且不能访问受触发器影响的每一行的值
begin
  if inserting(关键字) then insert into XX values (user,'insert',sysdate);
   if deleting then insert into XX values (user(关键字),'delete',sysdate);
   if updating then insert into XX values (user,'update',sysdate(求当前的时间));
   。。。。。。。。

update dept set deptno = 99 where deptno =10;--该语句存在错误,因为(deptno=10)有以此作为参考的表,即违反了外键(FK)的约束条件
用下列方法解决上述问题:
create or replace trigger trig after(before) update on dept for each row
begin
update emp set deptno= :NEW.deptno where deptno = :OLD.deptno;
end;
再执行
update dept set deptno = 99 where deptno =10;
就合法了。