高级数据库应用实验(Oracle)项目 电商平台商品管理系统 大学编程作业(TUST 天津科技大学 2023 年)

高级数据库应用实验(Oracle)项目 电商平台商品管理系统 大学编程作业(TUST 天津科技大学 2023 年)

一、项目简介

本电商平台商品管理系统,我使用了使用了 Oracle 数据库和 PLSQL Developer。实现了项目分析与数据表创建、SQL 语句、视图和存储过程、触发器等部分。通过这次高级数据库应用实验(Oracle)项目的实践,我巩固了 SQL 语法,为之后的 Oracle 数据库的深入学习打下了基础。

这个项目是我大三写的,现在回顾已经非常粗糙,分享出来一方面希望可以帮助初学者,另一方面希望能让同学们可以从目前大学中普遍毫无价值的形式主义作业中解脱出来,更加高效地学习优质计算机知识和主流编程技术,一起发扬开源精神,感受互联网技术的美好愿景。

二、交流学习

互联网开源精神需要大家一起互相交流学习,互相支持奉献。欢迎大家与我友好交流。

加我 QQ 好友获取所有项目源码和项目文档,感谢大家的支持!

《高级数据库应用实验(Oracle)》项目报告

一、项目分析与数据表创建

【开发语言及实现平台或实验环境】

SQL
Oracle 21c 快捷版、PLSQL Developer 15

【实验目的和要求】

1、掌握概念模型创建方法
2、熟悉 Oracle 的开发环境。
3、在 Oracle 中创建表并设置完整性约束。
4、掌握数据表的导入和导出方法

【实验结果与分析】

1、 项目功能分析。
本项目是一个电商平台商品管理系统,主要包括以下功能:
(1)用户管理:包括用户注册、登录、修改密码等功能。
(2)商品管理:包括商品的添加、修改、删除、查询等功能。
(3)订单管理:包括订单的添加、修改、删除、查询等功能。
(4)购物车管理:包括购物车商品的添加、删除、查询等功能。
(5)评价管理:包括对商品的评价和评分。

2、 项目 E-R 图。
根据功能分析,我们可以得到以下 E-R 图:

电商平台商品管理系统的基本 E-R 图

图 1 电商平台商品管理系统的基本 E-R 图

电商平台商品管理系统的用户 E-R 图

图 2 电商平台商品管理系统的用户 E-R 图

电商平台商品管理系统的商品 E-R 图

图 3 电商平台商品管理系统的商品 E-R 图

电商平台商品管理系统的订单 E-R 图

图 4 电商平台商品管理系统的订单 E-R 图

电商平台商品管理系统的购物车 E-R 图

图 5 电商平台商品管理系统的购物车 E-R 图

电商平台商品管理系统的评价 E-R 图

图 6 电商平台商品管理系统的评价 E-R 图

其中,用户表(user)和商品表(product)是系统的核心表,订单表(order)和购物车表(cart)是与用户表和商品表相关联的表,评价表(evaluation)是与商品表相关联的表。

3、 在 Oracle 中创建表并设置完整性约束。
根据 E-R 图,我们可以创建如下数据表,并设置完整性约束:
(1)用户表(user)

/**
* 电商平台商品管理系统
* 创建表
*/

/**
* 1、创建用户表
*/
CREATE TABLE my_user (
    user_id NUMBER(10) PRIMARY KEY,
    user_name VARCHAR2(20) NOT NULL,
    password VARCHAR2(20) NOT NULL,
    email VARCHAR2(50) UNIQUE,
    phone_number VARCHAR2(20) UNIQUE,
    address VARCHAR2(100)
);

(2)商品表(product)

/**
* 2、创建商品表
*/
CREATE TABLE product (
    product_id NUMBER(10) PRIMARY KEY,
    product_name VARCHAR2(50) NOT NULL,
    description VARCHAR2(200),
    price NUMBER(10,2) NOT NULL,
    stock NUMBER(10) NOT NULL,
    category VARCHAR2(20) NOT NULL
);

(3)订单表(order)

/**
* 3、创建订单表
*/
CREATE TABLE my_order (
    order_id NUMBER(10) PRIMARY KEY,
    user_id NUMBER(10) NOT NULL,
    product_id NUMBER(10) NOT NULL,
    quantity NUMBER(10) NOT NULL,
    order_time DATE NOT NULL,
    FOREIGN KEY (user_id) REFERENCES my_user(user_id),
    FOREIGN KEY (product_id) REFERENCES product(product_id)
);

(4)购物车表(cart)

/**
* 4、创建购物车
*/
CREATE TABLE cart (
    cart_id NUMBER(10) PRIMARY KEY,
    user_id NUMBER(10) NOT NULL,
    product_id NUMBER(10) NOT NULL,
    quantity NUMBER(10) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES my_user(user_id),
    FOREIGN KEY (product_id) REFERENCES product(product_id)
);

(5)评价表(evaluation)

/**
* 5、创建评价表
*/
CREATE TABLE evaluation (
    evaluation_id NUMBER(10) PRIMARY KEY,
    user_id NUMBER(10) NOT NULL,
    product_id NUMBER(10) NOT NULL,
    score NUMBER(2) NOT NULL,
    my_comment VARCHAR2(200),
    FOREIGN KEY (user_id) REFERENCES my_user(user_id),
    FOREIGN KEY (product_id) REFERENCES product(product_id)
);

在创建表的过程中,我们设置了完整性约束,保证了数据的完整性和正确性。例如,在订单表中,我们设置了外键约束,保证了订单表中的 user_id 和 product_id 必须来自于用户表和商品表中已有的 id,避免了数据冗余和错误。

【实验思考及总结】

通过本次实验,我们掌握了概念模型创建方法,熟悉了 Oracle 的开发环境,并在 Oracle 中创建表并设置完整性约束。同时,我们也学会了数据表的导入和导出方法,方便了我们在不同环境下的数据迁移和备份。
在实际开发中,数据表的设计和完整性约束的设置非常重要,可以保证数据的可靠性和完整性。同时,我们还需要考虑数据表的性能优化和查询优化,提高系统的响应速度和用户体验。

二、SQL 语句

【开发语言及实现平台或实验环境】

SQL
Oracle 21c 快捷版、PLSQL Developer 15

【实验目的和要求】

1、 掌握 SELECT 语句的语法结构,熟练使用 WHERE、GROUP BY、HAVING 和 ORDER BY 子句。
2、 熟练掌握 INSERT、UPDATE、DELETE 语句使用;
3、 掌握字符串函数、数字函数、日期时间函数和聚合函数。

【实验结果与分析】

首先向上面的 5 个表中插入一些示例数据:

/**
* 电商平台商品管理系统
* 插入数据
*/

/**
* 1、向用户表中插入示例数据
*/
INSERT INTO sys.my_user (user_id, user_name, password, email, phone_number, address)
VALUES (1, '张三', '123456', 'zhangsan@example.com', '18888888888', '北京市朝阳区');

INSERT INTO sys.my_user (user_id, user_name, password, email, phone_number, address)
VALUES (2, '李四', '123456', 'lisi@example.com', '17777777777', '上海市浦东新区');

INSERT INTO sys.my_user (user_id, user_name, password, email, phone_number, address)
VALUES (3, '邓磊', '520520', '1735350920@qq.com', '18812612826', '天津市滨海新区');

INSERT INTO sys.my_user (user_id, user_name, password, email, phone_number, address)
VALUES (4, '孙烁', '123456', '1443551659@qq.com', '18920762972', '天津市滨海新区');

/**
* 2、向商品表中插入示例数据
*/
INSERT INTO sys.product (product_id, product_name, description, price, stock, category)
VALUES (1, '商品1', '这是商品1的描述', 99.99, 100, '分类1');

INSERT INTO sys.product (product_id, product_name, description, price, stock, category)
VALUES (2, '商品2', '这是商品2的描述', 199.99, 50, '分类2');

/**
* 3、向订单表中插入示例数据
*/
INSERT INTO sys.my_order (order_id, user_id, product_id, quantity, order_time)
VALUES (1, 1, 1, 2, TO_DATE('2023-01-01 12:00:00', 'yyyy-mm-dd hh24:mi:ss'));

INSERT INTO sys.my_order (order_id, user_id, product_id, quantity, order_time)
VALUES (2, 2, 2, 1, TO_DATE('2023-01-02 12:00:00', 'yyyy-mm-dd hh24:mi:ss'));

/**
* 4、向购物车表中插入示例数据
*/
INSERT INTO sys.cart (cart_id, user_id, product_id, quantity)
VALUES (1, 1, 2, 3);

INSERT INTO sys.cart (cart_id, user_id, product_id, quantity)
VALUES (2, 2, 1, 1);

/**
* 5、向评价表中插入示例数据
*/
INSERT INTO sys.evaluation (evaluation_id, user_id, product_id, score, my_comment)
VALUES (1, 1, 2, 5, '很好的商品,值得购买!');

INSERT INTO sys.evaluation (evaluation_id, user_id, product_id, score, my_comment)
VALUES (2, 2, 1, 4, '价格稍贵,但质量不错。');

1、 系统登录功能的实现。

/**
* 电商平台商品管理系统
* 查询操作
*/

/**
* 1、系统登录功能的实现。
* 查询用户表中是否存在该用户
* 如果存在该用户,则返回1,否则返回0。
* 其中,'用户名'和'密码'需要替换为用户实际输入的用户名和密码。如果查询结果为
* 1,则表示用户名和密码匹配,即验证通过;否则,表示用户名或密码错误,验证不通
* 过。可以在编写代码时根据查询结果进行相应处理,例如显示登录成功或失败的提示
* 信息。
*/
SELECT COUNT(*)
FROM sys.my_user
WHERE user_name = '用户名' AND password = '密码';

系统登录功能的实现

图 1 系统登录功能的实现

2、 数据添加功能的实现。

/**
* 2、数据添加功能的实现。
* 向商品表中添加一条数据
*/
INSERT INTO sys.product (product_id, product_name, description, price, stock, category)
VALUES (3, '商品3', '这是商品3的描述', 99.99, 100, '分类3');

数据添加功能的实现

图 2 数据添加功能的实现

3、 数据修改功能的实现。

/**
* 3、数据修改功能的实现。
* 将商品表中id为3的商品价格修改为88.88
*/
UPDATE sys.product
SET price = 88.88
WHERE product_id = 3;

数据修改功能的实现

图 3 数据修改功能的实现

4、 数据删除功能的实现。

/**
* 4、数据删除功能的实现。
* 删除购物车表中id为2的记录
*/
DELETE FROM sys.cart
WHERE cart_id = 2;

数据删除功能的实现

图 4 数据删除功能的实现

5、 数据查询功能的实现。

/**
* 5、数据查询功能的实现。
* 查询商品表中价格大于等于50的商品,并按价格降序排序
*/
SELECT *
FROM sys.product
WHERE price >= 50
ORDER BY price DESC;

数据查询功能的实现

图 5 数据查询功能的实现

【实验思考及总结】

本次实验主要是对 SQL 语句的练习,通过实现系统登录、数据添加、修改、删除和查询功能,加深了对 SQL 语句的理解和掌握。需要注意的是,SQL 语句中的大小写不敏感,但为了代码可读性和规范性,建议关键字大写,其他部分小写,并添加适当的注释。此外,需要注意数据类型的匹配,避免出现数据类型不匹配的错误。

三、视图和存储过程

【开发语言及实现平台或实验环境】

SQL
Oracle 21c 快捷版、PLSQL Developer 15

【实验目的和要求】

