数据库系统原理实验——存储过程

本次实验旨在掌握数据库中的PL/SQL编程,通过创建无参数、有参数、带有局部变量和输出参数的存储过程,实现订单总价的更新。实验中涉及了存储过程的定义、执行、更名、删除以及参数传递操作,展示了存储过程在数据处理中的灵活性。实验总结表明,存储过程类似于编程中的函数,能有效简化复杂的数据操作。
摘要由CSDN通过智能技术生成

一.实验目的

  掌握数据库PL/SQL编程语言,以及数据库存储过程的设计和使用方法。

二.实验要求

  存储过程定义,存储过程运行,存储过程更名,存储过程删除,存储过程的参数传递。掌握PL/SQL编程语言和编程规范,规范设计存储过程。

  • (1)无参数的存储过程
      ①定义一个存储过程,更新所有订单的(含税折扣价)总价。
      ②执行存储过程。
  • (2)有参数的存储过程
      ①定义一个存储过程,更新给定订单的(含税折扣价)总价。
      ②执行存储过程。
  • (3)有局部变量的存储过程
      ①定义一个存储过程,更新某个顾客的所有订单的(含税折扣价)总价。
      ②执行存储过程。
      ③查看存储过程执行结果。
  • (4)有输出参数的存储过程
      ①定义一个存储过程,更新某个顾客的所有订单的(含税折扣价)总价。
      ②执行存储过程。
      ③查看存储过程执行结果。

三.实验内容和结果

  订单详情表数据 在这里插入图片描述

(1)无参数的存储过程

①定义一个存储过程,更新所有订单的(含税折扣价)总价。

CREATE PROCEDURE update_all_orderaccount()
BEGIN
	UPDATE order_form,
	(SELECT Order_number,SUM(Order_Detail_Price*(1 - Discount)*(1 + Tax)) AS sum_account
	FROM order_form_detail
	GROUP BY Order_number) AS temp
	SET order_form.Order_account = sum_account 
	WHERE order_form.Order_number = temp.Order_number;
END;

②执行存储过程

CALL update_all_orderaccount();

在这里插入图片描述

(2)有参数的存储过程

①定义一个存储过程,更新选定订单的(含税折扣价)总价。

CREATE PROCEDURE update_a_orderaccount(number char(20))
BEGIN
	UPDATE order_form
	SET order_form.Order_account = 
	(SELECT SUM(Order_Detail_Price*(1 - Discount)*(1 + Tax)) AS sum_account
	FROM order_form_detail
	GROUP BY Order_number
	HAVING number = Order_number)
	WHERE order_form.Order_number = number;
END;

②执行存储过程。

#更新’00001’号订单的总价
CALL update_a_orderaccount('00001');

(3)有局部变量的存储过程

①定义一个存储过程,更新某个顾客的所有订单的(含税折扣价)总价。

CREATE PROCEDURE update_customer_account(cname char(20))
BEGIN
	DECLARE cnumber INTEGER;
	SELECT Customer_number INTO cnumber
	FROM customer
	WHERE Customer_name = cname;
	
	UPDATE order_form,
	(SELECT Order_number,SUM(Order_Detail_Price*(1 - Discount)*(1 + Tax)) AS sum_account
	FROM order_form_detail
	GROUP BY Order_number) AS temp
	SET order_form.Order_account = sum_account
	WHERE order_form.Order_number = temp.Order_number AND order_form.Customer_number = cnumber;
END;

②执行存储过程。

#更新顾客小明的订单总价
CALL update_customer_account('小明');

③查看存储过程执行
在这里插入图片描述

(4)有输出参数的存储过程

①定义一个存储过程,更新某个顾客的所有订单的(含税折扣价)总价。

