实验项目名称:数据库设计实验 实验学时: 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)有参数的自定义函数