数据库系统概论实验MySQL实现

实验六

6.1 存储过程

/*无参数的存储过程*/ 
-- 定义
DELIMITER //
CREATE PROCEDURE Proc_CalTotalPrice () BEGIN
	UPDATE orders 
	SET totalprice = ( SELECT SUM( extendedprice * ( 1 - discount ) * ( 1 + tax )) FROM lineitem WHERE orders.orderkey = lineitem.orderkey );
	
END // 
DELIMITER;
-- 执行
CALL Proc_CalTotalPrice ();


/*有参数的存储过程*/
-- 定义
DELIMITER //
CREATE PROCEDURE Proc_CalTotalPrice4Order ( IN p_okey INT ) BEGIN
	UPDATE orders 
	SET totalprice = (
		SELECT
			SUM(
			extendedprice * ( 1 - discount ) * ( 1 + tax )) 
		FROM
			lineitem 
		WHERE
			orders.orderkey = lineitem.orderkey 
			AND lineitem.orderkey = p_okey 
		);
	
END // 
DELIMITER;
-- 执行
CALL Proc_CalTotalPrice4Order ( 5365 );


/*有局部变量的存储过程*/
-- 定义
DELIMITER //
CREATE PROCEDURE Proc_CalTotalPrice4Customer ( IN p_custname CHAR ( 25 ) ) BEGIN
	DECLARE
		L_custkey INTEGER;
	
	SET L_custkey = (
		SELECT
			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 // 
DELIMITER;
-- 执行
CALL Proc_CalTotalPrice4Customer ( '刘绍理' );
-- 查看执行结果
SELECT
	* 
FROM
	orders 
WHERE
	custkey = ( SELECT custkey FROM customer WHERE NAME = '刘绍理' );
	
	
/*有输出参数的存储过程*/
-- 定义
DELIMITER //
CREATE PROCEDURE Proc_CalTotalPrice4Customer2 ( IN p_custname CHAR ( 25 ), OUT p_totalprice REAL ) BEGIN
	DECLARE
		L_custkey INTEGER;
	
	SET L_custkey = (
		SELECT
			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 
		);
	
	SET p_totalprice = ( SELECT SUM( totalprice ) FROM orders WHERE custkey = L_custkey );
	
END // 
DELIMITER;
-- 执行
CALL Proc_CalTotalPrice4Customer2 ( '刘绍理', @NULL );
-- 查看执行结果
SELECT
	* 
FROM
	orders 
WHERE
	custkey = ( SELECT custkey FROM customer WHERE NAME = '刘绍理' );
	
	
/*修改存储过程*/
-- 修改存储过程名
-- 不支持的语法


/*删除存储过程*/
DROP PROCEDURE
IF
	EXISTS Proc_CalTotalPrice4Order;

6.2 自定义函数

/*无参数的自定义函数*/
-- 定义
DELIMITER //
CREATE FUNCTION FUN_CalTotalPrice()
RETURNS REAL
BEGIN
	DECLARE res REAL;
	UPDATE orders SET totalprice = (SELECT SUM(extendedprice * (1 - discount) * (1 + tax)) FROM lineitem WHERE orders.orderkey = lineitem.orderkey);
	SET res = (SELECT SUM(totalprice) FROM orders);
	RETURN res;
END//
DELIMITER-- 执行
SELECT FUN_CalTotalPrice();

/*有参数的自定义函数*/
DELIMITER //
CREATE FUNCTION FUN_CalTotalPrice4Order(
	p_okey INTEGER
)
RETURNS REAL
BEGIN
	DECLARE res REAL;
	UPDATE orders SET totalprice = (SELECT SUM(extendedprice * (1 - discount) * (1 + tax)) FROM lineitem WHERE orders.orderkey = lineitem.orderkey AND lineitem.orderkey = p_okey);
	SET res = (SELECT SUM(totalprice) FROM orders);
	RETURN res;
END//
DELIMITER-- 执行
SELECT FUN_CalTotalPrice4Order(5365);

/*有局部变量的自定义函数*/
-- 定义
DELIMITER //
CREATE FUNCTION FUN_CalTotalPrice4Customer(
	p_custname CHAR(25)
)
RETURNS REAL
BEGIN
	DECLARE L_custkey INTEGER;
	DECLARE res REAL;
	SET L_custkey = (SELECT 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);
	SET res = (SELECT SUM(totalprice) FROM orders WHERE custkey = L_custkey);
	RETURN res;
END//
DELIMITER-- 执行
SELECT FUN_CalTotalPrice4Customer('刘绍理');

/*有输出参数的自定义函数*/
-- 定义
DELIMITER //
CREATE FUNCTION FUN_CalTotalPrice4Customer2(
  p_custname CHAR(25),
	p_totalprice REAL
)
RETURNS REAL
BEGIN
	DECLARE L_custkey INTEGER;
	DECLARE res REAL;
	
	SET L_custkey = (SELECT 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);
	
	SET p_totalprice = (SELECT SUM(totalprice) FROM orders WHERE custkey = L_custkey);
	SET res = p_totalprice;
	RETURN res;
END//
DELIMITER-- 执行
SELECT FUN_CalTotalPrice4Customer2('刘绍理',NULL);

/*修改自定义函数*/
-- 不支持的语法 

/*删除*/
DROP FUNCTION IF EXISTS FUN_CalTotalPrice4Order;

6.3 游标

/*普通游标*/
-- 定义
DELIMITER //
CREATE PROCEDURE ProcCursorPrice()
BEGIN
	DECLARE L_orderkey INTEGER;
	DECLARE L_totalprice REAL;
	DECLARE done INT DEFAULT FALSE;
	
	DECLARE mycursor CURSOR FOR SELECT orderkey,totalprice FROM orders;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	
	OPEN mycursor;
		l: LOOP
		FETCH mycursor INTO L_orderkey,L_totalprice;
		IF done THEN 
			LEAVE l; 
		END IF; 
		SET L_totalprice = (SELECT SUM(extendedprice * (1 - discount) * (1 + tax)) FROM lineitem WHERE orderkey = L_orderkey);
		UPDATE orders SET totalprice = L_totalprice WHERE orderkey = L_orderkey;
		END LOOP l;
	CLOSE mycursor;
END//
DELIMITER;

-- 执行
CALL ProcCursorPrice()/*REFCURSOR类型游标*/
-- 不支持的语法


/*记录变量与游标*/
-- 不支持的变量类型 RECORD
DELIMITER //
CREATE PROCEDURE ProcRecCursor_CalTotalPrice()
BEGIN
	DECLARE L_orderkey INTEGER;
	DECLARE L_totalprice REAL;
	DECLARE done INT DEFAULT FALSE;
	DECLARE res RECORD;
	
	DECLARE mycursor CURSOR FOR SELECT orderkey,totalprice FROM orders;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	
	OPEN mycursor;
	l: LOOP
		FETCH mycursor INTO res;

		IF done THEN
			LEAVE l; 
		END IF; 
		
		SET L_totalprice = (SELECT SUM(extendedprice * (1 - discount) * (1 + tax)) FROM lineitem WHERE orderkey = res.orderkey);
	END LOOP l;
	CLOSE mycursor;

END//
DELIMITER;


/*带参数的游标*/
-- 不支持的变量类型 RECORD
DELIMITER //
CREATE PROCEDURE ProcParaCursor_CalTotalPrice(
	IN p_nationname CHAR(20)
)
BEGIN
	DECLARE L_totalprice REAL;
	DECLARE res RECORD;
	DECLARE done INT DEFAULT FALSE;
	
	DECLARE mycursor(c_nationname CHAR(20)) CURSOR FOR SELECT O.orderkey,O.totalprice FROM orders O, customer C, nation N WHERE O.custkey = C.custkey AND C.nationkey = N.nationkey AND TRIM(N.name) = TRIM(c_nationname);s
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	
	OPEN mycursor(p_nationname);
	l: LOOP
		FETCH mycursor INTO res;

		IF done THEN
			LEAVE l; 
		END IF; 
		
		SET L_totalprice = (SELECT SUM(extendedprice * (1 - discount) * (1 + tax)) FROM lineitem WHERE orderkey = res.orderkey);
		UPDATE orders SET totalprice = L_totalprice WHERE orderkey = res.orderkey;
		
	END LOOP l;
	CLOSE mycursor;
END//
DELIMITER;

作业P270 2

/*1*/
DELIMITER //
CREATE PROCEDURE discrete_math_grade()
BEGIN
	DECLARE done INT DEFAULT FALSE;
	DECLARE p_100 INTEGER DEFAULT 0;
	DECLARE p_90 INTEGER DEFAULT 0;
	DECLARE p_80 INTEGER DEFAULT 0;
	DECLARE p_70 INTEGER DEFAULT 0;
	DECLARE p_60 INTEGER DEFAULT 0;
	DECLARE p_others INTEGER DEFAULT 0;
	DECLARE p_grade INTEGER;
	
	DECLARE dist CURSOR FOR SELECT grade FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = '离散数学');
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	
	OPEN dist;
		l: LOOP
			FETCH dist INTO p_grade;
			
			IF done THEN
				LEAVE l; 
			END IF; 
			
			IF(p_grade = 100) THEN
				SET p_100 = p_100 + 1;
			ELSEIF(p_grade >= 90) THEN
				SET p_90 = p_90 + 1;
			ELSEIF(p_grade >= 80) THEN
				SET p_80 = p_80 + 1;
			ELSEIF(p_grade >= 70) THEN
				SET p_70 = p_70 + 1;
			ELSEIF(p_grade >= 60) THEN
				SET p_60 = p_60 + 1;
			ELSE
				SET p_others = p_others + 1;
			END IF;
		END LOOP l;
	CLOSE dist;
