根据实际语义,分析实体之间的联系,确定实体之间一对一,一对多和多对多联系。
实体-联系图(E-R图)如下:
OrderPartmPurchase1Customer11mBelong to1NationmBelong tompPartSuppn1IncludeLineitem1mBelong to1RegionSupplierm
(2)数据库逻辑结构设计
按照数据库设计原理中概念结构转化成逻辑结构的规则,每个实体转换成一个关系,多
对多的联系也转换成一个关系。因此,根据上述E-R图设计数据库逻辑结构(参见实
验1.1数据库定义中的图2TPC-H数据库模式图)。 (3)数据库物理结构设计
数据库物理结构首先根据逻辑结构自动转换生成,然后根据应用需求设计数据库的索引
结构、存储结构。
(4)数据库模式SQL语句参见实验1.1数据库定义。
四、实验总结
通过本次实验我基本掌握了数据库设计的基本步骤,包括数据库概念结构设计、逻辑结构设计、物理结构设计和数据库模式sql语句生成。并且学会了使用数据库设计的工具。
实验项目名称:数据库设计实验 实验学时: 4 同组学生姓名: 孟陈、陈晓雪、季佰军 实验地点: 1318 实验日期: 6.23 实验成绩: 批改教师: 批改时间:
一、实验目的和要求
1.掌握数据库PL/SQL编程语言,以及数据库存储过程的设计和使用方法; 2.掌握数据库PL/SQL编程语言以及数据库自定义函数的设计和使用方法; 3.掌握PL/SQL游标的设计、定义和使用方法,理解PL/SQL游标按行操作和SQL按结
果集操作的区别和联系。
二、实验内容及过程
1.存储过程定义,存储过程运行,存储过程更名,存储过程删除,存储过程的参数
传递。掌握数据库PL/SQL编程语言和编程规范,规范设计存储过程; 2.自定义函数定义,自定义函数运行,自定义函数更名,自定义函数删除,自定义函
数的参数传递。掌握PL/SQL和编程规范,规范设计自定义函数; 3.游标定义、游标使用。掌握各种类型游标的特点、区别和联系。
三、实验结果与分析
6.1 存储过程实验
(1)无参数的存储过程
① 定义一个存储过程,更新所有订单的(含税折扣价)总价 CREATE OR REPLACE PROCEDURE Proc_CalTotalPrice() AS BEGIN
UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=Lineitem.orderkey);
END;
② 执行存储过程Proc_CalTotalPrice()
CALL Proc_CalTotalPrice();
(2) 有参数的存储过程
① 定义一个存储过程,更新给定订单的(含税折扣价)总价。
CREATE OR REPLACE PROCEDURE Proc_CalTotalPrice4Order(okey INTEGER)
AS BEGIN
UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=Lineitem.orderkey AND
Lineitem.orderkey=okey);
END;
② 执行存储过程。
CALL Proc_CalTotalPrice4Order(5365);
(3)有局部变量的存储过程
① 定义一个存储过程,更新某个顾客的所有订单的(含税折扣价)总价。 CREATE OR REPLACE PROCEDURE Proc_CalTotalPrice4Customer(p_custname
CHAR(25)) AS
DECLARE
L_custkey INTEGER;
BEGIN
SELECT custkey INTO L_custkey FROM Customer
WHERE name=TRIM(p_custname); UPDATE Orders SET totalprice=
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=Lineitem.orderkey AND
Orders.custkey=L_custkey);
END;
② 执行存储过程Proc_CalTotalPrice4 Customer()。 CALL Proc_CalTotalPrice4Customer(‘陆皆宇’); ③ 查看存储过程执行结果 SELECT*FROM Orders
WHERE custkey=(SELECT custkey FROM Customer WHERE name=’陈凯峰‘);
(4)有输出参数的存储过程
① 定义一个存储过程,更新某个顾客的所有订单的(含税折扣价)总价。 CREATE OR REPLACE PROCEDURE Proc_CalTotalPrice4Customer2(p_custname
CHAR(25),OUT p_totalprice REAL) AS DECLARE
L_custkey INTEGER; BEGIN
SELECT custkey INTO L_custkey FROM Customer
WHERE name=TRIM(p_custname);
RAISE NOTICE’custkey is %’,L_custkey; UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=
Lineitem.orderkey AND
Orders.custkey=L_custkey);
SELECT SUM(totalprice)INTO p_totalprice FROM Orders WHERE custkey =L_custkey; END;
② 执行存储过程Proc_CalTotalPrice4 Customer2() CALL Proc_CalTotalPrice4Customer2(‘陈凯峰’,null); ③ 查看存储过程执行结果 SELECT SUM(totalprice) FROM Orders
WHERE custkey=(SELECT custkey
FROM Customer
WHERE name=’陆皆宇‘);
(5)修改存储过程
① 修改存储过程名Proc_CalTotalPrice4Order为CalTotalPrice4Order ALTER PROCEDURE Proc_CalTotalPrice4Order RENAME TO CalTotalPrice4Order;
② 编译存储过程CalTotalPrice4Order
ALTER PROCEDURE CalTotalPrice4Order (okey INTEGER)COMPILE;
(6)删除存储过程
删除存储过程CalTotalPrice4Order。 DROP PROCEDURE CalTotalPrice4Order; 6.2 自定义函数实验
(1) 无参数的自定义函数
① 定义一个自定义函数,更新所有订单的(含税折扣价)总价,并返回所有订单的总
价之和。
CREATE OR REPLACE FUNCTION FUN_CalTotalPrice() RETURN REAL AS
DECLARE
res REAL; BEGIN
UPDATE Orders SET totalprice =
(SELECT SUM(extendedprice * (1-discount)*(1+tax)) FROM Lineitem
WHERE Orders.orderkey=Lineitem.orderkey);
SELECT SUM(toyalprice) INTO res FROM Orders; RETURN res; END;
② 执行自定义函数FUN_CalTotalPrice()。
SELECT TotalPrice();
(2)有参数的自定义函数