1、 掌握视图的基本原理。
2、 掌握视图创建、修改、删除的方法。
3、 掌握存储过程的概念。
4、 掌握存储过程创建、修改、删除的语法。
5、 掌握游标在存储过程中的使用方法。
6、 掌握创建和执行有参、无参存储过程的方法。

【实验结果与分析】

1、视图相关操作
(1)创建视图
创建一个名为 product_view 的视图,该视图包含商品表中的 id、name 和 price 字段。

/**
* 电商平台商品管理系统
* 视图和存储过程
*/

/**
* 1、视图相关操作
(1)创建视图
创建一个名为product_view的视图,该视图包含商品表中的id、name和price字段。
*/
CREATE VIEW product_view AS
SELECT product_id AS id, product_name AS name, price
FROM sys.product;

创建视图

图 1 创建视图

/**
* 使用试图
*/
SELECT * FROM product_view;

使用试图

图 2 使用试图

(2)修改视图
修改 product_view 视图,将其中的 price 字段改为 sale_price。

/**
/**
* (2)修改视图
* 修改product_view视图,将其中的price字段改为sale_price。
*/
CREATE OR REPLACE VIEW product_view AS
SELECT product_id AS id, product_name AS name, price AS sale_price
FROM sys.product;

修改试图

图 3 修改试图

/**
* 使用试图
*/
SELECT * FROM product_view;

使用试图

图 4 使用试图

(3)删除视图
删除 product_view 视图。

/**
* (3)删除视图
* 删除product_view视图。
*/
DROP VIEW product_view;

删除试图

图 5 删除试图

2、存储过程相关操作
(1)创建存储过程
创建一个名为 get_user_order_list 的存储过程,该存储过程接收一个用户 id 作为参数,返回该用户的所有订单列表。

/**
* 2、存储过程相关操作
* (1)创建存储过程
* 创建一个名为get_user_order_list的存储过程,该存储过程接收一个用户id作为参数,
* 返回该用户的所有订单列表。
*/
CREATE PROCEDURE get_user_order_list(user_id IN NUMBER)
IS
  CURSOR order_cur IS
    SELECT *
    FROM sys.my_order
    WHERE user_id = user_id;
  order_row order_cur%ROWTYPE;
BEGIN
  OPEN order_cur;
  LOOP
    FETCH order_cur INTO order_row;
    EXIT WHEN order_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Order ID: ' || order_row.order_id || ', Product ID: ' || order_row.product_id || ', Quantity: ' || order_row.quantity || ', Order Time: ' || order_row.order_time);
  END LOOP;
  CLOSE order_cur;
END;

创建存储过程

图 6 创建存储过程

/**
* 使用存储过程
*/
DECLARE
  v_user_id NUMBER := 3; -- 此处设置要查询的用户ID
BEGIN
  get_user_order_list(v_user_id);
END;

使用存储过程

图 7 使用存储过程

使用存储过程

图 8 使用存储过程

(2)修改存储过程
修改 get_user_order_list 存储过程,使其额外返回该用户的总订单数。

/**
* (2)修改存储过程
* 修改get_user_order_list存储过程,使其额外返回该用户的总订单数。
*/
CREATE OR REPLACE PROCEDURE get_user_order_list(user_id IN NUMBER, order_count OUT NUMBER)
IS
  CURSOR order_cur IS
    SELECT *
    FROM sys.my_order
    WHERE user_id = user_id;
  order_row order_cur%ROWTYPE;
BEGIN
  OPEN order_cur;
  LOOP
    FETCH order_cur INTO order_row;
    EXIT WHEN order_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Order ID: ' || order_row.order_id || ', Product ID: ' || order_row.product_id || ', Quantity: ' || order_row.quantity || ', Order Time: ' || order_row.order_time);
  END LOOP;
  CLOSE order_cur;
END;

修改存储过程

图 9 修改存储过程

/**
* 使用存储过程
*/
DECLARE
  v_user_id NUMBER := 3; -- 此处设置要查询的用户ID
  v_order_count NUMBER;
