Oracle 实验4(实验报告)-PL - SQL程序设计(3)

2020-04-21 06:23

END tri_delCList;

(4)2.1.4

CREATE OR REPLACE TRIGGER tri_all BEFORE INSERT OR UPDATE OR DELETE ON CList FOR EACH ROW DECLARE

t_Smoney C.Smoney%type; t_SPsum C.SPsum%type; BEGIN

IF INSERTING THEN

Select Mname,Mprice,Mcost,:new.Cqty*Mprice into :new.Mname,:new.Mprice,:new.Mcost,:new.Cmoney from Mlist

where Mlist.Mid=:new.Mid;

Select nvl(sum(Cqty*Mprice),0),nvl(sum(Cqty*(Mprice-Mcost)),0) into t_Smoney,t_SPsum from Clist

where Clist.Cid=:new.Cid;

update C

set Smoney=t_Smoney+:new.Cmoney,SPsum=t_SPsum+(:new.Cqty*(:new.Mprice-:new.Mcost)) where C.Cid=:new.Cid; ELSIF UPDATING THEN

select Mname,Mprice,Mcost

into :new.Mname,:new.Mprice,:new.Mcost from Mlist

where Mlist.Mid=:new.Mid;

:new.Cmoney:=nvl(:new.Cqty,:old.Cqty)*nvl(:new.Mprice,:old.Mprice); Update C set Smoney=Smoney-:old.Cmoney+:new.Cmoney,

SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcost)+:new.Cqty*(:new.Mprice-:new.Mcost) where C.Cid=:old.Cid; ELSE

UPDATE C SET

C.Smoney=C.Smoney-:old.Cmoney,C.SPsum=C.SPsum-(:old.Cqty*(:old.Mprice-:old.Mcost));

9 / 13

END IF; END tri_all;

3.3.4 完成【2.2 存储过程、自定义函数设计】 (1)2.2.1

CREATE OR REPLACE FUNCTION fGetDTSum (Cyear char,Ctable dk.dkname%type) RETURN C.spsum%TYPE AS

cons C.spsum%TYPE; BEGIN

select nvl(sum(spsum),0)into cons from C where did in(

select did from dinfo where dkid in ( select dkid from dk where dkname=Ctable)) and (to_char(endtime,'YYYY')=Cyear); RETURN cons; EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('The data is invalid!'); END fGetDTSum;

(2)2.2.2

CREATE OR REPLACE PROCEDURE pGetKindSum( Cyear char,Cname char, cons out clist.mcost%TYPE) AS BEGIN

select nvl(sum(mprice-mcost),0) into cons from clist where mid in

(select mid from mlist where mkid in (select mkid from mk where mkname=Cname)) and cid in

(select cid from C where to_char(endtime,'YYYY')=Cyear); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('The data doesn’’t exists!'); END pGetKindSum;

(3)2.2.3

DECLARE

cons1 C.spsum%TYPE; cons2 clist.mcost%TYPE;

10 / 13

BEGIN

cons1:=fGetDTSum('2013','包间'); pGetKindSum('2013','鱼类',cons2);

DBMS_OUTPUT.PUT_LINE('cons1 '||cons1||'cons2 '||cons2||''); END;

3.3.5 完成【2.3 程序包设计】 (1)2.3.1

CREATE OR REPLACE PACKAGE pkSUM AS

FUNCTION fGetDTSum

(Cyear char,Ctable dk.dkname%type) RETURN C.spsum%TYPE; PROCEDURE pGetKindSum( Cyear char,Cname char, cons out clist.mcost%TYPE); END pkSUM;

CREATE OR REPLACE PACKAGE BODY pkSUM AS

CREATE OR REPLACE FUNCTION fGetDTSum (Cyear char,Ctable dk.dkname%type) RETURN C.spsum%TYPE AS

cons C.spsum%TYPE; BEGIN

select nvl(sum(spsum),0)into cons from C where did in(

select did from dinfo where dkid in ( select dkid from dk where dkname=Ctable)) and (to_char(endtime,'YYYY')=Cyear); RETURN cons; EXCEPTION

WHEN NO_DATA_FOUND THEN

11 / 13

DBMS_OUTPUT.PUT_LINE('The data is invalid!'); END fGetDTSum;

CREATE OR REPLACE PROCEDURE pGetKindSum( Cyear char,Cname char, cons out clist.mcost%TYPE) AS BEGIN

select nvl(sum(mprice-mcost),0) into cons from clist where mid in

(select mid from mlist where mkid in (select mkid from mk where mkname=Cname)) and cid in

(select cid from C where to_char(endtime,'YYYY')=Cyear); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('The data doesn’’t exists!'); END pGetKindSum; END pkSUM;

CREATE OR REPLACE PACKAGE BODY pkSUM AS

CREATE OR REPLACE FUNCTION fGetDTSum (Cyear char,Ctable dk.dkname%type) RETURN C.spsum%TYPE AS

cons C.spsum%TYPE; BEGIN

select nvl(sum(spsum),0)into cons from C where did in(

select did from dinfo where dkid in ( select dkid from dk where dkname=Ctable)) and (to_char(endtime,'YYYY')=Cyear); RETURN cons; EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('The data is invalid!'); END fGetDTSum;

CREATE OR REPLACE PROCEDURE pGetKindSum( Cyear char,Cname char, cons out clist.mcost%TYPE) AS

12 / 13

BEGIN

select nvl(sum(mprice-mcost),0) into cons from clist where mid in

(select mid from mlist where mkid in (select mkid from mk where mkname=Cname)) and cid in

(select cid from C where to_char(endtime,'YYYY')=Cyear); EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('The data doesn’’t exists!'); END pGetKindSum; END pkSUM;

(2)2.3.2

DECLARE

cons1 C.spsum%TYPE; cons2 clist.mcost%TYPE; BEGIN

cons1:=pkSUM.fGetDTSum1('2013','散台'); pkSUM.pGetKindSum1('2013','蔬菜类',cons2);

DBMS_OUTPUT.PUT_LINE('cons1:'||cons1||' cons2:'||cons2||''); END;

4. 实验总结

这次实验让我学会了许多东西,比如PLSQL Developer的使用,高级PL/SQL程序的编写,其中包括触发器,储存过程,自定义函数,匿名函数,程序包的设计与编写。另外,也让我又温习了一遍基础SQL语言。我也明白了一个道理,“纸上得来终觉浅,绝知此事要躬行”,学好这门课最好的办法还是上级亲自实践一遍。总之,这门课令我受益匪浅。

13 / 13


Oracle 实验4(实验报告)-PL - SQL程序设计(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:乡镇有线电视网络的整合与管理

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: