风就是风,风的方向有谁知道? 有意义就是好好活,好好活就是做有意义的事情!是什么使我不由自主的仰望星空?

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,Chh
(v_Name in varchar2,v _Id char) as   --and another:out,in out
a.k SqY'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%Y ODG
v_Id char(10);
;U8U I F:A_5l:s0beginITPUB个人空间7f:mlj }k
v_Name:='朱林';ITPUB个人空间NN8Jd Fp [
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-gN5y)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;

 

实例
y AAM3c0create or replace procedure for_loop(
^t)L^[1{vh V+B7M0        v_num1  in number;ITPUB个人空间B}$nni X
        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$Ih1f4MW+_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/I2j8DL
   end loop;
.No l"f3U |M0  end if;ITPUB个人空间#X+~7DI;?b8C0NE
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--系名
k1mLF q"]jSx2_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_?^
--学生人数
Pmm Q/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*Sc3nk
end if;ITPUB个人空间@QO?:yw P|b
end GetClassInfo;

ITPUB个人空间T:dG0S.N2n w2F!~:d
--调用函数ITPUB个人空间5H6E1Lw&E`"u |
declareITPUB个人空间Spc A-~]YD`I
v_Dept varch2(30);
.` F9AA RMM0v_Course varchar2(30);
#C.KQ C8p5l?3}KY;L0v_ClassInfo varchar2(20);
V| _8L.E^)F/E@0begin
(wI&E'u#s3V/|'a(^0v_Dept:='水利系';
vF%OKuu#I(pe0v_Course varchar2:='水力学';ITPUB个人空间&Ka,GZ)n C ?
v_ClassInfo:=GetClassInfo(v_Dept,v_Course);
jm,{mC6zH-b:V0dbms_output.put_line(v_ClassInfo);
6q]L`.t0end;

 

3.trigger

--indert,delete,update触发t_UpdateMajorStats,保持major_stats最新记录ITPUB个人空间 X-M#Y!T;Q6s
--create major_stats
5E0nep0K4l+ZmD0create table major_stats(
%r~^-G!iR0major varchar2(30),
r9gD-Yq$E4U KT0total_credits number(3),
!A@8mM ~8n ^H%J$lx6Sx-R0total_students number(4);

-- create trigger major_stats,update major_stats
B A(L H5CTd0create or replace trigger t_UpdateMajorStats

after insert or delete or update on student
&^*d |%SG$l5s [!B4`g0declareITPUB个人空间'q)u` X-I:]#Tm
cursor  c_Statistics is  --define a cursorITPUB个人空间N5sE:Lr:Fd1vz;W9r
select major,count(*) as total_students,  --count(name) etc
D h Cn*P0ox0sum(current_credits) as total_credits
K]z v9`&I7LvJ0from student   --get new record from student

group by major;
}/y9S;xo cj#L6I0beginITPUB个人空间[QA-P7h$A NN R9k
delete from major_stats;  --clear major_statsITPUB个人空间UNk8x,^-OV
for v_StatsRecord in c_Statistics loop  --
1pQV3O/wZT0--for 循环变量 in [reverse] 初始值..结束值 loopITPUB个人空间6m| n`j']5M
insert into major_stats(major,total_credits,total_students)
s7[nf9C.aN$K0values (v_StatsRecord.major,v_StatsRecord.total_credits,ITPUB个人空间|'[9T h)A!Gb
v_StatsRecord.total_students);  --insert new record into major_statsITPUB个人空间.il,PWO&d
end loop
-iI~ yu7y/CS(K0~0end t_UpdateMajorStats;ITPUB个人空间4\SVv'zRU"J1K
/

--"show errors;" can show error from trigger


Mr^*OSD+Q"U0--another simple example
M Q#PA$LUL {:A0create or replace trigger T_DEL_EMP
(AAQe9g0w0before delete on empITPUB个人空间1v2ozG#W*Xa
for each row
lK*h'SuCT_0insert into del_emp(depno,empno,ename)
,Q&q4e [o0o\+V(j(u0values (:old.depon,:old.empno,:old.ename);
`\0Ri-[*Y\0end;ITPUB个人空间2R @5T~.}?V jo
 
FJZ3zS*Y;} `Iw5A0--delete the trigger forerverITPUB个人空间 Z1H HRm`$B9q
drop trigger trigger_name;
2sL$JZB+@0--undo trigger
sO7h Z/~`!A0alter trigger trigger_name disable;
J2m"f%T,r$LfpW4l5y'V0alter trigger trigger_name enable;

--格式化代码

*每开始一个新的代码块时,应该缩进2-5个空格,注意再每个这样的代码结束后,应该取消这个缩进ITPUB个人空间Q&[,y$rB X(JF:},}
*关键字用大写,这样可以区分常规代码和oracle提供的代码
O)Z1ny8fc'Hby0*变量名采用大小写混合模式ITPUB个人空间;HtGRf;t)U
*每条语句用一行,增强程序的可读性ITPUB个人空间%]%[!]1_6~ T

0a Z;QT(~k&E0刚接触oracle,希望和我一样的朋友共同进步!!


TAG: oracle

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar