实验6plsql程序设计
- 格式:doc
- 大小:414.00 KB
- 文档页数:33
西安邮电大学(计算机学院)课内实验报告实验:PL/SQL编程实验课程:大型数据库系统班级:学号:学生姓名:任课教师:一、实验目的(1)了解PL/SQL语言的结构。
(2)了解PL/SQL变量和常量的声明和使用方法。
(3)学习条件语句的使用方法。
(4)学习分支语句的使用方法。
(5)学习循环语句的使用方法。
(6)学习使用Oracle系统函数。
二、实验内容(1)练习条件语句的使用方法。
(2)练习分支语句的使用方法。
(3)练习循环语句的使用方法。
(4)练习使用Oracle系统函数。
三、实验前准备首先要了解PL/SQL语言是结构化程序设计语言。
块(Block)是PL/SQL程序中最基本的结构,所有PL/SQL程序都是由块组成的。
PL/SQL的块由变量声明、程序代码和异常处理代码3部分组成。
在PL/SQL中,常量和变量在使用前必须声明,可以使用DECLARE对变量进行声明。
四、实验步骤1.使用条件语句条件语句格式:IF <条件表达式> THEN<执行语句> …… <执行语句n>[ELSIF <条件表达式> THEN<执行语句> …… <执行语句n>……ELSE<执行语句>]END IF;执行下列程序,观察结果:SET ServerOutput ON;DECLARENum INTEGER := -11;BEGINIF Num < 0 THENdbms_output.put_line('负数');ELSIF Num >0 THENdbms_output.put_line('正数');ELSEdbms_output.put_line('0');END IF;END;2.使用分支语句分支语句格式:CASE <变量>WHEN <表达式1> THEN 值1WHEN <表达式2> THEN 值2……WHEN <表达式n> THEN 值nELSE 值n + 1END;执行下列程序,观察结果:SET ServerOutput ON;DECLAREvarDAY INTEGER := 3;Result VARCHAR2(20);BEGINResult := CASE varDAYWHEN 1 THEN '星期一'WHEN 2 THEN '星期二'WHEN 3 THEN '星期三'WHEN 4 THEN '星期四'WHEN 5 THEN '星期五'WHEN 6 THEN '星期六'WHEN 7 THEN '星期七'ELSE '数据越界'END;dbms_output.put_line(Result);END;3.使用循环语句(1)循环语句格式1:LOOP<程序块1>IF <条件表达式> THENEXITEND IF<程序块2>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER := 1;v_Sum INTEGER := 0;BEGINLOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);IF v_Num = 3 THENEXIT;END IF;dbms_output.put_line(' + ');v_Num := v_Num + 1;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum);END;(2)循环语句格式2:LOOP<程序块1>EXIT WHEN <条件表达式><程序块2>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER := 1;v_Sum INTEGER := 0;BEGINLOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);EXIT WHEN v_Num = 3;dbms_output.put_line(' + ');v_Num := v_Num + 1;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum); END;(3)循环语句格式3:WHILE <条件表达式>LOOP<程序块>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER := 1;v_Sum INTEGER := 0;BEGINWHILE v_Num <= 3LOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);IF v_Num < 3 THENdbms_output.put_line(' + ');END IF;v_Num := v_Num + 1;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum); END;(4)循环语句格式4:FOR <循环变量> IN <初始值> ..<终止值>LOOP<程序块>END LOOP;执行下列程序,观察结果:SET ServerOutput ON;DECLAREv_Num INTEGER;v_Sum INTEGER := 0;BEGINFOR v_Num IN 1..3LOOPv_Sum := v_Sum + v_Num;dbms_output.put_line(v_Num);IF v_Num < 3 THENdbms_output.put_line(' + ');END IF;END LOOP;dbms_output.put_line(' = ');dbms_output.put_line(v_Sum);END;4.使用系统函数常用函数有:数值型函数,字符型函数,日期型函数,统计函数五、实验结果六.评价分析及心得体会通过本次试验我学会了条件语句,分支语句,及循环语句的使用方法。
实验1SQL*Plus的使用和基本SELECT语句实验要求(1)掌握SQL*Plus的基本使用(2)掌握SELECT语句的简单用法。
实验条件自我实践实验时间大约60分钟1.练习1 FOLLOW ME●时间20分钟●实验步骤(1)观看第1章教学视频。
(2)实践视频中的实例。
2.练习2●时间40分钟●实验步骤(1)登录到SQL*Plus,初始用户名为:SCOTT,口令为TIGER。
(2)分别显示EMP、DETP、SALGRADE表结构,并察看表中的数据。
(3)创建一个查询显示每个雇员的姓名、工作、受雇日期及雇员编号,并且要将雇员编号作为第一列显示。
最后将该SQL语句保存成文件p1q1.sql,并执行该脚本文件。
(4)将脚本文件p1q1.sql调取到SQL缓冲区,并将列标题设置为Emp #,Employee,Job及Hire Date,将该SQL语句保存成文件p1q2.sql,最后返回查询结果。
思考练习题1.SQL*Plus命令是用于访问数据库的吗?2.下面的SELECT语句能成功执行吗?SQL>SELECT ename,job,sal Salary2FROM emp;3.下面的语句有3处错误,请纠正它们。
SQL>SELECT empno,ename2Salary x 12 ANNUAL SALARY3FROM emp;4.创建一个查询从EMP表中检索出不重复的工作名称。
5.用一个逗号和一个空格将姓名和工作连接后作为一个整体输出,显示的列标题为Employee and Title。
6.创建一个查询,用逗号将表中所有字段的信息连接作为一个整体输出,输出的列标题为THE_OUTPUT。
实验2使用WHERE和ORDER BY子句实验要求(1)掌握WHERE子句的用法。
(2)掌握ORDER BY子句的用法。
实验条件自我实践实验时间大约60分钟1.练习1FOLLOW ME●时间20分钟●实验步骤(1)观看第2章教学视频。
PL/SQL程序设计PL/SQL是一种数据库编程语言,广泛应用于Oracle数据库管理系统中。
它是SQL的一种扩展,添加了过程性编程的特性,允许开发者创建更复杂、可重用的程序逻辑。
PL/SQL程序设计可以分为以下几个方面:1.PL/SQL的基本概念:PL/SQL是过程性语言和SQL结构的结合。
它使用块的概念,一个块由一个可选的声明部分、一个执行部分和一个可选的异常处理部分组成。
PL/SQL程序可以包含变量、常量、游标和异常处理等元素。
2.变量和数据类型:在PL/SQL中,可以通过声明变量来存储和操作数据。
PL/SQL中支持多种数据类型,包括基本的整型、字符型、日期型等,还可以自定义记录类型和表类型。
使用变量可以在程序中存储临时数据,进行运算和逻辑判断。
3.控制结构:PL/SQL支持多种控制结构,包括条件语句、循环语句和异常处理语句。
条件语句可以根据一些条件来执行不同的操作。
循环语句可以重复执行一段代码,直到满足退出条件为止。
异常处理语句用于捕获和处理运行时错误,保证程序的健壮性。
4.子程序:PL/SQL中的子程序可以是存储过程、函数或触发器。
存储过程是一段可重用的代码块,它可以在数据库中存储和调用。
函数是一个具有返回值的子程序,可以在SQL语句中使用。
触发器是与表相关联的特殊存储过程,当满足特定的条件时自动触发。
5.游标和异常处理:PL/SQL中的游标用于处理查询结果集。
游标可以使用循环语句来遍历结果集,并进行相应的操作。
异常处理是PL/SQL的一大特点,它可以有效地捕获和处理运行时错误。
在异常处理部分,可以指定对应不同类型错误的处理方式,例如日志记录、回滚事务等。
6.包和包体:PL/SQL中的包是一种逻辑上的封装,它可以包含变量、常量、游标和子程序等。
包体是包的实现部分,声明和定义了包中的各个元素。
使用包可以将相关的数据和逻辑组织在一起,提供更好的可维护性和可重用性。
7.异常处理和日志记录:在实际的PL/SQL开发中,异常处理是非常重要的。
《数据库开发技术》课程之实践视图、序列、同义词和索引一、实验目的1.熟练掌握创建、使用、修改、删除和查看视图、序列、同义词和索引的方法。
二、实验内容和要求1. 创建一个部门月薪统计视图,包括所有的部门号,所有的部门名,各部门人数,各部门平均薪水、最高薪水和最低薪水。
DEPTNO DNAME COUNT_NUM AVG_SAL MAX_SAL MIN_SAL---------- -------------- ---------- ---------- ---------- ----------10 ACCOUNTING 5 2710 5000 130020 RESEARCH 5 2175 3000 80030 SALES 6 1566.66667 2850 95040 OPERATIONS 0已选择4行。
create view dept_viewas select dept.deptno DEPTNO,dept.dname DNAME,count(emp.deptno) "COUNT NUM",avg(sal)"A VG SAL" ,max(sal)"MAX SAL ",MIN(sal)"MIN SAL" from emp ,deptwhere emp.deptno(+)=dept.deptnogroup by dept.deptno,dept.dnameorder by dept.deptno;2. 创建一个新的序列empno_seq,序列的步长为1,起始值为7961,最大值为9999,并且不允许序列循环。
用此序列可以向EMP表中插入新雇员。
create sequence empno_seqincrement by 1start with 7961maxvalue 9999nocycleorder;select sequence_name, min_value, max_value, increment_by, last_numberFROM user_sequences;3. 使用empno_seq序列向EMP表添加一新雇员。
数据库原理实验报告
实验名称
使用PL/SQL编写存储过程访问数据库
实验环境
硬件平台:Intel Core i5-3210M
操作系统:Windows 8.1
数据库管理系统(DBMS):MySQL Server 5.5
实验内容及步骤
1.由于我们实验所用的MySQL不支持PL/SQL,但提供了存储过程的功能。
因此我们通过
在MySQL中建立存储过程来完成本实验。
2.建立一个存储过程,用来向student表添加一条学生记录,如图:
在存储过程中,我们将学号,姓名,性别,年龄以及系别作为存储过程的输入参数。
3.在调用存储过程前,我们先查看一下student表:
4.下面,我们调用存储过程,向表中插入一条数据,如下:
5.调用完成后,我们再次查看student表中的内容:
可以看到,刚才调用存储过程向student表中插入的数据已在表中,说明插入成功。
实验6 PL/SQL程序设计1 实验目的(1)掌握PL/SQL程序开发方法。
(2)掌握存储过程、函数、触发器、包的创建于调用。
2 实验要求(1)根据图书销售系统业务要求创建特定的存储过程、函数、触发器。
(2)根据图书销售系统业务要求将图书销售系统相关的函数、存储过程封装到包里。
3 实验步骤以bs用户登录BOOKSALES数据库,利用PL/SQL程序编写下列功能模块。
(1)创建一个存储过程,输出不同类型图书的数量、平均价格。
SQL> create or replace procedure proc_category_static2 as3 --定义游标,获取当前有哪些图书种类4 cursor c_all_category is select distinct category from books;5 --图书的平均价格6 v_avg_cost number;7 begin8 --保存图书种类9 for v_each_category in c_all_category LOOP10 select avg(retail) into v_avg_cost from books where category= group by category;11 ('种类为:'||||',平均价格为:'|| v_avg_cost);12 END LOOP;13 end proc_category_static;14 /(2)创建一个存储过程,以客户号为参数,输出该客户订购的所有图书的名称与数量。
create or replace procedure proc_get_orderinfo(2 p_customer_id %type)3 as4 --声明游标存储客户的订单号5 cursor c_orderid is select order_id from orders where customer_id=p_customer_id;6 v_orderid %type;7 --声明游标存储订单信息8 cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN;9 --保存图书的书名10 v_title %type;1112 begin13 open c_orderid;14 LOOP15 fetch c_orderid into v_orderid;16 exit when c_orderid%NOTFOUND;17 for v_orderitem in c_orderitem LOOP18 select title into v_title from books where ISBN=;19 (p_customer_id||'订购'||v_title||'的数量是'||;20 end LOOP;21 end LOOP;22 close c_orderid;23 end proc_get_orderinfo;24 /exec proc_get_orderinfoo(1001);(3)创建一个存储过程,以订单号为参数,输出该订单中所有图书的名称、单价、数量。
create or replace procedure proc_get_orderinfoo(p_order_id %type)as--声明游标存储订单号的ISBNcursor c_ISBN is select ISBN from orderitem where order_id=p_order_id;v_ISBN %type;--声明游标存储订单信息cursor c_orderitem is select ISBN,sum(quantity) totalnum from orderitem where ISBN=v_ISBN ;v_title %type;v_retail %type;beginopen c_ISBN;LOOPfetch c_ISBN into v_ISBN;exit when c_ISBN%NOTFOUND;for v_orderitem in c_orderitem LOOPselect title,retail into v_title,v_retail from books where ISBN=; (p_order_id||v_title||v_retail||;end LOOP;end LOOP;close c_ISBN;end proc_get_orderinfoo;/(4)创建一个存储过程,以出版社名为参数,输出该出版社出版的所有图书的名称、ISBN、批发价格、零售价格信息。
create or replace procedure proc_get_name(p_title %type)ascursor c_orderid is select order_id from orders where customer_id=p_customer_id;v_orderid %type;cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN;v_title %type;beginopen c_orderid;LOOPfetch c_orderid into v_orderid;exit when c_orderid%NOTFOUND;for v_orderitem in c_orderitem LOOPselect title into v_title from books where ISBN=;(p_customer_id||''||v_title||'的数量是'||;end LOOP;end LOOP;close c_orderid;end proc_get_orderinfo;/set serveroutput ondeclarev_customer number;beginv_customer :=&x;proc_get_orderinfo(v_customer);end;/(5)创建一个存储过程,输出每个客户订购的图书的数量、价格总额。
create or replace procedure proc_category_staticascursor c_all_category is select distinct category from books;v_sum_cost number;beginfor v_each_category in c_all_category LOOPselect sum(retail) into v_sum_cost from books where category= group by category;('种类为:'||||',总价格为:'|| v_sum_cost);END LOOP;end proc_category_static;/set serveroutput onexec proc_category_static;/(6)创建一个存储过程,输出销售数量前3名的图书的信息及销售名次。
create or replace procedure proc_category_staticascursor c_all_category is select distinct category from books;v_sum_retail number;beginfor v_each_category in c_all_category LOOPselect sum(cost) into v_sum_retail from books where category= group by category;('种类为:'||||',数量为:'|| v_sum_retail);END LOOP;end proc_category_static;/set serveroutput onexec proc_category_static;(7)创建一个存储过程,输出订购图书数量最多的客户的信息及订购图书的数量。
(8)创建一个存储过程,输出各类图书中销售数量最多的图书的信息及销售的数量。
(9)创建一个包,实现查询客户订购图书详细信息的分页显示。
create or replace procedure proc_title_staticascursor c_all_title is select distinct title from books;v_sum_retail number;beginfor v_each_title in c_all_title LOOPselect sum(cost) into v_sum_retail from books where title= group by title;('信息为:'||||',数量为:'|| v_sum_retail);END LOOP;end proc_title_static;/(10)创建一个包,利用集合实现图书销售排行榜的分页显示。
(11)创建一个包,包含一个函数和一个过程。
函数以图书类型为参数,返回该类型图书的平均价格。
过程输出各种类型图书中价格高于同类型图书平均价格的图书信息。
create or replace package pkg_bookasfunction get_book_avgcost(p_book_category %type) return number;procedure pro_showbook(p_book_category %type);end;/create or replace package body pkg_bookasfunction get_book_avgcost(p_book_category %type)return numberasv_ISBN %type;cursor c_books is select retail from BOOKS where ISBN=v_ISBN;v_sumcost number(6,2):=0;v_count number(6) :=0;v_avgcost number :=0;v_book_category varchar2(10);beginselect ISBN into v_ISBN from BOOKS where category=v_book_category; for v_retail in c_books LOOPv_count:=v_count+1;v_sumcost:= v_sumcost+;end LOOP;v_avgcost:=v_sumcost/v_count;(v_book_category|| '--'||v_avgcost);return v_avgcost;end;procedure pro_showbook(p_book_category %type) asv_book_category varchar2(10);cursor c_books is select * from BOOKS where retail>=get_book_avgcost(v_book_category);beginfor v_books in c_books loop||' '||||' '||||' '||||' '||||' '||; end loop;end;end;/set serveroutput ondeclarep_book_category %type;avgcost number;beginp_book_category:='管理';avgcost:=(p_book_category); ('管理');end;/(12)创建一个触发器,当客户下完订单后,自动统计该订单所有图书价格总额。