CREATE PROCEDURE update_customer_out_account(cname char(20),OUT account INTEGER)
BEGIN
	DECLARE cnumber INTEGER;
	SELECT Customer_number INTO cnumber
	FROM customer
	WHERE Customer_name = cname;
	
	UPDATE order_form,
	(SELECT Order_number,SUM(Order_Detail_Price*(1 - Discount)*(1 + Tax)) AS sum_account
	FROM order_form_detail
	GROUP BY Order_number) AS temp
	SET order_form.Order_account = sum_account
	WHERE order_form.Order_number = temp.Order_number AND order_form.Customer_number = cnumber;
	
	SELECT SUM(order_form.Order_account) INTO account
	FROM order_form
	GROUP BY Customer_number
	HAVING order_form.Customer_number = cnumber;
END;

②执行存储过程。

CALL update_customer_out_account('小明',@account);

③查看存储过程执行结果。

SELECT @account;

在这里插入图片描述
在这里插入图片描述

四.实验总结及体会

  学习到了如何创建不同类型的存储过程。
  经过试验,存储过程类似于编程中的“函数”,可以通过传递参数或传出参数,并且执行存储过程中的所有“函数语句”,使用方法也类似于函数。而对于局部变量的使用与赋值也类似与普通的编程语言,可以说只要做出相关查询更新方法,整体实验难度不高。
  在实验过程中,对于数据的处理较为麻烦,但是也学习到了SELECT语句的结果形成的临时表是可以作为UPDATE的更新表来使用,方便了对于数据的处理和选择。
  对于存储过程的删除语句为:

DROP PROCEDURE update_all_orderaccount;#DROP PROCEDURE procedure_name;
1、 Find the name, loan number and loan amount of all customers; rename the column name loan_number as loan_id. 2、 Find the names of all customers whose street includes the substring “Main”. 3、Find all customers who have a loan, an account, or both: 4、Find all customers who have both a loan and an account. 5、Find all customers who have an account but no loan. 6、Find the average account balance at the Perryridge branch. 7、 Find the number of tuples in the customer relation. 8、 Find the number of depositors in the bank. 9、 Find the number of depositors for each branch. 10、Find the names of all branches where the average account balance is more than $1,200. 11、Find all loan number which appear in the loan relation with null values for amount. 12、Find all customers who have both an account and a loan at the bank. 13、Find all customers who have a loan at the bank but do not have an account at the bank 14、Find all customers who have both an account and a loan at the Perryridge branch 15、Find all branches that have greater assets than some branch located in Brooklyn. 16、Find the names of all branches that have greater assets than all branches located in 1、创建一个School数据库,该数据库的主数据文件逻辑名称为SCHOOL_data,物理文件名为School.mdf,初始大小为10MB,最大尺寸为无限大,增长速度为10%;数据库的日志文件逻辑名称为School_log,物理文件名为School.ldf,初始大小为1MB,最大尺寸为5MB,增长速度为1MB。 2、用SQL语句建立上述表,自定义主键和外键,对于student表建立约束条件:ssex仅能取male或female;sage在18和22之间。并完成下面的查询语句。 1、查询所有选修过“Bibliometrics”课的学生的姓名和成绩; 2、查询考试成绩不及格的学生的个数; 3、查询名字中至少含有一个“z”字符的学生的姓名、学号和性别; 4、查询选修了“Introduction to the Internet”课程的学生的学号及其成绩,查询结果按分数的降序排列; 5、查询“Zuo li”同学选修课程的总学时(time)数 6、查询年龄不大于20岁的学生的平均考试成绩; 7、查询 “computer science”专业学生选修 “Database System”的人数; 8、查询同时选修课程“Database System”和“Introduction to the Internet”的学生姓名; 9、查询选修的课程中含有“Wang gang”同学所有选修课程的学生姓名。 10、查询“Information Technology for Information Management”考试成绩为空的学生姓名及专业名称。 11、查询“computer science”专业学生每个人的选修课总学分。 12、查询个人考试平均成绩高于专业平均成绩的学生姓名 13、查询个人考试平均成绩高于女生平均成绩的男生姓名 14、查询比“computer science”专业所有学生年龄都大的学生姓名。 15、查询考试成绩仅有一科不及格学生姓名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值