文档库 最新最全的文档下载
当前位置:文档库 › Oracle触发器过程等的实验

Oracle触发器过程等的实验

实验四: PL/SQL程序设计

一、实验目的

♦掌握PL/SQL程序设计基本技巧,包括基本数据类型、表类型、数组类型、匿名程序块、控制语句、PL/SQL中使用SQL语句、游标、错误处理等。

♦熟悉和掌握PL/SQL中关于存储过程、函数、包和触发器程序设计技术。

二、实验内容

某餐饮系统数据库,请创建如下各数据表,并实现如下存储过程、函数、包和触发器等功能设计,将程序脚本保存到文本文件Source, sql中:

(1)菜肴类别表MK (菜肴类别编号MKid,菜肴类别名称MkName),菜肴类别名称:鱼类、蔬菜类、凉菜类、肉类、主食类和酒水类等。

(2)菜单信息表MList(菜肴编号Mid,菜肴名称Mname,菜肴类别MKid,菜肴单价Mprice, 菜肴成本单价Mcost,更新日期Mdate)。

(3)餐台类别表DK (餐台类别编号DKid,餐台类别名称DkName),餐台类别:包间和散台等。

(4)餐台信息表Dinfo (餐台编号Did,餐台名称Dname,餐台类物DKid,座位数Dseats, 更新日期Ddate)。

(5)消费单主表 C (消费单号Cid,餐台编号灯"消费开始时间StartTimc,结账时间EndTinιe,消费金额合计Smoney,盈利金额合计SPsum),其中,消费金额合计二消费单明细表CList中该消费单号的所有消费记录的消费金额的合计,即SUM (消费金额)或SUM (菜肴单价X消费数量),盈利金额合计二消费单明细表CList中该消费单号的所有消费记录的盈利合计,即SUM ((菜肴单价-菜肴成本单价)X消费数量)。

(6)消费单明细表CList (消费单号Cid,序号Sid,菜肴编号Mid,菜肴名称Mname,消费数量Cqty,菜肴单价Mprice,菜肴成本单价Mcost,消费金额Cmoney),消费金额二消费数量X菜肴单价;消费数量为正数是正常点菜,消费数量为负数是退菜,

三、实验步骤及相关程序截图

3. 1创建表空间RESTAURANT,创建用户DINER

3. 1. 1创建表空间RESTAURANT,大小10M

o

3. 1. 2创建用户DINER, 口令XXX,默认表空间RESTAURANT,给该用户授予角色权限CONNECT>

RESOURCEo

Create tablespace restautant datafile T:\oradata\orcl\restautant_ 1 .dbΓsize 10M;

Create user diner identified by zw!2011 default tablespace restaurant;

Grant connect .resource to diner;

3.2创建餐饮系统数据库的所有表,并向各表插入演示数据。

3.2. 1创建实验内容中的餐饮系统数据库的所有表(菜肴类别表MK、菜单信息表MList、餐

台类别表DK、餐台信息表Dinfo、消费单主表C、消费单明细表CList)°

Create table MK (MKid number(2) primary kcy,MKnamc varchar2(20));

Create table DK(DKid number(2) primaιy key,DKname varchar2(20));

Create table MList(Mid number(2) primary key,Mname varchar2(20),MKid number(2) references MK(MKid),Mprice number(7,2),Mcost number(7,2),Mdate dale);

Create table Dinfo(Did number(2) primary key,Dname varchar2(20), DKid number(2) references DK(DKid),Dseats numbcr(4),Ddate date);

Create table CList(Cid number(2),Sid number(2),primary key(Cid,Sid),Mid number(2) references

MList(Mid),Mname varchar2(20),Cqty number(4),Mprice number(7,2),Mcost number(7,2),Cmoney number。,2)); Create table C(Cid number(2) primary key, Did number(2) references Dinfo(Did),SlartTime date,EndTime

date,Smoney number(7,2), Spsum number(7,2));

SQL> Create table I1K WKi d nunber (2) primary key z MKname varcħar2 (20));

Table created

SQL> Create table DK(DKιd number (2) primary key, DKnane varchar2 (20)):

Tabi。crgtod

SQD Create MLi st (Mid number (2) prim⅛ry cey?∏nωτ∣∙ vαrch⅜r2 (2O)/ HKi d number (2)rαferenc∙x MK OWKi d)z Mpri c∙ nunb∙r (7, 2)z Mcost number C?

Table created

.SQL> Create table Dinfo (Did number (2) primary key, Dname varchar2 (20), DKid n∖xnber (2) references DK(DKιdX Dseats number (4), Ddate date);

Table created

∣SQL> Cre⅛te tabl< CLi st (Cid number (2) primary kqy, Sid nunb«r (2), Mi d nsber (2) references MList (Wi d)z Mn⅜ne v⅜rchar2 ∣20)z Cqty nunb⅜r (4)/ Mpr

I Table created

SQL> Create tabl< C (Cid number β) primary key. Did number (2) references Dinfo (Di d), Star tTine EndTine date, Smoney nsber(7,2)^ Spsun>

I T—kl 人八•八/1

3.2. 2依次向菜肴类别表MK、菜单信息表MList、餐台类别表DK、餐台信息表Dinfo插入足

够多的演示数据。

将口期的表示形式改变:Alter session set nls date fbrmat=,yyyy-mm-dd,i

(1)菜肴类别表MK

Insert into MK values(01,'鱼类');

Insert into MK values(02,‘蔬菜类');

Insert into MK values(03,'凉菜类');

Insert into MK values(05,'主食类');

Insert into MK values(06,'酒水类');

■‰ A AtkM ∣l∣l∖Y ⅞LJL 3Y S 2 j J ・

row i ns∙rt∙d

JL>

JL> Insert into MK values (02,‘蔬菜类’):

row inserted

)L> XnsQi*t into MK (03/京录):

row inserted

JL> Insert into MK values (04, z肉类’):

row inserted

)L> Insert into MK values (05「主食类’):

row inserted

JL≥ Ixt≡er t into MK values (06/'):

row inserted

(2)菜单信息表MList

Insert into MList values(01,'鳄鱼',01,30,24,'2012-()5-17'); Insert into MList values(02,'鲤鱼',01,42,28,'2012-05-17*); Insert into MList values(03,'带鱼',01,25,20,'2012-05-20'); Insert into MList values(04,'黄花鱼',01,34,28,'2012-05-20'); Insert into MList values(05,'统鱼',01,18,15,'2012-05-30'); Insert into MList values(06,'芹菜',02,15,12,,2012-06-01'); Insert into MList values(07,'韭菜',02,10,8,'2012-06-10]

Insert into MList values(08,'白菜豆腐’,02,13,10,'2012-06-15'); Insert into MList values(09,'菠菜',02,8,5,'2013-04-05]

Insert into MList valucs(l0,'花生米',03,12,10,'2013-04-05'); Insert into MList values。1,'皮蛋豆腐',03,13,10,'2013-05-06'); Insert into MList values。2,'海带',03,7,4,'2013-05-06');

