1、中南大学课程设计I设计汇报题 目 学生姓名 学 号 专业班级 指导老师 数学科学和计算技术学院1月题目一、试验目标、内容描述进行程序设计,采取进行, 要达成内容.应包含有类和指针二、试验程序设计及结构1、 需求分析2、 设计结构(包含总体结构和数据结构)三、设计过程 写出设计过程,试验源代码可不写出,但试验中犯错信息及处理方法及处理错误方法要写。四、设计特点和结果包含试验处理结果和设计心得。指出试验结果运行操作系统和平台。参考文件1、人名,文章名,出版机构,出版时间2、附录自己做关键试验源代码数据库课程设计教学纲领课程编号:1300课程名称:数据库课程设计学分: 2总课时:2周先修课程要求:数
2、据库原理和技术适应专业:信息和计算科学、数学和应用数学参考教材:1. 数据库原理和技术2. Oracle入门和提升、课程在培养方案中地位、目标和任务本课程设计是为信科、应数专业安排关键实践步骤,数据库课程设计目标是使学生经过做一个具体设计题目,将书本上理论知识和实际有机结合起来,培养学生利用所学理论知识和技能,分析处理实际问题能力,培养学生调查研究、查阅技术文件、资料、编程开发和编写技术文件能力。提供独立编程实践机会。二、课程设计基础要求要求掌握Oracle数据库编程特点,掌握面向对象程序设计方法,依据所给题目,经过调查研究和上机实习,搜集和调查相关技术资料。结合软件开发技术思想,正确划分系统
3、功效模块,进行系统具体设计,并说明各功效模块具体功效。掌握设计课题基础步骤和方法,写出系统实现具体方法,包含系统界面、功效等,附课程设计原程序。并提出系统测试方法,对所开发系统进行测试,得出测试结果。并分析结果,评价系统性能。三、课程基础内容和关键难点1. 课程基础内容:对数据库原理和技术教学内容、Oracle数据库编程,前后台数据库连接。2. 难点:数据库关联、对具体问题编程和开发技术。四、课程设计安排和选题标准上要求每个学生基础题和综合题各选一题,具体任务由指导老师部署,提出设计内容、设计要求及实施计划。学生熟习题目,给出解题方案和算法设计.进行系统设计,给出系统框图和步骤图.编码和测试,
4、要求有说明文档及测试汇报.完成设计汇报,不少于字五、课程设计汇报要求写出不少于字课程设计汇报,程序设计文档要求:对系统进行功效模块分析、控制模块分析正确,系统设计要实用,编程简练、可用、功效较全方面,说明书、步骤图要清楚。基础结构:设计分析、算法或程序步骤图源程序(附解释说明)调试汇报用户使用说明。汇报中除了在封面应有题目、班级、姓名、学号和课程设计日期以外,其正文通常有以下多个方面内容:一、课程设计目标;二、系统功效和使用说明,硬件环境:本系统适适用于那种类型计算机,内存容量为多大,应配置外部设备有哪些;软件环境:本系统设计采取是何种语言,应在什么软件环境下使用;三、需求分析;四、系统概念结
5、构设计;五、数据库逻辑结构设计(数据库结构说明);六、系统实现过程。七、结束语。经过搞课程设计,你有何感想,学到了什么?六、考评方法和评分方法依据课程设计要求,利用所选题目,完成设计和开发任务,写出规范设计汇报,并依据实习到课情况、软件上机运行情况、界面是否友好、汇报是否规范等综合评定。如多人合作完成,应依据各人所负担工作情况,进行排序。指导老师负责组织检验、考勤老师分组负责(每位老师和担任班级同时上下课)帮助学生熟悉程序编写,立即查究错误。考评标准包含:程序设计可用性,实用性,通用性,可扩充性(40%) 学生动手能力,创新精神(20%) 总结汇报(20%)学习态度(20%)。七、参考题目和具
6、体要求举例参考题目:第一部分:基础题第一题 进入自己创建用户下进行以下操作。1、创建表STUDENT、COURSE、GRADE,各个表结构以下: (1) STUDENT学号 NUMBER(6),姓名 VARCHAR2(12)入课时间 DATE,专业 VARCHAR2(20),性别 CHAR(2),年纪 INTEGER (2) COURSE课程号 NUMBER(6),课程名称 VARCHAR2(20),课时 INTEGER,学分 INTEGER(3) GRADE 学号 NUMBER(6), 课程号 NUMBER(6), 成绩 NUMBER(2) 2、向上面三个表中分别插入5条纪录。 示例:(1)
7、 (1) INSERT INTO STUDENT (学号,姓名,入课时间,专业,性别,年纪)VALUES (100001,HUANGWEI,TO_DATE(1999-09-10,YYYY-MM-DD),COMPUTER,男,23);(2) (2) INSERT INTO COURSE (课程号,课程名称,课时,学分) VALUES (000001,多媒体,32,4);(3) (3) INSERT INTO GRADE (学号,课程号,成绩)VALUES (100001,000001,90) 第二题 练习:建立TEAMSTATS表以下:NAME POS AB HITS WALKS SINGLES
8、 DOUBLES TRIPLES HR SOJONES 1B 145 45 34 31 8 1 5 10DONKNOW 3B 175 65 23 50 10 1 4 15WORLEY LF 157 49 15 5 8 3 3 16 DAVID OF 187 70 24 48 4 0 17 42HAMHOCKER 3B 50 12 10 10 2 0 0 13CASEY DH 1 0 0 0 0 0 0 1在TEAMSTATS表上做以下操作:(1)查看WALKS小于20球员个数。SQL SELECT COUNT(*) FROM TEAMSTATS WHERE WALKSSELECT SUM(HI
9、TS) TOTAL_HITS FROM TEAMSTATS;(4)查看3B位置上队员总DOUBLES及总SO。(5)查看漏球(SO)平均数。SQLSELECT AVG(SO) AVE_STRIKE_OUTS FROM TEAMSTATS;(6)查看TRIPLES为0队员HITS平均数。(7)查看全部队员最高SIGGLES是多少。SQLSELECT MAX(SIGGLES) FROM TEAMSTATS; 第三题 已知企业职员表EMP(EID, ENAME, BDATE, SEX, CITY),部门表DEPT(DID, DNAME, DCITY),工作表WORK(EID,DID,STARTDAT
10、E,SALARY)。各个字段说明以下:EID职员编号,最多6个字符。比如A00001(主键)ENAME职员姓名,最多10个字符。比如SMITHBDATE出生日期,日期型SEX职员性别,单个字符。F或MCITY职员居住城市,最多20个字符。比如:上海DID部门编号,最多3个字符。比如 A01 (主键)DNAME部门名称,最多20个字符。比如:研发部门DCITY部门所在城市,最多20个字符。比如:上海STARTDATE职员到部门上班日期,日期型SALARY职员工资。整型。请使用ORACLEsql*plus 完成下列操作1、 创建表EMP,DEPT,WORK,并定义表主键和外键。2、 向每个表中插入
11、合适数据。比如:插入三条部门数据,分别为每个部门插入两条职员数据3、 查询“研发”部门全部职员基础信息4、 查询拥有最多职员部门基础信息(要求只取出一个部门信息),假如有多个部门人数一样,那么取出部门编号最小那个部门基础信息。5、 显示部门人数大于5每个部门编号,名称,人数6、 显示部门人数大于5每个部门最高工资,最低工资7、 列出职员编号以字母P至S开头全部职员基础信息8、 删除年纪超出60岁职员9、 为工龄超出职员增加10%工资 第四题 PL/SQL快速学习:1、PL/SQL 是一项ORACLE 技术,是ORACLE 过程型语言,它由标准SQL 语句和一系列能够让你在不一样情况下对SQL
12、语句实施进行控制命令组成。2、PL/SQL 块结构: PL/SQL 是一个块结构语言,也就是说PL/SQL 程序能够分成逻辑块来写。块是PL/SQL 代码逻辑单元,包含最少一个BEGIN 部分和能够选择DECLARE 和EXCEPTION 部分。 PL/SQL 块基础结构:SYNTAX:BEGIN - optional, denotes beginning of block DECLARE - optional, variable definitions BEGIN - mandatory, denotes beginning of procedure section EXCEPTION -
13、optional, denotes beginning of exception section END - mandatory, denotes ending of procedure sectionEND - optional, denotes ending of block (1)在PL/SQL DECLARE 部分包含了变量、常量、指针和特殊数据类型定义。 (2) BEGIN部分是PL/SQL 语句块中必需部分,在这一部分将会使用变量和用户指针来操作数据库中数据。 (3)EXCEPTION 部分在PL/SQL 语句块中是能够选择,假如在这一部分被省略而碰到异常时候该块就会终止了。3、由
14、基础PL/SQL块所组成PL/SQL程序,可组成不一样程序形式,它们用途和适用性各不相同。程序形式大致有以下多个: (1)无名块:也就是没有命名PL/SQL块,它能够是嵌入某一个应用之中一个PL/SQL块。无名块在全部PL/SQL环境中全部适用。 (2)存放过程/函数(Procedure/Function):命名PL/SQL块,它能够接收参数,而且可 以反复被调用。 (3)包(Package):命名PL/SQL块,由一组相关过程、函数和标识符组成。 (4)数据库触发器(Triggers):是和一个具体数据库表相关联PL/SQL存放程序。每当一个SQL操作影响到该数据库表时,系统就自动实施对应数
15、据库触发器。4、PL/SQL中控制语句: (1)条件语句:IF.THEN 语法: IF condition1 THEN statement1; ELSIF condition2 THEN(可选) statement2; ELSE(可选) statement3; END IF (2)循环语句: i.简单循环: LOOP statement1; END LOOP ii.FOR循环: iii.WHILE循环:5、题目:建立以下表,并用语句插入以下数据,完成所要求操作。 (1).使用表为:PAY_TABLE, 结构: Name Null? Type NAME NOT NULL VARCHAR2(20)
16、 PAY_TYPE NOT NULL VARCHAR2(8) PAY_RATE NOT NULL NUMBER(8,2) EFF_DATE NOT NULL DATE PREV_PAY NUMBER(8,2) 数据: NAME PAY_TYPE PAY_RATE EFF_DATE PREV_PAY SANDRA SAMUELS HOURLY 12.50 01-JAN-04 ROBERT BOBAY HOURLY 11.50 15-MAY-03 KEITH JONES HOURLY 10.00 31-OCT-04 SUSAN WILLIAMS HOURLY 9.75 01-MAY-04 CHRI
17、SSY ZOES SALARY 50000.00 01-JAN-04 CLODE EVANS SALARY 42150.00 01-MAR-04 JOHN SMITH SALARY 35000.00 15-JUN-03 KEVIN TROLLBERG SALARY 27500.00 15-JUN-03 (2).操作要求:要给为你工作时间超出了六个月个人增加薪金。符合条件钟点工薪金增加4% 而符合条件雇员薪金需要增加5% 。PL/SQL 脚本: set serveroutput on BEGIN DECLARE UnknownPayType exception; cursor pay_curso
18、r is select name, pay_type, pay_rate, eff_date, sysdate, rowid from pay_table; IndRec pay_cursor%ROWTYPE; cOldDate date; fNewPay number(8,2); BEGIN open pay_cursor; loop fetch pay_cursor into IndRec; exit when pay_cursor%NOTFOUND; cOldDate := sysdate - 180; if (IndRec.pay_type = SALARY) then fNewPay
19、 := IndRec.pay_rate * 1.05; elsif (IndRec.pay_type = HOURLY) then fNewPay := IndRec.pay_rate * 1.04; else raise UnknownPayType; end if; if (IndRec.eff_date cOldDate) then update pay_table set pay_rate = fNewPay, prev_pay = IndRec.pay_rate, eff_date = IndRec.sysdate where rowid = IndRec.rowid; commit
20、; end if; end loop; close pay_cursor; EXCEPTION when UnknownPayType then dbms_output.put_line(=); dbms_output.put_line(ERROR: Aborting program.); dbms_output.put_line(Unknown Pay Type for Name); when others then dbms_output.put_line(ERROR During Processing. See the DBA.); END; END;/6.练习: (1).对PAY_TA
21、BLE表写一个查询全部统计过程。 (2).对PAY_TABLE表写一个插入一条统计过程,要求输入参数为一条统计。 (3).写一个过程实现以下要求:对工作时间超出8个月职员,假如PAY_TYPE 是HOURLY,则改为SALARY,并将PAY_RATE改为按天天7小时工作年薪. 第五题:完成以下操作要求某数据库有两张表:emp表和dept表,两张表结构以下:emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4);dept (dept_id number(3), dept_name varchar2(20), emp_i
22、d number(5);要求以下:1、根据上表结构建立对应表,为每张表写入5组正当数据。2、操纵相关表,使得“技术部”职员薪水上涨20%。3、建立日志,追踪薪水变动情况。4、建立测试包。第六题要求1考察点为基础SQL语句;要求2关键考察复合查询;要求3是考察触发器应用;要求4不仅考察了包创建,而且也考察了在PL/SQL中测试方法。要求1:首先依据前面表结构能够创建两张表:创建职员表create table emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4);部门表create table dept (dept_i
23、d number(3), dept_name varchar2(20), emp_id number(5);建立了表以后就能够往表里面写数据了,这里把添加表统计代码写入到对应存放过程。/*给emp表添加统计存放过程*/create or replace procedure ins_table_emp(p_emp_id number,p_emp_name varchar2,p_emp_salary number) asv_emp_id number:=p_emp_id;v_emp_name varchar2(20):=p_emp_name;v_emp_salary number:=p_emp_s
24、alary;begininsert into emp values (v_emp_id,v_emp_name,v_emp_salary);end ins_table_emp;/*给dept表添加统计存放过程*/create or replace procedure ins_table_dept(p_dept_id number,p_dept_name varchar2,p_emp_id number) asv_dept_id number:=p_dept_id;v_dept_name varchar2(20):=p_dept_name;v_emp_id number:=p_emp_id;beg
25、ininsert into dept values (v_dept_id,v_dept_name,v_emp_id);end ins_table_emp;/*调用对应存放过程实现统计添加*/beginins_table_emp(10000,4000);ins_table_emp(10001,?y,2300);ins_table_emp(10002,3?t,3500);ins_table_emp(10003,?,3500);ins_table_emp(10004,?,3500);ins_table_dept(111,DD?t2?,10000);ins_table_dept(111,DD?t2?,
26、10001);ins_table_dept(111,DD?t2?,10002);ins_table_dept(112,?2?,10003);ins_table_dept(113,D3?2?,10004);end;要求2:给指定部门职员加薪,这实际上是一个复合查询,首先需要把全部该部门职员选出来,然后对这些职员薪水进行对应改动。代码以下:(需要注意是:将要加薪部门作为参数,这么存放过程更有灵活性。)create or replace procedure add_salary(p_dept_name varchar2) asv_dept_name varchar2(20):=p_dept_name
27、;beginupdate emp set emp.EMP_SALARY=emp.EMP_SALARY*1.2 where emp.EMP_ID in (select emp.EMP_ID from emp,dept where emp.EMP_ID=dept.EMP_ID and dept.DEPT_ID=?2?);end add_salary;要求3:建立日志对薪水变动情况形成一个追踪,也就是说,假如对某个职员薪水进行变更就应该将其对应变更统计全部记下来。假如对emp表salary字段创建一个触发器,来监视对salary更改,把每次更改善行统计,这么就达成了要求3目标了。create or
28、replace trigger print_salary_changebefore delete or insert or update on emp-触发事件for each row- 每修改一行全部需要调用此过程declare -只有触发器申明需要declare,过程和函数全部不需要salary_balance number;begin-:new 和:old分别代表该行在修改前和修改后统计salary_balance=:new.salary=:old.salary;dbms_output.PUT_LINE(old salary is: | :old.salary);dbms_output.
29、PUT_LINE(old salary is: | :new.salary);dbms_output.PUT_LINE(old salary is: | to_char(salary_balance);end print_salary_change;要求4:和其它语言(c/c+等)相比,PL/SQL测试有其不一样之处,归纳下来有三种方法:1、使用DBMS_OUTPUT包PUT_LINE方法来显示中间变量,以此来观察程序是否存在逻辑错误。2、插入测试表方法。即创建一个临时中间表,然后把全部包含到中间变量结果全部作为统计插入到中间表中,这么能够查询表中结果来观察程序实施情况。3、使用异常处理手段,
30、对可疑程序段使用begin end ,然后能够在exception里进行异常捕捉处理。这里使用第二种方法插入测试表方法来建立一个测试包,PL/SQL里包概念类似于面向对象里类概念,包将一组操作和属性封装在一起,不仅增强了程序模块化,而且因为封装了更多操作和属性而提升了实施效能。建立一个PL/SQL需要两个步骤:首先要建立包头,类似于建立一个类头文件,里面关键对包中过程,函数和变量申明;第二部分关键是包体部分,实现前面申明过程和函数,另外还需要对包进行初始化等工作。依据这一思绪,建立测试包以下:/*包头部分*/create or replace package debug asprocedure
31、 debug(v_description varchar2,v_valueOfvariable varchar2)procedure reset;v_numberOfLine number;end debug;/*包体部分*/create or replace package body debug asprocedure debug(v_description varchar2,v_valueOfvariable varchar2) isbegininsert into debugtablevalues(v_numberOfLine,v_description,v_valueOfvariabl
32、e);v_numberOfLine:=v_numberOfLine+1;end debug;procedure reset isbeginv_numberOfLine:=1;delete from debugtable;end reset;/*初始化部分*/beginreset;end debug;三习题 1、创建一个过程,打印出各个工资等级人数。备注:显示格式为三种情况1、工资少于人数为:*;工资在3000人数为*;工资大于3000人数为:* 2、创建一个表salary_change_record(empid,old_salary,new_salary,change_date),old_sa
33、lary:用来纪录职员原来工资,new_salary:用来纪录更新后工资,change_date:统计更新系统时间。然后创建一个触发器,名称为 change_record,功效:每次更新职员工资以后,将更新纪录保留到表salary_change_record中。第六题:(三人完成,每人选三题)已知企业职员表EMP(EID, ENAME, BDATE, SEX, CITY),部门表DEPT(DID, DNAME, DCITY),工作表WORK(EID,DID,STARTDATE,SALARY)。各个字段说明以下:EID职员编号,最多6个字符。比如A00001(主键)ENAME职员姓名,最多10个
34、字符。比如SMITHBDATE出生日期,日期型SEX职员性别,单个字符。F或MCITY职员居住城市,最多20个字符。比如:上海DID部门编号,最多3个字符。比如 A01 (主键)DNAME部门名称,最多20个字符。比如:研发部门DCITY部门所在城市,最多20个字符。比如:上海STARTDATE职员到部门上班日期,日期型SALARY职员工资。整型。请使用ORACLEsql*plus 完成下列操作1、 创建表EMP,DEPT,WORK,并定义表主键和外键。2、 向每个表中插入合适数据。比如:插入三条部门数据,分别为每个部门插入两条职员数据3、 查询“研发”部门全部职员基础信息4、 查询拥有最多职
35、员部门基础信息(要求只取出一个部门信息),假如有多个部门人数一样,那么取出部门编号最小那个部门基础信息。5、 显示部门人数大于5每个部门编号,名称,人数6、 显示部门人数大于5每个部门最高工资,最低工资7、 列出职员编号以字母P至S开头全部职员基础信息8、 删除年纪超出60岁职员9、 为工龄超出职员增加10%工资第七题:(三人完成,每人一题)创建职员表create table emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4),job varchar2(20), dept_id number(3);部门表crea
36、te table dept (dept_id number(3), dept_name varchar2(20), loc varchar2(20);1、编写一个数据库触发器,当任何时候某个部门从dept中删除时,该触发器将从emp表中删除该部门全部雇员。2、编写一个数据包,它有两个函数和两个过程以操作emp表。该数据包要实施任务为:插入一个新雇员;删除一个现有雇员;显示指定雇 员整体薪水;显示指定雇员所在部门名称。3、编写一个函数以检验所指定雇员薪水是否有效范围内。不一样职位薪水范围为: Designation Raise Clerk 1500-2500 Salesman 2501-3500
37、 Analyst 3501-4500 Others 4501 and above. 假如薪水在此范围内,则显示消息Salary is OK,不然更新薪水为该范围内最大值。第八题:(三人完成,12题一人,其它每人一题)某数据库有两张表:emp表和dept表,两张表结构以下:emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4);dept (dept_id number(3), dept_name varchar2(20), emp_id number(5);要求以下:1、根据上表结构建立对应表,为每张表写入5组正当数据
38、。2、操纵相关表,使得“技术部”职员薪水上涨20%。3、创建一个过程,打印出各个工资等级人数。备注:显示格式为三种情况1、工资少于人数为:*;工资在3000人数为*;工资大于3000人数为:*4、创建一个表salary_change_record(empid,old_salary,new_salary,change_date),old_salary:用来纪录职员原来工资,new_salary:用来纪录更新后工资,change_date:统计更新系统时间。然后创建一个触发器,名称为 change_record,功效:每次更新职员工资以后,将更新纪录保留到表salary_change_record
39、中。第九题:编写程序 向DEPT表中插入一条统计,从键盘输入数据,假如数据类型输入错误要有提醒无法插入统计 也要有提醒,只能输入正数,假如有负数提醒。第十题编写函数按YYYY-MM-DD HH24:MI:SS格式以字符串形式返回目前系统时间第十一题编写函数在scott.emp表查询指定编号雇员名字、工资和佣金第十二题编写一个子程序,当在scott.emp表删除雇员时,期望能记载是哪个用户在什么时候删除。这里面包含两件事情,一是删除指定雇员统计,二是记载是什么时候哪个用户删除。第十三题scott.emp表使用用触发器实现业务规则:除销售员外,雇职员资只增不减第十四题编写一个子程序,删除指定编号雇员,返回用户自定义错误号和错误信息。 第十五题为雇员表emp创建一触发器,确保插入统计工资列sal大于0,同时新统计sal列值不能高于已经有统计最高工资2倍第十六题用游标完成将雇员表emp中编号大于200、且工资超出10000雇员统计插入到sal_history表中,将其经理编号超出200统计插入到mgr_history表中。 第十七题按年度基础工资额用游标修改emp表中统计sal字段值,如年基础工资低于30000,sal增加20%,不然sal增加15%。 第十八题建立名称为data_ts1数据表空间,大小为50M,区间统一为128KB大小建立名称