大型数据库技术实验报告.doc

上传人:文库蛋蛋多 文档编号:2395297 上传时间:2023-02-17 格式:DOC 页数:22 大小:108.50KB
返回 下载 相关 举报
大型数据库技术实验报告.doc_第1页
第1页 / 共22页
大型数据库技术实验报告.doc_第2页
第2页 / 共22页
大型数据库技术实验报告.doc_第3页
第3页 / 共22页
大型数据库技术实验报告.doc_第4页
第4页 / 共22页
大型数据库技术实验报告.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《大型数据库技术实验报告.doc》由会员分享,可在线阅读,更多相关《大型数据库技术实验报告.doc(22页珍藏版)》请在三一办公上搜索。

1、大型数据库技术实验报告 专业班级: 学 号: 姓 名: 时 间:2014年11月17日 大型数据库技术实验一1创建一个本地位图管理表空间CAP_ts,表空间对应一个数据文件CAP_ts.dbf,该数据文件初始大小为20M,可以自动扩展。解:CREATE TABLESPACE CAP_ts DATAFILE D:CAP_ts.dbf SIZE 20M AUTOEXTEND ON;2在表空间CAP_ts中创建表Customers、Products和Agents,其中列cid、pid、aid分别为这3张表的主键。向表中添加如下数据(可首先将表中数据放入EXCEL表,然后在SQL Developer中

2、导入数据库)。CustomerscidcnamecitydiscntC001TipTopDuluth10.00C002BasicsDallas12.00C003AlliedDallas8.00C004ACMEDuluth8.00C005OrientalKyoto6.00C006ACMEKyoto0.00 ProductspidpnamecityquantitypriceP01combDallas1114000.50P02brushNewark2030000.50P03razorDuluth1506001.00P04PenDuluth1253001.00P05pencilDallas221400

