《数据库系统原理》实验报告 下载本文

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