Insert into MList values(13,'辣白菜',03,8,5,'2013-06-01'); Insert into MList values(14,'猪肉',04,34,25,'2013-06-01'); Insert into MList values。5,'牛排',04,48,40,'2013-12-01'); Insert into MList values(16,'羊排',04,45,36,'2013-12-01] Insert into MList values(l 7,'炖鸡',04,42,38,'2013-12-31'); Insert into MList values。8,'猪头肉',04,28,24J2013-12-3T); Insert into MList values。9,'猪蹄',04,36,30,'2014-01-01'); Insert into MList values(20,'宫保鸡丁',04,20/8,'2014-01-10'); Insert into MList values(22,'馒头',05,2』.5,'2014-02-01');

Insert into MList values(24,'青岛啤酒',06,5,3.5,'2014-03-01)

Insert into MList values(25,'散白酒',06,3』.5,'2014-03-01');

Insert into MList values(26,,®JS,,06,6,4,,2014-04-01 ,)j

Insert into MList valucs(27,'哈尔滨啤酒',06,5,4,'2014-04-12]

Insert into MList values(28,'燕京啤酒',06,5,4,'2014-04-12');

Insert into MList values(29,'老村长',06,15,12,'2014-04-12');

Insert into MList values。。,'林海雪原',06,18,14,'2雪4-04-12');

L> Insert into MList values ¢21/米饭∖05, 3, 2 5—);

row inzortod

L> Insert into MLi≡t value=(22/退头"OS, 2, 1.5/2014-O2-Ol');

row inserted

L> Insert into MList values @3/面条’,05, 4, 2 6/2014-03-01');

row ιnzαrtod

L> Insert into MLi≡t vαluo= (24,'青鸟啤酒',06, 5, 3. S,'2014-03-01');

row inserted

L> Insert into MList values ¢25/助白酒'.06, E 1.5」2014-Q3-01'):

row mzortαd

L> Insert into MLx≡t vαluo= (26/雪花啤酒< 06, 6, 4/201 ”O4-O「);

row inserted

L> Insert into MList values ¢27/哈尔浜啤酒',06, 5, 4/2014-0472'):

row inserted

L> In≡ort into MList vαluo≡≡ (28」阪京啤鸡"06, 5, 4/2014-04-12');

(3)餐台类别表DK

Insert into DK values(01,'大包');Insert into DK values(02,'中包〕Insert into DK values(03,'小包');Insert into DK values(04J散台');

L> Insert into DK values 91/大包'):

row inserted

JL> Insert into DK values (02/中包');

row inserted

JL> Insert into DK values (03,'小包'):

row inserted

JL> Insert into DK values (04「散台'):

(4)餐台信息表Dinfo

Insert into Dinfo values(01,'大包一',01,50,'2012-01-01');

Insert into Dinfb values(02,'大包二',01,45,'2012-01-01');

Insert into Dinfb values(03,'大包三',01,40,'2012-01-01');

Insert into Dinfo values(08,'小包一',03,15,'2014-01-01');

Insert into Dinfo values(06,'中包三',02,20,'2013-07-01'); Insert into Dinfb valucs(07,,中包四',02,20,'2013-08-01');

Insert into Dinfo values。。,'小包三',03,10,'2014-01-01');

Insert into Dinfb values(ll,'小包四∖03,l0,,2014-04-01');

Insert into Dinfb values( 12,'散台—,,04,8,,2014-04-01');

Insert into Dinfb values( 13,'散台二',04,8,'2014-04-01');

Insert into Dinfb values(I4,'散台三',04,6,'2014-04-01]

Insert into Dinfb values(15,'散台四',04,6,'2014-04-10');

Insert into Dinfb values(16,'散台五',04,4,'2014-04-10');

Insert into Dinfb values(17,'散台六',04,4,'2014-04-15');

Insert into Dinfb values(18,'散台七',04,4,'2014-04-15');

Insert into Dinfb values",'散台八∖04,2J2014-04-20');

Insert into Dinfb values。。,'散台九',04,2,'2014-04-20');

I VW A ll⅛⅞fX k VU

}L> Insert into Dinfo values (11」小包四',03, 10,' 2014-04-01');

row inserted

)L> Insert into Dinfo ylu= (12/散台一工04, 8,' 2014-04-01');

row inserted

IL> Insert into Dinfo v∙ue3 (13」散台二',04, 8/2014-04-01');

row inserted

)L≥ Insert into Dinfo vαlucn (14.'散台一» » 04. 6.' 2014-04-01'):

row inserted

[L> Insert into Dinfo vαluow (15「散台四’,0, 6, ' 2014-04-10’):

row inserted

)L> Insert into Dinfo value = (16,'散台五"04, 4,'2014-04-10');

row inserted

)L> Insert into Dinfo "2ue (17/散台六',04, 4/2014-04T5');

row inserted

・•・G∙∕∙、Λ *l-' A A Λ . AC ΛC 4 L∙、

3.3完成【实验内容】中的触发器、存储过程、函数和程序包等功能设计

3.3.1完成[2.1触发器设计】

(1)为消费单明细表CList定义一个触发器,每插入(INSERT)一条消费单明细记录(消费单号,序号,菜肴编号,消费数量),自动根据菜肴编号从菜单信息表MList中读取菜肴名称Mname、菜肴单价Mprice、菜肴成本单价Mcost,然后计算其消费金额(=消费数量X菜肴单价)、以及消费单主表C的消费金额合计、盈利金额合计。编写相应的插入语句(INSERT)和查询语句(SELECT)测试该触发器效果。

create or replace trigger InsertClist

before insert on Clist for each row

declare

v_Smoney C.Smoney%type; v_SPsum C.SPsum%type;

insert into CList(Cid,Sid,Mid,Cqty) values(l J J J);

CList(Cid,Sid,Mid,Cqty) values(l,2,6,3);

insert into CList(Cid,Sid,Mid,Cqty) values(l,3J 4,2);

CList(Cid,Sid,Mid,Cqty) values( 1,4,22,10); insert

insert

into

into

insert into CList(Cid,Sid,Mid,Cqty) values( 1,5,28,6);

CList(Cid,Sid,Mid,Cqty) values(l ,6,29,2);

insert into CList(Cid,Sid,Mid,Cqty) values(2,l,2,2);

CList(Cid,Sid,Mid,Cqty) values(2,2,3,l);

insert into CList(Cid,Sid,Mid,Cqty) values(2,3,9,2); insert

insert

insert

into

into

into

CList(Cid,Sid,Mid,Cqty) values(2,4,21,5);

insert into CList(Cid,Sid,Mid,Cqty) values(2,5,28,6);

CList(Cid,Sid,Mid,Cqty) values(2,6,l 4,2);

insert into CList(Cid,Sid,Mid,Cqty) values(2,7,20,l);

CList(Cid,Sid,Mid,Cqty) values©, 1,4,2); insert

insert

into

into

insert into CList(Cid,Sid,Mid,Cqty) values(3,2,9,3);

CList(Cid,Sid,Mid,Cqty) values(3,3,23,5);

insert into CList(Cid,Sid,Mid,Cqty) values(3,4,15,2);

CList(Cid,Sid,Mid,Cqty) values(4,l,4,2); insert

insert

into

into

Begin

Select Mname,Mprice,Mcost√new.Cqty*Mprice into mew.Mname√new∙Mprice√new.Mcost√new.Cmoney from Mlist where

Mlist.Mid=:new.Mid;

Select nvl(sum(Cqty*Mprice),O),nvl(sum(Cqty*(Mprice-Mcost)),O) into v_Smoney,v_SPsum from Clist where Clist.Cid=:new.Cid;

update C set Smoney=v_Smoney+:new.Cmoney,SPsum=v_SPsum+(:new.Cqty*(:new.Mprice-: new.Mcost)) where C.Cid=:new.Cid;

end InsertClist;

测试触发器:

CList(Cid,Sid,Mid,Cqty) values(4,3J3,2);

insert into CList(Cid,Sid,Mid,Cqty) CList(Cid,Sid,Mid,Cqty) values(4,5,28,2);

insert into CList(Cid,Sid,Mid,Cqty) CList(Cid,Sid,Mid,Cqty) values(5,2,8,3);

insert into CList(Cid,Sid,Mid,Cqty) CList(Cid,Sid,Mid,Cqty) values(5,4,22,5);

insert into CList(Cid,Sid,Mid,Cqty) CList(Cid,Sid,Mid,Cqty) values(6,2,19,2);

insert into CList(Cid,Sid,Mid,Cqty) CList(Cid,Sid,Mid,Cqty) values(6,4,23,6);

改变时间格式: 向C 表中插入其

他信息:

insert into C(Cid,Did,StartTime,EndTime) values(l,2,,2013-3-15 18:30:0072013-3-15

20:10:151);

insert into C(Cid,Did,StartTime,EndTime) values(2,15,,2014-4-1 1230r00,,,2014-4-l

14:20:00)

insert into C(Cid,Did,StartTime,EndTime)

values(3,20,,2014-4-12

17:30:02,2014412 19:20:061);

insert into C(Cid,Did,StartTime,EndTime) values(4,9,,2014-4-18 12:10:0572014-4-18

13:30:20');

insert into C(Cid,Did,StartTime,EndTime) values(5,14,,2014-4-20 17:20:10√2014-4-20 18:40:10');

insert

into C(Cid,Did,StartTime,EndTime) values(6,l 3,,2014-4-26 values(4,4,22,6); nsert into

values(5,l,4,2); insert into

values(5,3,20,2); insert into

values(6,1,2,1); insert into

values(6,3,16,3); insert into

Alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

12:05:4072014-4-26 13:30:201);

select cl.*,Cqty*(Mprice-Mcost) as ”单项盈利金额" from Clist cl order by Cid,Sid;

if :new.Cid is not null then

select Cιd,sum(Cmoney),sum(Cqty v Mpπce),sum(Cqty v (Mpπce -Mcost)) from Gist

group by Cid order by Cid;

Select clist Select cli≡t Select c

CID ∣SUM (CM0NEY) ∣SUM (CQTY*MPRICE) ∣SUM (CQTY* (MPRICE-MCOST)) ►

1 1 223 223 50

2 2 258 258 67.5

3 3 208 208 44

4 <

241 241 50

5 5 157 157 27.5

6

6 273 273 6L4

select* from C order by Cid;

Select clist Select clist Select c

∣ ∙ + - ✓ | ▼ 5 ¢14畲▽二1等∣

CID ∣DID ∣STARTTIME ∣ ENDTIME

SMONEY SPSUM 」 ► 1

1 2 2013/3/15 18:30:00 ▼ 2013/3/15 20:10:15 ▼ 223.00 50.00

2 2 15 2014/4/1 12:30:00 ▼ 2014/4/1 14:20:00 ▼ 258. 00 67.50

3

3 20 2014/4/12 17:30:02 ▼ 2014/4/12 19:20:06 ▼ 208.00 44.00

4

4 9 2014/4/18 12:10:0

5 ▼ 2014/4/18 13:30:20 ▼ 241.00 50.00

5 5 14 2014/4/20 17:20:10 ▼ 2014/4/20 18:40:10 ▼ 157.00 27.50

6

6

13 2014/4/26 12:05:40 ▼ 2014/4/26 13:30:20 ▼

273.00 61.40

(2)为消费单明细表CList 定义一个触发器,每更新UPDATE 一条消费单明细

表记录,自动修改其消费金额、以及消费单主表C 的消费金额合计、盈利金 额合计。编写相应的更新语句(UPDATE)和查询语句(SELECT)测试该触发 器效果。

create or replace trigger UpdateClist before update on Clist for each row begin

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);Select clist

Select clist Select c

1 30.00 24.00 30.00 6 3 15.00 12.00 45.00 9

2 34.00 25.00 68.00 18 10 2.00 1.50 20.00 5 6 5.00 4.00 30.00 6 2

15.00

12.00

30.00

6

CID ∣ SID I MID ∣MNAME ∣CQTY

update

set Smoney=Smoney-:old.Cmoney,SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcos t) where C.Cid=:old.Cid;

update C set Smoney=Smoney+:new.Cmoney,SPsum=SPsum+:new.Cqty*(:new.Mprice-:new. Mcost) where C.Cid=:new.Cid; else

Update C set Smoney=Smoney-:old.Cmoney+:new.Cmoney,SPsum=SPsum-:old.Cqty*(:old.M

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

end if;

end UpdateClsit;

测试触发器:

消费单号改变:select cl.*,Smoney,SPsum from Clist cl,C where cl.Cid=l and cl.Sid=3 and

C.Cid=l;

I CID I SID ∣MID MNAME ∣CQTY ∣HPRICE ∣MCOST ,CMONEY ∣SMONEY ∣SPSUM ∣

►1111] 31 14 楮肉∙∙∙] 21 ⅞L00 ~25.001 68.00 ~223.00 ~50.00

update Clist set Cid=4 where Cid=l and Sid=6;

select cL*,Smoney,SPsum from Clist cl,C where cl.Cid=l and cl.Sid=3 and C.Cid=l; L∣J∣▼ I B一 . I (Tβ I ^≡]c¾S ca I l≡l I▼

I CID -ΓSI D I MID∣ MNAME ∣ CQTY ∣ MPRICE ΓM COST I CMOHEY-∣SMONEY ∣ SPSUM ∣

>∣ 1∣1] 3] 14 楮肉—…]21 34 00 ~25∙0θ168.00 ~193.00 ~44.00j