3、1.00P06folderDallas1231002.00P07caseNewark1005001.00 Agentsaidanamecitypercenta01smithNew York6a02JonesNewark6a03BrownTokyo7a04GrayNew York6a05OtasiDuluth5a06SmithDallas5解:create table Customers( cid char(6) primary key, cname varchar2(20), city varchar2(20), discnt number(10,2) tablespace CAP_ts;in

4、sert into Customers values(C001,TipTop,Duluth,10.00);insert into Customers values(C002,Basics,Dallas,12.00);insert into Customers values(C003,Allied,Dallas,8.00);insert into Customers values(C004,ACME,Duluth,8.00);insert into Customers values(C005,Oriental,Kyoto,6.00);insert into Customers values(C0

5、06,ACME,Kyoto,0.00);create table Products( pid char(5) primary key, pname varchar2(20), city varchar2(20), quantity int, price number(10,2) tablespace CAP_ts;insert into Products values(P01,comb,Dallas,111400,0.50);insert into Products values(P02,brush,Newark,203000,0.50);insert into Products values

6、(P03,razor,Duluth,150600,1.00);insert into Products values(P04,pen,Duluth,125300,1.00);insert into Products values(P05,pencil,Dallas,221400,1.00);insert into Products values(P06,floder,Dallas,123100,2.00);insert into Products values(P07,case,Newark,100500,1.00);create table Agents( aid char(6) prima

7、ry key, aname varchar2(20), city varchar2(20), percent int) tablespace CAP_ts;insert into Agents values(a01,Smith,New York,6);insert into Agents values(a02,Jones,Newark,6);insert into Agents values(a03,Brown,Tokyo,7);insert into Agents values(a04,Gray,New York,6);insert into Agents values(a05,Otasi,

8、Duluth,5);insert into Agents values(a06,Smith,Dallas,5);3 通过数据字典视图查看是否已创建表Customers、Products和Agents,以及每个表的存储参数设置。解:select table_name, tablespace_name, status, ini_trans, max_trans, initial_extent, next_extent, min_extents, max_extents from user_tables where tablespace_name=CAP_TS;4在表空间CAP_ts中创建分区表or

9、ders,该表以列ordno为主键,列cid、aid、pid为外键。列month作为分区关键字,数据按照季度分区,即将一个季度的订单数据放到一个分区中。例如一月份、二月份、三月份为第一季度,这三个月的订单记录放在一个分区中。向表orders中添加如下数据:Ordersordnomonthcidaidpidqtydollars1011JanC001A01P011000450.001012JanC001A01P011000450.001019FebC001A02P02400180.001017FebC001A06P03600540.001018FebC001A03P04600540.001023M

10、arC001A04P05500450.001022MarC001A05P06400720.001025AprC001A05P07800720.001013JanC002A03P031000880.001026MayC002A05P03800704.001015JanC003A03P0512001104.001014JanC003A03P0512001104.001021FebC004A06P011000460.001016JanC004A01P011000500.001020FebC005A03P07600600.001024MarC006A06P01800400.00解:create tab

11、le orders( ordno int not null, cid char(6) , aid char(6) , pid char(5) , month char(5), qty int, dollars number(8,2), primary key(ordno), foreign key(cid) references Customers(cid), foreign key(aid) references Agents(aid), foreign key(pid) references Products(pid)partition by list(month)( partition

12、part_spring values (Jan,Feb,Mar), partition part_summer values (Apr,May,Jun), partition part_autumn values (Jul,Aug,Sep), partition part_winter values (Oct,Nov,Dec);desc orders;-向表orders中插入数据insert into orders values(1011,Jan,C001,a01,P01,1000,450.00);insert into orders values(1012,Jan,C001,a01,P01,

13、1000,450.00);insert into orders values(1019,Feb,C001,a02,P02,400,180.00);insert into orders values(1017,Feb,C001,a06,P03,600,540.00);insert into orders values(1018,Feb,C001,a03,P04,600,540.00);insert into orders values(1023,Mar,C001,a04,P05,500,450.00);insert into orders values(1022,Mar,C001,a05,P06

14、,400,720.00);insert into orders values(1025,Apr,C001,a05,P07,800,720.00);insert into orders values(1013,Jan,C002,a03,P03,1000,880.00);insert into orders values(1026,May,C002,a05,P03,800,704.00);insert into orders values(1015,Jan,C003,a03,P05,1200,1104.00);insert into orders values(1014,Jan,C003,a03,

15、P05,1200,1104.00);insert into orders values(1021,Feb,C004,a06,P01,1000,460.00);insert into orders values(1016,Jan,C004,a01,P01,1000,500.00);insert into orders values(1020,Feb,C005,a03,P07,600,600.00);insert into orders values(1024,Mar,C006,a06,P01,800,400.00);commit;select * from orders;5 在一季度分区中查询所

16、有订单金额高于400的订单记录。解:select * from orders partition(part_spring) where dollars400 ;6 将二季度所有的订单记录复制到表Orders_2中。解:create table Orders_2 ASselect * from orders partition(part_summer);select * from orders_27 为Orders表创建公有同义词,并通过该同义词访问该表。解:create public synonym ord for orders;select * from ord;8 从数据字典中查询当前用户

17、创建的所有的同义词。解:select * from dba_synonyms where table_owner=xiao9 基于表customers和表orders创建一个视图customer_orders,视图中的列包括每笔订单的编号、订购的产品编号、订购的数量、顾客的编号及顾客的姓名。基于视图customer_orders查询顾客c002下的所有订单。通过数据字典表user_updatable_columns,查看视图customer_orders中哪些列是可更新的列。解:create or replace view customer_orders AS select ordno,pid

18、,qty,customers.cid,cname from customers, orders where customers.cid=orders.cid;select * from customer_orders where cid=C002;select * from user_updatable_columns where table_name=CUSTOMER_ORDERS;10. 利用内联视图,查询每个顾客的编号、名称、所在城市,折扣以及所下订单的数量。解:select * from (select customers.cid,cname,city,discnt,qty from

19、customers, orders where customers.cid=orders.cid);11. 创建一个物化视图mv_product_orders,视图中包含每种商品的编号、名称和订货的总量。数据刷新的时间为ON COMMIT,即当主表有数据提交时,立即刷新物化视图中的数据,创建方式为BUILD IMMEDIATE。 1)创建视图后,执行查询select * from mv_product_orders; 2)向表Orders中新增一行insert into orders values(1027,May,C006,A05,P05,100,50),然后执行1)中的查询,查看mv_pr

20、oduct_orders是否有变化; 3)执行Commit命令,然后执行1)中的查询,查看mv_product_orders是否有变化。解:create materialized view mv_product_orders refresh on commit AS select products.pid ,pname,qty from products, orders where products.pid=orders.pid;- 1)创建视图后,执行查询select * from mv_product_orders;select * from mv_product_orders-2)向表O

21、rders中新增一行insert into orders values(1027,May,C006,A05,P05,100,50),然后执行1)中的查询-,查看mv_product_orders是否有变化;insert into orders values(1027,May,C006,a05,P05,100,50)- 3)执行Commit命令,然后执行1)中的查询,查看mv_product_orders是否有变化。commit12. 利用下列语句创建表my_table。 create table my_table NOLOGGING as select * from all_objects;

