实验六
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();
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;
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
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;
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;
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;