消费单号未改变:

select cL*,Smoney,SPsum from Clist cl,C where cl.Cid=3 and cl.Sid=4 and C.Cid=3; ______ C ID I SID I MID IMNAME ∣CQTY ∣MPRICE ∣MCOST ∣CMONEY ∣SMONEY ∣SPSUM ∣►I 1∣3] 4] 15j牛排…]2「78.00 ~40.00] 96.00] 208.00 ] 44.001

update Clist set Cqty=4 where Cid= 3 and Sid= 4 ;

select cL*,Smoney,SPsum from Clist cl,C where cl.Cid=3 and cl.Sid=4 and C.Cid=3;

CID I SID I MID MNAME CQTY ∣ MPRICE [MCOST ∣CMONE> ISMONEY ∣SPSUM

►I 1 3 4 15 牛排 4 48.00 40.00 192.00 304.00 60.00

(3)为消费单明细表CList定义一个触发器,每删除DELETE 一条消费单明细表记录自动修改其消费单主表C的消费金额合计、盈利金额合计。编写相应的删除语句(DELETE)和查询语句(SELECT)测试该触发器效果。

create or replace trigger DeleteClist

before delete on Clist for each row

begin

update C set Smoney=Smoney-:old.Cmoney,SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcos t) where C.Cid=:old.Cid;

end DeleteClist;

测试触发器:

select * from C where Cid=2;

delete from Clist where Cid=2 and Sid=4;

select * from C where Cid=2;

I CLP ∣ DID ∣STARmME ∣ ENDTIME ∣ SMOHEY ∣ SPSUM ∣

►|1|2〕15 2014/4/1 12:30:00 ▼ 2014/4/1 14:20:00 ▼ ~243.0065.00