BEGIN
  get_user_order_list(v_user_id, v_order_count);
  DBMS_OUTPUT.PUT_LINE('Total Order Count: ' || v_order_count);
END;

使用存储过程

图 10 使用存储过程

使用存储过程

图 11 使用存储过程

(3)删除存储过程
删除 get_user_order_list 存储过程。

/**
* (3)删除存储过程
* 删除get_user_order_list存储过程。
*/
DROP PROCEDURE get_user_order_list;

删除存储过程

图 12 删除存储过程

【实验思考及总结】

本实验主要涉及到 Oracle 中视图和存储过程的基本操作,包括创建、修改和删除视图,以及创建、修改和删除存储过程。在创建存储过程时,还需要了解游标的使用方法。
视图可以简化 SQL 语句的编写,并且可以隐藏敏感信息。存储过程可以将一系列的 SQL 操作打包成一个可重复使用的模块,提高代码的复用性和可维护性。因此,在实际开发中,视图和存储过程都有广泛的应用。
需要注意的是,在创建存储过程时,应该尽量避免使用游标,而是采用更加简洁高效的 SQL 语句来实现相同的功能。同时,在存储过程中,应该严格遵循编码规范,进行错误处理和异常处理,以确保程序的健壮性和稳定性。

四、触发器

【开发语言及实现平台或实验环境】

SQL
Oracle 21c 快捷版、PLSQL Developer 15

【实验目的和要求】

1、 掌握触发器的概念。
2、 掌握触发器创建、修改、删除的语法。
3、 掌握创建 DML 触发器和复合触发器的方法。
4、 掌握在 PL/SQL developer 中创建、修改、删除触发器的方法。

【实验结果与分析】

触发器是一种特殊的存储过程,它在数据表中插入、更新或删除数据时自动执行。触发器可以用于强制实施业务规则、记录审计信息等。
本实验主要涉及到 Oracle 中触发器的基本操作,包括创建、修改和删除触发器。

1、创建 DML 触发器
首先,创建 product_audit 表。

/**
* 电商平台商品管理系统
* 触发器
*/

/**
* 首先,创建product_audit表。
*/
CREATE TABLE product_audit (
  audit_id NUMBER PRIMARY KEY,
  product_id NUMBER,
  product_name VARCHAR2(100),
  operation CHAR(1),
  audit_time DATE,
  CONSTRAINT fk_product_id
    FOREIGN KEY (product_id)
    REFERENCES product (product_id)
    ON DELETE CASCADE
);

创建 product_audit 表

图 1 创建 product_audit 表

下面是创建一个简单的 DML 触发器的示例,用来记录商品表中的数据变化。

/**
* 1、创建DML触发器
* 创建一个简单的DML触发器的示例,用来记录商品表中的数据变化。
*/
CREATE OR REPLACE TRIGGER product_change
AFTER INSERT OR UPDATE OR DELETE ON product
FOR EACH ROW
BEGIN
  INSERT INTO product_audit (product_id, product_name, operation, audit_time)
  VALUES (:NEW.product_id, :NEW.product_name, 'I/U/D', SYSDATE);
END;

创建 DML 触发器

图 2 创建 DML 触发器

上面的触发器会在每次向商品表中插入、更新或删除数据时触发,将相应的操作记录到商品审计表中。
调用创建的触发器需要使用相应的 DML 语句来插入、更新或删除数据,从而触发相应的事件。下面是使用上面创建的 DML 触发器来实现商品库存管理的示例。
首先,我们需要向商品表中插入一些数据。

/**
* 调用触发器
*/
INSERT INTO product (product_id, product_name, stock) VALUES (1, 'iPhone', 100);
INSERT INTO product (product_id, product_name, stock) VALUES (2, 'iPad', 200);

调用触发器

图 3 调用触发器

然后,我们可以通过 INSERT 或 UPDATE 语句来更新商品表中的库存数量。

