oracle中的procedure,function,trigger
上一篇 / 下一篇 2007-12-13 12:35:03 / 个人分类:Oracle数据库

1. procedure
--修改student表中对应id的学生姓名ITPUB个人空间RX&PB$N3?|'L
create or replace procedure p_modifyNameITPUB个人空间/h,qLSU,C hh
(v_Name in varchar2,v _Id char) as --and another:out,in out
a.kSqY'l6g.rq-r$c-V0begin
pFY,QM,P |0update student set name=v_name where id=v_Id;ITPUB个人空间qF:@k8t|5~u
commit;
7~/G3EX@ Qd'Y0end p_modifyName;
ITPUB个人空间LB%L9ia1dnN*b
--调用存储过程
YI-]NV:eJW0declare
v_Name varchar2(10);ITPUB个人空间K.D/H%YODG
v_Id char(10);
;U8U
I
F:A_5l:s0beginITPUB个人空间7f:mlj}k
v_Name:='朱林';ITPUB个人空间NN8JdFp
[
v_Id:='0420622';
--调用上面创建的存储过程
n8X V-Y]0p_modifyName(v_Name,v_Id);
end;
--p_modifyName('朱林','420622');
--位置标志法:要按照位置排序
,lN S\~
nf}0--带名标志法:ITPUB个人空间@s:}smfmY
declare
-~pd6wK0N,\0v_Sname varchar2(10);
JM-g N5y)U u6R0v_Sid char(10);
,D5NR1c/E0beginITPUB个人空间:| lr9@ \#K3l
v_Sname:='朱林';ITPUB个人空间'i|zH3F+a
v_Sid:='0420622';
p_modifyName(v_Id=>v_Sid,v_Name=>v_Sname);
--删除存储过程
BRC2}YR&K0w:t5V
x"j0drop procedure P_modifyName;
--增加权限
$au#q?4?
YT0grant execute on ProceduceName to UserName;
R2M|OE6Q+mf._1e0revoke execute on ProceduceName from UserName;
实例
yAAM3c0create or replace procedure for_loop(
^t)L^[1{vh V+B7M0 v_num1 in number;ITPUB个人空间 B }$nniX
v_num2 in number;)ITPUB个人空间-U2j+C&E^
isITPUB个人空间;u)C(O"?){'r#C
r_8T
i number(3);ITPUB个人空间8k;U
Wg\W'O%~h
begin
~2b8|6avSm$I h1f4MW+_0 if v_num1<=v_num2 thenITPUB个人空间 bv(Su$Sa"E
i
i:=v_num1;
-[T6LzU,E0 for i in v_num1..v_num2 loop --这里的循环是循环到v_num2的值就结束循环了ITPUB个人空间%Ga+A9fr-R xo$d
dbms_output.putline(i);ITPUB个人空间@$v4b,QR4R/I2j8D L
end loop;
.No
l"f3U |M0 end if;ITPUB个人空间#X+~7DI;? b8C0N E
end;
%B;\$t3TG9Y(rk0查看所写的存储过程
/Q
v!A6P"K-L0select *from dba_source where type='procedure';
2.function
--函数功能:
'U$DOI W^*y0--得到指定系,指定课程的出勤情况,如果全部出勤,则返回'full',如果出勤超过80%,则返回'Some Room',超过60%,则返回'More Room',如果出勤小余60%,返回'Lots of room',ITPUB个人空间7]V^9c*[zs!R5jg
--没有出勤,返回'Empty'
zx(Xr#K#pQ(L7L+R0create or replace function GetClassInfo(
/Pe9B(U]T0--系名
k1mLFq"]j Sx2_ K0v_Dept classes.department%type,
Q'o[ qz2Q,o-LJ0--%type:v_Dept 继承了classes表中department字段的数据类型和精度
]+b Zba1y:nEM0--课程名ITPUB个人空间Wkx.`/U{
a
v_Course class.course%type)ITPUB个人空间PQ4t+Md EX+|
return varchar2 isITPUB个人空间dv@j{ jg
--出勤的学生数ITPUB个人空间kOM+S*q&za]O/_
n_CurrSNum number;ITPUB个人空间_ek_?^
--学生人数
PmmQ/c%LG0n_MaxSNum number;
~ NK0hr-Z#y8U8r0--出勤率
#j&HS7n:Pf0n_PercentFull number;ITPUB个人空间%T
q8N]/{*dT
beginITPUB个人空间E&^&J"j/w.q
cz
--得到学生的出勤人数和学生总人数ITPUB个人空间cOLKz:p3dcgk
select current_students,max_students
H@3w9|^wPd5{X0--查询的返回值被赋予INTO子句中的变量ITPUB个人空间C;a8\$N/p-[&kA+g
into n_CurSNum,n_MaxSnum
e0q?ys+X)h0 from classesITPUB个人空间l3U2mZq RF
where department=v_Dept
m
|fr(Menb8f0 and course=v_Course;
KBRp%o&Y:@0--计算出勤率
n_PercentFull:=n_CurSum/n_MaxSum*100;
7Q:|-{4P!{u;t0--返回值ITPUB个人空间]W` tULh
if n_PercentFull=100 then
s"g1gEm f0return 'Full';
'YMM\$]s8jD0....ITPUB个人空间+E)^&p8VKw5Ux
...ITPUB个人空间pk.Fv*Sc3n k
end if;ITPUB个人空间@QO?:yw P|b
end GetClassInfo;
ITPUB个人空间T:dG0S.N2nw2F!~:d
--调用函数ITPUB个人空间5H6E1Lw&E