(4)将[2. 1. 1】、[2. 1. 2】、【2. L 3]三个触发器禁用disable,重新编写一个

触发器实现这三个触发器的全部功能。编写相应的插入语句(INSERT)、更新语句(UPDATE)、删除语句(DELETE)和查询语句(SELECT)测试该触发器效果。

禁用触发器:Alter table Clist disable all triggers;

创建触发器:

create or replace trigger DML_Clist

before insert or update or delete on Clist for each row

declare

v_Smoney C.Smoney%type;

v_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 MlistMid=:new.Mid;

select nvl(sum(Cqty*Mprice),0),nvl(sum(Cqty*(Mρrice-Mcost)),0) into

v_Smoney,v_SPsum from Clist where Clist.Cid=:new.Cid;

update C set Smoney=v_Smoney+:new.Cmoney,SPsum=v_SPsum+(:new.Cqty*(:new.Mprice-: new.Mcost)) where C.Cid=:new.Cid;

elsif updating then

select Mname,Mρrice,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);

if :new.Cid is not null then

update C set Smon6y=Smoney-:old.Cmoney,SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcos t) where C.Cid=:old.Cid;

update C set Smoney=Smoney+:new.Cmoney,SPsum=SPsum+:neWeCqty*(:new.Mprice-:new.

Mcost) where C.Cid=:new.Cid;

else

update C set Smoney=Smoney-:old.Cmoney+:new.Cmoney,SPsum=SPsum-:old.Cqty*(:old.M price-:old.Mcost)+:new.Cqty*(:neWeMprice-:new.Mcost) where C-Cid=:old.Cid;

end if;

else

update C set Smoney=Smoney-:old.Cmoney5SPsum=SPsum-:old.Cqty*(:old.Mprice-:old.Mcos t) where C.Cid=:old.Cid;

end if;

end DML Clist;

测试触发器:

Insert 测试;

select Smoney,SPsum from C where C.cid=6;

SMONEY ∣SPSUM ∣

► ~273.00 61.40

insert into clist (cid,sid,mid,cqty)values(6,5,7,l);

select cL*,Smoney,SPsum from clist cl,C where cl.cid=6 and sid=5 and C.cid=6;

Update 测试:

select cl.*,Smoney,SPsum from clist cl,C where cl.cid=4 and sid=3 and C.cid=4;

I CID ]siD I MID ∣MNAME ]CQTY ]M PRICE["COST ]CMONEY ∣SMONEY ∣SPSUM -f ELΞΓΓ 4 3 ^13 辣瓯二 2 ^.00 5.00 16.00 241.00 50.00

update clist set mid=6,cqty=5 where cid=4 and sid=3;

select cl.*,Smoney,SPsum from clist cl,C where cl.cid=4 and sid=3 and C.cid=4;

I CID ∣ SID MID ∣M1≡E ]CQΠ∣ MPRICE MCOST JCMONEY_ ∣ SMONEY ∣ SPSUM

►I 1∣ 4 3 6 芹菜 5 15.00 12.00 75.00 300.00 59.00 Delete 测试:

select* from c where cid=6;

_ CID ∣DID ISTARTT工ME ∣ENDTIME ∣SMONEY ∣SPSUM ∣

► T 6-13 2014/4/26 12:05:40 ▼ 2014/4/26 13:30:20 ▼283.00 63.40

delete from clist where cid=6 and sid=5;

select* from c where cid=6;

[CID ∣ DID ∣STARΓΠME∣ ENDTIME ∣ SMONEY ∣ SPSUM ∣

►I 1 6 13 2014/4/26 12:05:40 2014/4/26 13:30:20 273.00 ~61740

经过测试可知,这个触发器有着与前面三个触发器共同的作用。

3.3.2完成[2.2存储过程、自定义函数设计】

(1)设计一个自定义函数fGetDTSum,实现统计某年份给定餐台类别的成本金额合计的功能,输入参数是统计年份和餐台类别,返回数据是成本金额合计。

成本金额二消费数量X菜肴成本单价。求年份的函数为EXTRACT (YEAR

FROM 口

期字段),本题:统计年份二EXTRACT (YEAR FROM EndTime), EndTime 为结账

时间字段。

create or replace function fGetDTSum (v_year number ,v_DkName

Dk.DkName%type)

return CList.Mcost%type

v_Scost CList.Mcost%type;

begin

select sum(Cqty*Mcost) into v_Scost from CList CL,C,DK,Dinfo D where CL.Cid=C.Cid and C.Did=D.Did and D.Dkid=DK.Dkid and Dk.DkName=v_DkName and extract(year from EndTime)=v_year;

return v Scost;

exception

when no_data_found then

dbms_output.put」ineC该餐台信息不存在!,);

end fGetDTSum;

(2)设计一个存储过程pGetKindSum,实现统计某年份给定菜肴类别的盈利金

额合计的功能,输入参数是统计年份和菜肴类别,输出参数是盈利金额合计。盈

利金额二消费数量X (菜肴单价-菜肴成本单价)。

create or replace procedure pGetKindSum(v_year number, v_MkName Mk.MkName%type)

v_GetMoney C.SPsum%type;

begin

select sum(Cqty*(CL.Mprice-CL∙Mcost))into v_GetMoney from CList

CL,C,Mk,MList ML where

CL.Cid=C.Cid and CL.Mid=ML.Mid and ML.Mkid=Mk.Mkid and

Mk.MkName=v_MkName and extract(year from EndTime)=v_year;

dbms_output.put」ine(v_year『年[|v_MkName/的盈利金额为:[|v_GetMoney); exception

when no_data_found then

dbms_output.put」ineC该年份该种菜肴无消费!);

end pGetKindSum;

(3)编写一段匿名PL/SQL程序块,调用函数fGetDTSum,输出2013年餐台类

别名为“包间”的成本金额合计;调用存储过程pGetKindSum,输出2013年菜肴类别名为“鱼类”的盈利金额合计。

declare

v_l CList.Mcost%type;

begin

pgetkindsum(2014,,鱼类);

v_l:=fgetdtsum( 2013:大包');

dbms_output.put_line('2013 年大包的成本金额为:)v_l);

end;

输出结果:

SQL 输出统计表

|清除|缓冲区大小10000 飞团为

2014年鱼类的盈利金额为:83

2013年大包的成本金额为:173

3.3.3完成【2.3程序包设计】

(1)设计一个程序包,包名为pkSUM,包括并实现[2.2.1】和[2.2.2】的函

数及存储过程功能,注意:先创建包头package,包头创建成功后,再创建包体package body0

create or replace package pkSUM

v_GetMoney number;

v Scost number;

function fGetDTSum (v_year number ,v_DkName Dk.DkName%type)return CList.Mcost%type;

procedure pGetKindSum(v_year number,v_MkName Mk.MkName%type);

end pkSUM;

创建包体(包体中函数和存储过程必须和包中定义的完全一致,否则会出现错误) create or replace package body pkSUM

as

function fGetDTSum (v_year number ,v_DkName Dk.DkName%type)

return CList.Mcost%type

v_Scost CList.Mcost%type;

begin

select sum(Cqty*Mcost) into v_Scost from CList CL,C,DK,Dinfo D where CL.Cid=C.Cid and C.Did=D.Did and D.Dkid=DK.Dkid and

Dk.DkName=v_DkName and extract(year from EndTime)=v_year;

return v Scost;

exception

when no_data_found then

dbms_output.put」ineC该餐台信息不存在!);

end fGetDTSum;

procedure pGetKindSum(v_year number,v_MkName Mk.MkName%type)

v_GetMoney C.SPsum%type;

begin

select sum(Cqty*(CL.Mprice-CL∙Mcost))into v_GetMoney from CList CL,C,Mk,MList ML where

CL.Cid=C.Cid and CL.Mid=ML.Mid and ML.Mkid=Mk.Mkid and

Mk.MkName=v_MkName and extract(year from EndTime)=v_year;

dbms_output.put_line(v2_year『年,||v_MkName『的盈利金额为:,||v_GetMoney); exception

when no_data_found then

dbms_output.put」ineC该年份该种菜肴无消费!);

end pGetKindSum;

end pkSUM;

(2)设计一个匿名PL/SQL程序块,参照[2.2.3】调用【2.3. 1】中程序包的函

数和存储过程,输出2013年餐台类别名为“散台”的成本金额合计,输出

2013年菜肴类别名为“蔬菜类”的盈利金额合计。declare

v_scost number。,2);

begin

v_scost:=pkSUM.fGetDTSum(2014,'散台');

pkSUM.pGetKindSum(2014,‘蔬菜类');

dbms-output.put-line(,2014 年散台的成本金额为:1|v_scost); end;

输出结果:

r— I ,,•■—* [ 一九κj |

清除1 缓冲区大小10000 一图国力

2。14年蔬菜类的丝利金额为:24

2014年散台的成本金额为:683.1

四、实验总结

Oracle实验报告模板

实验报告 实验名称:数据库的管理 实验课时:2课时 实验地点:知行楼305 实验时间:年月日星期第周实验目的及要求: 1)了解Oracle数据库的逻辑结构和物理结构。 2)熟悉Oracle的命令操作环境SQL*PLUS。 3)了解启动和关闭数据库的不同方式及其优缺点。 4)熟悉掌握各种启动、关闭方式。 实验环境: 1)硬件设备:PC机一台 2)操作系统:Windows XP 3)应用工具:Oracle 11g 实验内容:(算法、程序、步骤和方法) 1、SQL*Plus的启动与关闭 2、关闭数据库 3、启动数据库 4、改变数据库的状态 5、使用DBCA创建数据库 6、思考题 小结: 通过这次上机实验,我有以下收获:

但是还上机操作过程中还存在以下几个方面的不足: 指导老师评议: 成绩:指导老师签名: 年月日 实验报告 实验名称:表的管理 实验课时:4课时 实验地点: 实验时间:年月日星期第周 实验目的及要求: 1)了解Oracle表和视图的概念。 2)熟练掌握使用SQL语句创建表。 3)学习使用SELECT语句查询数据。 实验环境: 4)硬件设备:PC机一台 5)操作系统:Windows XP 6)应用工具:Oracle 11g 实验内容:(算法、程序、步骤和方法) 1)创建用户,指定密码、表空间。用户名命名以本人姓名的缩写+_+学号后 两位命名。代码如下:

2)创建如下表,将表保存到自己的用户方案中。代码如下: 3)为各表输入数据。代码如下: 4)查询每门课程被选修的学生数。代码如下: 5)查询出只选修了一门课程的全部学生的学号和姓名。代码如下: 6)查询男生、女生人数。代码如下:

oracle专周实验报告

实验报告 课程名称oracle数据库计算机工程学院

目录 一、目的 (3) 二、设计要求说明 (3) 三、专周时间 (4) 四、运行环境 (4) 4.1 硬件环境 (4) 4.2软件环境 (4) 五、实验内容 (4) 5.1.数据库及数据,表的定义 (4) 5.2.钱夹及加密的实现 (7) 5.3.总公司的查询统计............................................................ 错误!未定义书签。 5.4推送信息实现 (10) 5.5.财务数据的导出 (10) 5.6.数据文件丢失恢复实现 (11) 5.7.重做日志文件的恢复实现 (15) 5.8.闪回技术的实现 (18) 5.9.数据库的备份实现 (22) 六、专周总结 (26)

一、目的 1.了解oracle数据库的实际相关运用 2.进一步掌握oracle的功能 3.实现oracle发生数据错误事的数据恢复以及数据库的恢复 4.掌握闪回技术,提高对数据的管理 5.提高数据的性能 二、设计要求说明 需求: 某北京公司因业务及公司扩张需要,现需在成都成立技术部,在上海成立销售部,北京为公司总部,各分公司均有数据服务器 一、数据表与相关访问权限 1、各子公司均有独立的财务部门进行子公司的财务运行,但北京总公司要随时查询与统计,财务数据要求加密; 2、各子公司没有人事招聘权,需由北京总公司统一招聘,数据统一放在总公司,各子公司均可查询 3、成都子公司的相关技术数据只能由成都子公司与北京总公司访问与查询(成都子公司可修改,北京总公司不能修改,上海子公司不能查询、修改),只是成都子公司对于最新技术的发展要同时推送到总公司,而且能被上海子公司直接查询(不用推送);上海子公司的相关销售数据只能由上海子公司与北京总公司访问与查询(成都子公司不能查询,上海子公司可修改,北京总公司不能修改,)以上具体数据表由各组自由定义,不用过多 二、安全操作 1、考虑到数据安全,各公司数据文件、控制文件、重做日志文件数量均要求大于3,临时文件要建组,并要求数据文件分布在不同的磁盘,所有公司的控制文件均要在总公司的服务器上做副本镜像。各子公司要求在每天的固定时间对服务器所有数据做备份或增量备份(热备+冷备) 2、北京总公司要求每天对财务数据进行导出操作 3、能在某子公司服务器上演示数据文件丢失后的恢复过程;演示重做日志文件损坏或丢失后的恢复过程,能进行重做日志文件的切换。 4、能在某子公司服务器上演示闪回技术中的闪回数据库、闪回表、闪回回收站、闪回查询、闪回版本查询

Oracle数据库实验报告

Oracle数据库实验报告 目录 实验一安装和使用Oracle数据库.................................................. - 2 - 实验二体系结构、存储结构与各类参数..................................... - 13 - 实验三Oracle数据库的创建和管理............................................. - 22 - 实验四SQL语言 ............................................................................ - 33 - 实验五PL/SQL编程 ....................................................................... - 41 - 实验六模式对象管理与安全管理 ................................................ - 50 -

实验一安装和使用Oracle数据库 【实验目的】 1.掌握Oracle软件安装过程,选择安装组件 2.掌握建立Oracle数据库,配置网络连接 3.掌握Oracle企业管理器的基本操作 4.使用SQL*Plus,登录到实例和数据库 5.掌握命令方式的关闭和启动实例及数据库 【实验内容】 1.查看已安装的Oracle组件 2.查看服务,记录下和数据库有关的服务名,将他们设为手动方 式,启动相关服务。 3.配置监听器,查看是否在服务中有LISTENER,是否能启动。 4.配置本地net服务,提示:设置正确的服务器地址和端口号。 5.打开SQL*Plus,用SYS和SYSTEM用户名和密码登录。 6.思考题:有几种打开SQL*Plus的方法?分别是什么? 7.用命令关闭实例和数据库,记录命令 8.用命令以NOMOUNT的方式启动实例,再加载数据库,打开数 据库。 【实验结论】 1.查看已安装的Oracle组件

oracle触发器、同义词、序列

淮海工学院计算机工程学院实验报告书 课程名:《大型数据库概论》 题目:触发器、同义词、序列 班级:软件092 学号:110913232 姓名:钟贝娜