-- 更新商品1的库存数量
UPDATE product SET stock = 50 WHERE product_id = 1;
-- 更新商品2的库存数量
UPDATE product SET stock = 150 WHERE product_id = 2;

调用触发器

图 4 调用触发器

每次更新商品表中的数据时,都会触发相应的 DML 触发器,将操作记录到商品审计表中。
要查看 DML 触发器的效果,可以通过查询商品审计表来实现。
查询商品审计表,以查看 DML 触发器的效果。

SELECT * FROM product_audit;

调用触发器

图 5 调用触发器

这个查询语句会返回商品审计表中的所有数据,包括商品 ID、商品名称、操作类型(I/U/D)和操作时间等信息。我们可以根据需要进行筛选和排序,以便更好地了解商品表中的数据变化情况。

2、创建复合触发器
复合触发器指的是在同一个触发事件(如 INSERT、UPDATE 或 DELETE)上定义多个触发器,并且这些触发器按照一定的顺序执行。下面是创建一个复合触发器的示例,用来检查订单数量是否超过商品库存量。

/**
* 2、创建复合触发器
* 创建一个复合触发器的示例,用来检查订单数量是否超过商品库存量。
*/
CREATE OR REPLACE TRIGGER check_stock_and_order
BEFORE INSERT OR UPDATE ON my_order
FOR EACH ROW
DECLARE
  v_stock NUMBER(10);
BEGIN
  SELECT stock INTO v_stock FROM product WHERE product_id = :NEW.product_id;
  IF :NEW.quantity > v_stock THEN
    RAISE_APPLICATION_ERROR(-20001, '订单数量超过库存量!');
  END IF;
END;

CREATE OR REPLACE TRIGGER update_stock
AFTER INSERT OR UPDATE ON my_order
FOR EACH ROW
BEGIN
  UPDATE product SET stock = stock - :NEW.quantity WHERE product_id = :NEW.product_id;
END;

创建复合触发器

图 6 创建复合触发器

上面的复合触发器包含了两个触发器,一个是 BEFORE INSERT 或 UPDATE 的触发器用来检查订单数量是否超过商品库存量,另一个是 AFTER INSERT 或 UPDATE 的触发器用来更新商品表中的库存数量。
调用创建的触发器需要使用相应的 DML 语句来插入、更新或删除数据,从而触发相应的事件。下面是使用上面创建的复合触发器来实现商品库存管理的示例。
在订单表中插入数据时,将触发复合触发器,检查订单数量是否超过商品库存量,并更新商品表中的库存数量。

INSERT INTO my_order (order_id, product_id, quantity) VALUES (1, 1, 80);

调用触发器

图 7 调用触发器

这个 INSERT 语句会触发 BEFORE INSERT 触发器,检查商品 1 的库存数量是否足够,由于库存只有 50 个,订单数量为 80 个,所以会抛出异常,提示订单数量超过库存量。如果订单数量小于等于库存量,则会继续执行 INSERT 语句,触发 AFTER INSERT 触发器,更新商品表中的库存数量。
要查看复合触发器的效果,可以通过查询商品表来实现。
查询商品表,以查看复合触发器的效果。

SELECT * FROM product;

调用触发器

图 8 调用触发器

这个查询语句会返回商品表中的所有数据,包括商品 ID、商品名称和库存数量等信息。我们可以根据需要对商品表进行查询和更新操作,以便更好地了解复合触发器对商品库存管理的影响。

【实验思考及总结】

本次实验主要涉及到 Oracle 中触发器的基本操作,通过创建 DML 触发器和复合触发器,加深了对触发器的理解和掌握。需要注意的是,在使用触发器时,必须仔细考虑业务逻辑,并进行充分的测试和验证,以确保程序的正确性和稳定性。
同时,为了更好地管理和维护触发器,我们可以在 PL/SQL developer 中使用相应的工具进行创建、修改和删除操作。这些工具提供了可视化的界面和便捷的交互方式,大大提高了开发效率和代码的可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末影小黑xh

感谢朋友们对我的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值