22、1)查询表my_table的行数。 2)执行查询 select * from my_table where object_ID=3,查看执行计划和SQL优化指导。3)在表my_table的列object_ID 上创建索引,再次执行2)中的查询,并查看执行计划和SQL优化指导。 4)查看索引树的高度、删除标记的比率以及索引页块使用率。解:- 1)查询表my_table的行数。 select count(*) from my_table- 2)执行查询 select * from my_table where object_ID=3,查看执行计划和SQL优化指导。 select * from my

23、_table where object_ID=3-3)在表my_table的列object_ID 上创建索引,再次执行2)中的查询,并查看执行计划和SQL优化指导。 create index myindex on my_table(object_id) commit- 4)查看索引树的高度、删除标记的比率以及索引页块使用率。select * from dba_indexes where index_name=MYINDEX-需要先分析索引的结构ANALYZE INDEX myindex validate structure;select height,del_lf_rows/lf_rows,p

24、ct_used from index_stats;附:CAP数据库CAP数据库系统主要由Customers、Agents和Products三张表和一张订货信息表Orders组成。批发商用CAP数据库记录他们的顾客、商品和接受顾客订单的代理商的信息。这里的顾客是指从批发商那里批发大量商品然后转销的零售商,每个顾客有唯一的标识符。顾客向代理商要求购买商品,代理商和商品都有唯一的标识。每次订货都会在Orders中间增加一条订单记录,用Orderno唯一标识该记录。Customers 存放顾客信息的表 cid 顾客的唯一标识 cname 顾客的名称 city 顾客所在的城市 discnt 顾客享有的折

25、扣Agents 存放代理商信息的表 aid 代理商的唯一标识 aname 代理商的名称 city 代理商所在的城市 percent 每笔交易代理所能获得的佣金百分比Products 存放商品的信息的表 pid 商品的唯一标识 pname 商品的名称 city 商品库存所在的城市 quantity 目前可销售的商品库存数量 price 每单位商品的批发价Orders 存放订单信息的表 orderno 订单的唯一标识 month 订单月份 cid 购买商品的顾客 aid 经由该代理商订货 pid 所订购的商品 qty 订购的商品数量 dollars 商品的总价CAP数据库中所有的表和列的定义如下:

26、 大型数据库技术实验二1执行下面的语句,了解ROWID的编码方式。解:SELECT rowid FROM agents; 2创建一个序列orderno_sequence,起始值为1000,步长为1。查看该序列是否被创建。解:create sequence orderno_sequence increment by 1start with 1000;commit;select * from dba_sequences where sequence_owner =WUJIYANG3(1) 在表orders上定义一个触发器,当向表中加入一条新的订单记录时,自动使用序列orderno_sequence

27、生成一个订单编号,并自动计算商品总价dollars。计算公式如下:商品总价dollars= 商品数量qty* 商品单价price * (1-顾客折扣discnt/100) (2) 首先将表orders中的数据全部删除,然后向表中添加如下数据验证触发器的正确性。OrdersordnomonthcidaidpidqtydollarsJanC001A01P011000JanC001A01P011000FebC001A02P02400FebC001A06P03600FebC001A03P04600MarC001A04P05500MarC001A05P06400AprC001A05P07800JanC0

28、02A03P031000MayC002A05P03800JanC003A03P051200JanC003A03P051200FebC004A06P011000JanC004A01P011000FebC005A03P07600MarC006A06P01800解:create or replace trigger calu_orders before insert on orders for each rowDECLARE t_price products.price%type t_discnt customers.discnt%typeBEGIN select orderno_sequence