实验4 触发器、同义词、序列 实验目的 1. 掌握触发器的创建与使用。 2. 掌握同义词的创建与使用。 3. 掌握序列的创建与使用。 实验环境 局域网,Windows 2003计算机 实验内容 2学时,必做实验 实验内容 1. 创建一个DML触发器:用于每次对表SYSTEM.STUDENT进行DML操作(插入、 删除和修改)前,首先在屏幕上显示该学生原来的年龄、现在的年龄以及新旧年龄的差值。 2. 创建一个用于自动生成学生表STUDENT主键值的序列SNOSEQ。 3. 创建学生表STUDENT的同义词STU。 实验步骤 1、创建触发器,查看分析运行结果; 代码:CREATE OR REPLACE TRIGGER SYSTEM.PRINT_SAGE_TRIGGER BEFORE INSERT OR DELETE OR UPDATE ON SYSTEM.STUDENT FOR EACH ROW DECLARE AGEDIFF NUMBER(3,0); BEGIN AGEDIFF:=:NEW.SAGE-:OLD.SAGE; DBMS_OUTPUT.PUT_LINE('原来年龄:'||:OLD.SAGE); DBMS_OUTPUT.PUT_LINE('现在年龄:'||:NEW.SAGE); DBMS_OUTPUT.PUT_LINE('年龄差值:'||AGEDIFF); END PRINT_SAGE_TRIGGER;

oracle触发器示例

--采用信息表 create table cg ( id number, goodName varchar2(10), goodNum number ) --商品库存 create table stock ( goodName varchar2(10), goodNum number ) create or replace trigger t_cg after insert on cg for each row begin insert into stock values(:new.goodName,:new.goodNum); end; 创建一个触发器,禁止用户删除dept表中的记录 create or replace trigger mytrigger3 before delete on emp_test begin if deleting then raise_application_error(-20020, '禁止删除表dept中的记录 '); end if; end; instead-of触发器(了解): 当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作),语法: create or replace trigger trigger_name instead of insert|update|delete on view_name for each row 如:下面视图是按部门统计,员工人数,工资数。想要从视图中删除部门为10的信息。 CREATE OR REPLACE VIEW emp_view AS SELECT deptno, count(*) total_employeer, sum(sal) total_salary

oracle 触发器的实例

oracle 触发器的实例 触发器使用教程和命名规范 目录 触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,例五:语句级触发器之二 9 9,例六:用包封装触发器代码 10 10,触发器命名规范 11 1,触发器简介 触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法

Oracle触发器实例

Oracle 触发器语法及实例(一) 一Oracle触发器语法 触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。 功能: 1、允许/限制对表的修改 2、自动生成派生列,比如自增字段 3、强制数据一致性 4、提供审计和日志记录 5、防止无效的事务处理 6、启用复杂的业务逻辑 触发器触发时间有两种:after和before。 1、触发器的语法: CREATE [OR REPLACE] TIGGER触发器名触发时间触发事件 ON表名 [FOR EACH ROW] BEGIN pl/sql语句 END 其中: 触发器名:触发器对象的名称。 由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。 触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行; after---表示在数据库动作之后出发器执行。 触发事件:指明哪些数据库动作会触发此触发器: insert:数据库插入会触发此触发器; update:数据库修改会触发此触发器; delete:数据库删除会触发此触发器。 表名:数据库触发器所在的表。 for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。 2、举例: 下面的触发器在更新表auths之前触发,目的是不允许在周末修改表: create trigger auth_secure before insert or update or delete //对整表更新前触发 on auths begin if(to_char(sysdate,'DY')='SUN' RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths'); end if; end; 例子: CREATE OR REPLACE TRIGGER CRM.T_SUB_USERINFO_AUR_NAME AFTER UPDATE OF STAFF_NAME ON CRM.T_SUB_USERINFO REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare begin if :NEW.STAFF_NAME!=:OLD.STAFF_NAME then begin 客户投诉 update T_COMPLAINT_MANAGE set SERVE_NAME=:NEW.STAFF_NAME where SERVE_SEED=:OLD.SEED;

Oracle实验指导书

实验一 Oracle的安装和配置 一、实验目的 1.了解Oracle10g数据库的结构及其基本概念。 2.掌握Oracle10g的安装。 3.学会Oracle10g的基本配置。 二、实验设备和仪器 1、计算机 2、window2000/XP/2003系统 3 Oracle10g服务器和客户端软件 三、实验内容及要求 1.掌握Oracle10g中创建数据库的方法和步骤。 2.掌握Oracle10g中创建表的方法和步骤。 四、实验原理及步骤 1. 安装Oracle10g的服务器和客户端软件; 2. 配置Oracle10g (1) 开始=> 程序=> Oracle10g Enterprise => SQL Plus (2) 使用基本命令对Oracle10g的Listener、SQLNet等配置文件进行编辑。 五、实验报告要求: 1、要求写出Oracle10g的安装过程。 2、要求给出Oracle10g的配置过程。 实验二创建数据库和表 一、实验目的 1.了解Oracle10g数据库的结构及其基本概念。 2.了解Oracle10g的基本数据类型。 3.学会使用DBCA创建数据库。 4.学会在OEM中创建表。 5.学会使用SQL语句手工创建数据库和创建表。 二、实验设备和仪器 1、计算机 2、window2000系统 3 Oracle10g服务器和客户端软件 三、实验内容及要求 1.掌握Oracle10g中创建数据库的方法和步骤。 2.掌握Oracle10g中创建表的方法和步骤。 四、实验原理及步骤 1. 利用DBAC创建数据库YGGL 要求:(1)数据库名称为YGGL,全局数据库名称为YGGL。 (2)三个控制文件:CONTROL01.CTL、CONTROL02.CTL、CONTROL03.CTL。存放路径为 d:\oracle\oradata\yggl\

数据库触发器实验报告

数据库触发器实验报告 一、引言 随着信息技术的发展,数据处理已经成为了各种科学技术领域中至关 重要的一环。在数据处理系统中,数据库是必不可少的组成部分之一。而数据库中的触发器就是实现数据库自动化的重要手段之一。本文对 数据库触发器的实验进行了详细的分析和总结,以期为大家提供一些 有关数据库的实际应用经验和理论指导。 二、实验开展过程 本次实验选择的是MySQL 5.0版本数据库,我们通过多个实验案例来 了解和掌握触发器的实际应用。 1.定义触发器 我们首先通过定义触发器的方法来了解触发器的基本概念和语法结构。通过设置一些触发器的触发条件和执行程序,我们可以实现对数据库 的自动化维护和更新。 2. 插入触发器 然后我们通过插入触发器的实验案例来掌握数据库自动插入数据的具 体实现方法。这样,无须手动输入每一条数据,数据库就可以自动将

新的数据插入到数据库中去。这样做的好处在于可以减少人为错误的发生,并且提高了数据处理的效率。 3. 修改触发器 接下来,我们又进行了修改触发器的实验案例。通过设置一些修改触发器的触发条件和执行程序,可以在数据库中修改一些指定数据,或者将一些数据更新到数据库中。 4. 删除触发器 最后,我们还进行了删除触发器的实验案例。通过设置一些删除触发器的触发条件和执行程序,可以将数据库中的指定数据逐一删除掉,从而实现数据库的自动化维护和更新。 三、实验结果分析 通过本次实验,我们加深了对数据库触发器的理解和掌握。同时,我们也发现在实际应用中,触发器设计的精细度和实现的合理度对于数据库的使用效果有着十分重要的影响。因此,我们应该在实际操作过程中,注重考虑实际应用场景和条件,来设计和优化触发器的应用方案。 四、总结

oracle 触发器工作原理

oracle触发器工作原理 Oracle数据库中的触发器是一种存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实现数据一致性、审计、业务规则验证和复杂的数据处理逻辑。 以下是Oracle触发器工作原理的基本概述: 1.定义与激活: 在Oracle中,通过使用CREATE TRIGGER语句创建触发器,指定其名称、触发时机(BEFORE或AFTER)、触发事件(INSERT、UPDATE、DELETE或COMMIT等)以及作用的对象(表或视图)。 2.触发时机: BEFORE触发器会在实际操作之前执行,此时可以查看并修改将要插入、更新或删除的数据。 AFTER触发器则在实际操作完成之后执行,此时只能查看已经更改后的结果。 3.触发上下文: 对于INSERT操作,触发器可以通过:NEW伪记录访问被插入的新行数据。 对于UPDATE操作,触发器同时可以获得:OLD和:NEW