END//
DELIMITER;


/*2*/
DELIMITER //
CREATE PROCEDURE avggrade(
	IN cname CHAR(40))
BEGIN
	SELECT AVG(grade) FROM SC WHERE Cno = (SELECT Cno FROM Course WHERE Cname = cname);
END//
DELIMITER;

/*3*/
DELIMITER //
CREATE PROCEDURE gradetype()
BEGIN
	DECLARE scgrade INTEGER;
	DECLARE score CHAR(1);
	DECLARE done INT DEFAULT FALSE;
	
	DECLARE gradecursor CURSOR FOR SELECT grade FROM SC; 
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	
	OPEN gradecursor;
		l: LOOP
			FETCH gradecursor INTO scgrade;

			IF done THEN
				LEAVE l; 
			END IF; 
			
			IF(scgrade >= 90 AND scgrade <= 100) THEN
				SET score = 'A';
			ELSEIF(scgrade >= 80) THEN
				SET score = 'B';
			ELSEIF(scgrade >= 70) THEN
				SET score = 'C';
			ELSEIF(scgrade >= 60) THEN
				SET score = 'D';
			ELSE 
				SET score = 'E';
			END IF;
		END LOOP l;
	CLOSE gradecursor;
END//
DELIMITER;

猜你喜欢

转载自blog.csdn.net/qq_14809159/article/details/106392745