29、.nextval into :new.orderno from dual; select price into t_price from products where pid= :new.pid; select discnt into t_discnt from customers where cid= :new.cid; insert into orders values(:new.orderno,:new.month,:new.cid,:new.aid,:new.pid,:new.qty,:new.qty*t_price*(1-t_discnt);END calu_orders drop

30、trigger calu_orders select * from orders delete from orders insert into orders(month,cid,aid,pid,qty)values(Jan,C001,a01,p01,1000);4通过伪列CURRVAL,查询序列orderno_sequence的当前值。解:select * from user_sequences where sequence_name=ORDERNO_SEQUENCE SELECT orderno_sequence.currval FROM dual;SELECT orderno_sequen

31、ce.nextval FROM dual;5 编写一个PL/SQL块,查询编号在1000到1020之间所有订单的月份、订购的商品id号、订购的数量和商品的总价,并利用DBMS_OUTPUT.PUT_LINE显示查询的结果。要求定义一个表类型存储检索出来的数据,表中的元素是一条记录。解:set serveroutput on;declare type ordersearch is table of orders%rowtype index by binary_integer; s_orders ordersearch; s_num number:=0; cursor cur_ord is sel

32、ect * from orders where ordno =1000 and ordno=1020; begin for temp in cur_ord loop s_num :=s_num+1; select * into s_orders(s_num) from orders where ordno=temp.ordno; end LOOP ; for i in 1.s_orders.count loop dbms_output.put_line(s_orders(i).month |,| s_orders(i).pid |,| s_orders(i).qty | , | s_order

33、s(i).dollars);end LOOP ;end;6编写一个PL/SQL块,将编号为p08的产品的库存数量修改为200370,如果没有查找到相应的记录,则在表中插入该条记录。(要求:使用隐式游标)。 解:BEGIN UPDATE products SET quantity = 200370 WHERE pid = P08; IF SQL%NOTFOUND THEN INSERT INTO products (pid, quantity) VALUES (P08,200370); END IF;END;7根据用户输入的city值,查询该城市中每个顾客下的订单的总额(即dollars的总数)

34、。要求定义一个存储过程,以city值为参数。过程中定义以city为参数的游标,逐个计算该城市中每个顾客的订单金额的总额。要求以下列格式显示查询的结果:城市名称=xxxxx顾客编号=xxxx 订单总额=xxxxxx解:set serveroutput on;create or replace procedure proc_search(p_city customers.city%type)AS temp_city customers.city%type:= p_city; cursor tempcursor is select customers.city,customers.cid,dolla

35、rs from customers, orders where customers.city= temp_city and customers.cid=orders.cid ;begin for temp1 in tempcursor loop dbms_output.put_line(城市名称=|temp1.city); dbms_output.put_line(顾客编号=|temp1.cid| |订单总额=|temp1.dollars); end LOOP ;end proc_search;drop procedure proc_search;begin proc_search(Kyoto

36、);end;8创建一个存储过程,根据用户输入显示所有的顾客或所有代理商的级别。要求将表名customers或agents作为过程的参数,采用游标变量根据参数绑定不同的查询语句。如果某顾客的折扣discnt低于10.00,则显示该顾客的级别为“普通”,否则显示为“VIP”;如果某代理商的佣金百分比低于6,则显示该代理商的级别为“普通”,否则显示为“VIP”。调用过程时给定的参数错误时,显示用户自定义的错误信息:“Input must be customers or agents”。解:set serveroutput on;create or replace procedure proc_2(p

37、_table in VARCHAR2)AS-定义游标变量类型并创建该类游标type t_cursor is ref cursor;p_cursor t_cursor;p_aid char(20);p_percent number(5,2);p_cid char(20);p_discnt number(5,2);BEGIN if p_table=customers then open p_cursor for select cid,discnt from customers; ELSIF p_table=agents then open p_cursor for select aid,perce

38、nt from agents; else RAISE_application_error(-20000,Input must be customers or agents); END IF; LOOP if p_table=customers then fetch p_cursor into p_cid, p_discnt; exit when p_cursor%notfound; if p_discnt10.00 then dbms_output.put_line(顾客|p_cid|的等级为:|普通); else dbms_output.put_line(顾客| p_cid|的等级为:|VI

39、P); end if; else fetch p_cursor into p_aid, p_percent; exit when p_cursor%notfound; if p_percent6 then dbms_output.put_line(代理商|p_aid|的等级为:|普通); else dbms_output.put_line(代理商|p_aid|的等级为:|VIP); end if; end if; end loop; close p_cursor; commit;end proc_2; drop procedure proc_2; begin proc_2(agents);en

40、d;9表discnt_audit用来记录对表Customers的列discnt的修改历史。在表Customers上创建触发器,记录在discnt列上所做的修改,将修改的人、修改的时间、顾客的ID号、修改之前的值和修改之后的值写入表discnt_audit中。如果是向Customers表中增加一条新记录,则修改之前的值为空值。表discnt_audit的结构:create table discnt_audit(change_by varchar2(8) not null,change_time DATE not null,cid char(4),old_discnt number(4,2),ne

41、w_discnt number(4,2);解:create table discnt_audit(change_by varchar2(8) not null,change_time DATE not null,cid char(4),old_discnt number(4,2),new_discnt number(4,2);10从代理商那里接受订单时,要查询products表中的quantity列,quantity代表了在仓库中被订购商品的库存数量。写一个函数qty_check,以订单中的商品编号和商品订购数量为参数,如果订购数量小于/等于库存数量,函数返解:create or replace funct

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号