伪记录,分别代表更新前的老数据和更新后的新数据。 对于DELETE操作,触发器可以通过:OLD伪记录访问即将被删除的行数据。 4.执行逻辑: 触发器内的PL/SQL代码会根据触发条件进行执行,可以包含任何合法的PL/SQL命令,包括对其他表的操作、控制流语句、异常处理等。 5.事务处理: 触发器是事务的一部分,所以它们遵循ACID属性,并且其行为受当前事务的影响。例如,如果事务回滚,则触发器所做的所有变更也会随之回滚。 6.实例应用: 举例来说,一个AFTER INSERT触发器可能用来记录新插入数据到审计表中;而一个BEFORE UPDATE触发器可能用于检查更新的数据是否满足某些业务规则,如果不满足则阻止更新操作。 总之,Oracle触发器是数据库系统内嵌的一种自动化机制,它在特定数据库事件发生时自动执行预定义的逻辑,为确保数据完整性和业务规则得以强制执行提供了强大的支持。

触发器实验报告总结

篇一:触发器及其应用实验报告 学生实验报告 篇二:数据库实验3 触发器报告 数据库专题训练------触发器 实验报告 系别:计算机科学与技术班级:计11-3班姓名:黄娟娟学号:11101020324 成绩: 评语: 指导教师签字:日期: 实验二触发器 一、实验环境及要求 触发器是一种特殊的存储过程,不能被用户直接调用。可以包含复杂的 sql语句。在特定事件发生时自动触发执行,通常用于实现强制业务规则和数据完整性。dml触发器分为两种类型:after 触发器和 instead of触发器。通过本次实验掌握触发器的创建方法以及使用方法。 二、实验步骤及结果 1) 创建一个名为tri_insert_s的触发器,测试改触发器的执行情况,并给出实验结果。当插入的新记录中sage 的值不是18至25之间的数值时,就激活该触发器,撤销该插入操作,并给出错误提示。 use sxcj go create trigger tri_insert_s on s after insert as if exists (select * from inserted where sage>=18 and sage<=25) print添加成功! else begin print无法添加! rollback

transaction end go insert into s values(s8,黄丽,女,26,计算机) insert into s values(s8,黄丽,女,20,计算机) select * from s go 显示如下: insert into s values(s8,黄丽,女,26,计算机) insert into s values(s8,黄丽,女,20,计算机) 2)创建一个名为tri_update_sc的触发器,要求:(1)首先判断数据库中是否已经存在名为tri_update_sc的触发器,如果存在,首先删除,再创建。(2)当试图修改sc表中的学生成绩时,给出不能随便修改成绩的信息提示。 use sxcj go if exists(select name from sysobjects where name=tri_update_sc and type=tr) begin drop trigger tri_update_sc end else print不存在该触发器,可新建。 go 显示如下: create trigger tri_update_sc on sc after update as if update(score) begin print不能随意修改成绩!

大型数据库oracle实验报告

实验报告 课程名称:大型数据库系统 实验项目:数据库实验 实验地点:逸夫楼502 专业班级:软件12xx 学号:201200xxxx 学生姓名:xx 指导教师:宋成明 2015年4月11日

实验1创建数据库和表及表数据的插入、修改和删除 一、实验目的和要求 1.学会使用SQL语句手工出创建数据库,创建表; 2.学会使用PL/SQL语句对数据库表进行插入、修改和删除数据的操作; 3.学会使用SQL DEVELOPER对数据库表进行插入、修改和删除数据的操作; 4.了解数据更新操作时要注意数据完整性; 5.了解PL/SQL语句对表数据操作的灵活控制功能。 二、实验内容和原理 分别使用SQL Developer和PL/SQL语句,在实验二建立的数据库YGGL或实验一随安装Oracle 11g时建立的数据库中所建立的三个表Employees, Departments和Salary中分别插入多行数据记录,然后修改和删除一些记录。使用PL/SQL进行有限制的修改和删除。表的内容如教材p311页所示。使用PL/SQL命令操作数据。内容如教材p312页所要求,给出相应语句段及结果截图。 三、主要仪器设备——系统运行的软硬件环境 1.HP 6470b笔记本win7 32位系统 2.Oracle 11g大型数据库及其相应的配套软件 四、实验结果与分析 1.在scott用户中创建表 (1)Employees(员工信息表)表 create table Employees ( EmployeeID char(6) primary key, Name char(10) not null, Birthday date not null, Sex number(1) not null, Address char(20), Zip char(6), PhoneNumber char(12), DepartmentID char(3) not null ); 查看创建后的Employees表 (2)Departments(部门信息)表 create table Departments ( DepartmentID char(3) primary key, DepartmentName char(20) not null, Note varchar2(100) );

《数据库概论》实验报告书(2016)

《数据库系统概论》实验报告书 专业班级 学号 姓名 指导教师 安徽工业大学计算机科学与技术学院

实验一:数据定义语言 [ 实验日期 ] 年月日 [ 实验目的 ] 熟悉Oracle上机环境及Oracle客户端的配置;熟练掌握和使用DDL语言,建立、修改和删除数据库表、主键、外键约束关系和索引。 [ 实验内容 ] Oracle上机环境以及Oracle客户端的配置参见附录。 1. SQL数据定义语句: 例1-1: (建立数据库表) 建立教学数据库的四个数据库表,其中Student表中不包含SSEX(C,2) 字段,Sname 字段为Sname(C,8)且可为空。 例1-2: (修改数据库表) 在Student表中增加SEX(C,2) 字段。 例1-3: (修改列名) 将Student表中列名SEX修改为SSEX。 例1-4: (修改数据库表) 将Student表中把Sname 字段修改为Sname(C,10)且为非空。 例1-5: (建立索引) 为Score表按课程号升序、分数降序建立索引,索引名为SC_GRADE。 例1-6: (删除索引) 删除索引SC_GRADE。 例1-7: (建立数据库表) 建立数据库表S1(SNO,SNAME,SD,SA),其字段类型定义与Student表中的相应字段(SNO,SNAME,SDEPT,SAGE)的数据类型定义相同。 例1-8: (修改数据库表) 删除成绩表Score的参照完整性约束关系。 例1-9: (修改数据库表) 添加成绩表Score的参照完整性约束关系。 例1-10: (修改数据库表名) 将数据库表S1改名为Student_Temp。 [ 实验要求 ] ①熟悉Oracle上机环境,掌握Oracle客户端的配置; ②建立数据库表,修改数据库表结构,建立、删除索引; [ 实验方法 ] ①按照附录中的操作步骤进行客户端的配置; ②将实验需求用SQL语句表示; ③执行SQL语句; ④查看执行结果,如果结果不正确,进行修改,直到正确为止。 [实验总结 ] ① SQL语句以及执行结果; ②对重点实验结果进行分析; ③实验中的问题和提高; ④收获与体会。

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

学期 Oracle数据库应用技术 实验报告 选课序号: 班级: 学号: 姓名: 指导教师:史金余 成绩:

2017年月日

目录 1.实验目的 (1) 2.实验容 (1) 2.1 触发器设计 (2) 2.2 存储过程、自定义函数设计 (2) 2.3 程序包设计 (3) 3.实验步骤 (3) 3.1 创建表空间RESTAURANT,创建用户DINER (3) 3.2 创建餐饮系统数据库的所有表,并向各表插入演示数据.. 3 3.3 完成【实验容】中的触发器、存储过程、函数和程序包等功 能设计,将程序脚本保存到文本文件Source.sql中 (7) 4.实验总结 (13)

PL/SQL程序设计 1.实验目的 ◆掌握PL/SQL程序设计基本技巧,包括基本数据类型、表类型、数组类型、 匿名程序块、控制语句、PL/SQL中使用SQL语句、游标、错误处理等。 ◆熟悉和掌握PL/SQL中关于存储过程、函数、包和触发器程序设计技术。 2.实验容 实验平台:PL/SQL Developer或Oracle的其它客户端管理工具。 某餐饮系统数据库(加粗字段为主键,斜体字段为外键),请创建如下各数据表,并实现如下存储过程、函数、包和触发器等功能设计,将程序脚本保存到文本文件Source.sql中: (1)菜肴类别表MK(菜肴类别编号MKid,菜肴类别名称MkName),菜肴类别名称:鱼类、蔬菜类、凉菜类、肉类、主食类和酒水类等。 (2)菜单信息表MList(菜肴编号Mid,菜肴名称Mname,菜肴类别MKid,菜肴单价Mprice,菜肴成本单价Mcost,更新日期Mdate)。 (3)餐台类别表DK(餐台类别编号DKid,餐台类别名称DkName),餐台类别:包间和散台等。 (4)餐台信息表Dinfo (餐台编号Did,餐台名称Dname,餐台类别DKid,座位数Dseats,更新日期Ddate)。 (5)消费单主表C (消费单号Cid,餐台编号Did,消费开始时间StartTime,结账时间EndTime,消费金额合计Smoney,盈利金额合计SPsum),其中,消费金额合计=消费单明细表CList中该消费单号的所有消费记录的消费 金额的合计,即SUM(消费金额)或SUM(菜肴单价×消费数量),盈利 金额合计=消费单明细表CList中该消费单号的所有消费记录的盈利合 计,即SUM((菜肴单价 - 菜肴成本单价)×消费数量)。 (6)消费单明细表CList (消费单号Cid,序号Sid,菜肴编号Mid,菜肴名称Mname,消费数量Cqty,菜肴单价Mprice,菜肴成本单价Mcost,消费金 额Cmoney) ,消费金额=消费数量×菜肴单价;消费数量为正数是正常点 菜,消费数量为负数是退菜,消费数量为0是赠菜。

oracle触发器

1、触发器的概述 如果希望该子程序能够自动执行,就需要将该程序定义为触发器,触发器可以看做是一种特殊的存储过程,它可以在数据库相关事件(如DELETE、UPDATE,INSERT,CREATe等)发生时自动执行,常用于管理复杂的完整性约束或监控对表的修改操作。 触发器执行的机制与Java中的事件监听机制类似,当出现特定的事件时就会自动调用,Oracle数据库中的事件包括增加数据、修改数据、删除数据等。与Java中的事件处理机制类似,在创建触发器时也需要指定触发器执行的事件 2、触发器的语法 (1)TRIGGER:用于创建触发器的关键字,就类似于创建存储过程的procedure和创建自定义函数的function一样。 (2)trigger_name:指定触发器的名称。 (3)BEFORE | AFTER | INSTEAD OF:指定触发器的时间,BEFORE表示在触发器在事件发生之前被执行,AFTER表示触发器在事件发生之后执行,INSTEAD OF指定该触发器为代替触发器。 (4)trigger_event:指定触发器的触发事件,常用的事件有INSERT、UPDATE、DELETE、CREATE、DROP等,多个事件之间需要使用or关键字进行连接。 (5)ON obj_name指定发生事件的数据库对象名称,如表名称、视图名称等。如果执行的是DDL操作就必须写为ON DATABASE。 (6)FOR EACH ROW:表示该触发器为行级触发器,如果不指定该语句就默认为语句级触发器。 (7)WHEN tri_condition:指定触发器执行的条件,例如使用update语句修改的数据满足某个条件时才执行触发器的内容。 3、触发器的分类 Oracle数据库的触发器事件相对于其他数据库而言相对复杂,根据触发器触发事件和触发器执行情况可以将Oracle中的触发器分为5种类型,具体如下所示。 (1)行级触发器:对表执行DML操作时,每影响一行数据,该类型的触发器就会执行一次。 (2)语句级触发器:对表执行DML操作时,无论影响了多少行数据,该类型触发器都只会执行一次。

实验五 存储过程和触发器的使用

实验五存储过程和触发器的使用 【目的要求】 1、了解存储过程的基本概念和类型。 2、了解创建存储过程的T-SQL语句的基本语法。 3、了解查看、执行、修改和删除存储过程的T-SQL命令的用法。 4、了解触发器的基本概念和类型。 5、了解创建触发器的T-SQL语句的基本语法。 6、了解查看、修改和删除存储过程的T-SQL命令的用法。 【实验内容】 内容一:存储过程的使用 一、数据需求分析 存储过程是一种数据库对象,为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用,自动完成需要预先执行的任务。存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中便于以后调用,提高了代码的执行效率。 二、内容要点分析 1、SQL SERVER支持五种类型的存储过程:系统存储过程、本地存储过程、临时存储过程、远程存储过程和扩展存储过程。其中,系统存储过程是由系统提供的存储过程,可以作为命令执行各种操作。系统存储过程定义在系统数据库master中,其前缀是sp_。本地存储过程是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操作任务,不能以sp_为前缀。 2、只能在当前数据库中创建存储过程。 3、创建存储过程时,应指定所有输入参数和向调用过程或批处理返回的输出参数、执行数据库操作的编程语句和返回至调用过程或批处理以表明成功或失败的状态值。 4、创建存储过程的T-SQL语句 CREATE PROC[EDURE] 存储过程名称 [{ @参数名称数据类型 }] [,…n] [WITH { RECOMPILE|ENCRYPTION }] AS SQL语句序列 说明: (1)RECOMPILE表明每次运行该过程时,将其重新编译。 (2)ENCRYPTION表示 SQL SERVER 加密SYSCOMMENTS表中包含CREATE PROCEDURE语句文本的条目。 注:必须将CREATE PROCEDURE语句放在单个批处理中。 成功执行CREATE PROCEDURE语句后,存储过程存储在sysobjects系统表中。 5、执行存储过程 EXEC[UTE] @返回值=存储过程名称参数值 6、查看存储过程 查看存储过程的文本信息:SP_HELPTEXT 存储过程名

实验6 大数据库实验——存储过程和触发器

实验6 存储过程和触发器 一、实验目的 1、加深和巩固对存储过程和触发器概念的理解。 2、掌握触发器的简单应用。 3、掌握存储过程的简单应用。 二、实验容 一)存储过程: 1. 创建一存储过程,求l+2+3+…+n,并打印结果。 CREATE PROCEDURE addresult AS DECLARE n int=10,/*最后一个数*/ i int=0, result int=0 /*结果*/ BEGIN WHILE(i<=n) BEGIN SET result=result+i SET i=i+1 END PRINT'1+2+3+...+n的结果是:' PRINT result RETURN(result) END GO 2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。EXEC addresult

3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。 CREATE PROCEDURE addresult1 n int=10 /*最后一个数*/ AS DECLARE i int=0, result int=0 /*结果*/ BEGIN WHILE(i<=n) BEGIN SET result=result+i SET i=i+1 END PRINT'1+2+3+...+n的结果是:' PRINT result RETURN(result) END GO 4. 调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。 EXEC addresult1 100 5.修改上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。

相关文档