Oracle实验报告

Oracle数据库实验报告 学 院:

专业班级:

课 程:

学 号: 姓 名: 软件与信息工程学院 10级软件工程/软工三班 数据库实践

第1页

实验一:Oracle 10g安装卸载及相关工具配置

一、实验目标:

安装Oracle 10g,了解OEM,通过DBCA安装数据库,通过DBCA删除数据库,sqldeveloper连接数据库,卸载oracle 10g。

二、实验学时数

2学时

三、实验步骤和内容:

1、安装Oracle10g(默认安装数据库)

双击setup.exe,

选择基本安装,安装目录D:盘,标准版,默认数据库orcl,口令bhbh。 进入先决条件检查界面时:网络配置需求选项不用打勾,直接下一步,是。 直到安装成功。

2、登陆和了解OEM

主要是已网页的形式来对数据库进行管理。

http://主机IP:1158/em

用户名:sys

口令:bhbh

身份:sysdba

或者

用户名:system

口令:bhbh

第2页

身份:normal

3、通过DBCA删除已安装的默认数据库orcl

程序->Oracle - OraDb10g_home1->配置和移植工具->Database Configuration Assistant->删除数据库->??

4、通过DBCA安装数据库xscj

程序->Oracle - OraDb10g_home1->配置和移植工具->Database Configuration Assistant->创建数据库->??

5、sqldeveloper连接数据库

打开sqldeveloper,新建连接

连接名:system_ora

用户名:system

口令:bhbh

主机名:本机计算机名

SID:xscj

测试,显示成功,连接,保存。

6、卸载oracle 10g

Windows下

1>停止所有Oracle服务,点Universal Installer卸载

2>删除注册表中的所有关于Oracle项

在HKEY_LOCAL_MACHINE\SOFTWARE下,删除Oracle目录 3>删除硬盘上所有Oracle文件。

(1)Oracle安装文件

(2)系统目录下,在Program files文件夹中的Oracle文件

四、上机作业

根据实验步骤完成逐个实验目标中的任务。

第3页

五、心得体会

通过这次的实验,我了解了oracle数据库的情况。懂得了数据库就是把数据存储在一个类似与仓库的地方,需要用时才从数据库里调出来。通过上机实践,知道了装数据库和卸载数据库,并且学会了怎样连数据库。

实验二:Oracle 10g手工建数据库

一、实验目标:

安装Oracle 10g数据库环境,手工建立数据库;通过Net Configuration Assistant建立监听,使用sqldeveloper连接数据库测试。

二、实验学时数

2学时

三、实验步骤和内容:

先安装好Oracle 10g数据库环境(不安装默认数据库)。

1. 创建好相关的目录

假设oracle安装在D盘,打开命令行,运行->cmd->

md D:\oracle\product\10.2.0\admin\mydb\pfile

md D:\oracle\product\10.2.0\admin\mydb\bdump

md D:\oracle\product\10.2.0\admin\mydb\cdump

md D:\oracle\product\10.2.0\admin\mydb\udump

md D:\oracle\product\10.2.0\oradata\mydb

md D:\oracle\product\10.2.0\flash_recovery_area\mydb

第4页

2.创建数据库实例

(1)设置环境变量SID(注:以后每打开一次CMD都要运行此句) set ORACLE_SID=mydb

(2)创建口令文件

orapwd file=D:\oracle\product\10.2.0\oradata\mydb\PWDmydb.ora Password=bhbh entries=5

(3)使用oradim命令创建数据库实例mydb

oradim -new -sid mydb -startmode manual -pfile "D:\oracle\product\10.2.\admin\mydb\pfile\initmydb.ora"

3.用sys账户以sysdba的身份登录

输入sqlplus sys/bhbh as sysdba

4.创建实例初始化参数文件initmydb.ora,并将其放到

D:\oracle\product\10.2.\admin\mydb\pfile\路径下。

initmydb.ora

# Copyright (c) 1991, 2001, 2002 by Oracle Corporation job_queue_processes=10

# Job Queues

# Shared Server

dispatchers="(PROTOCOL=TCP) (SERVICE=mydbXDB)"

# Miscellaneous

compatible=10.2.0.1.0

# Security and Auditing

第5页

remote_login_passwordfile=EXCLUSIVE

# Sort, Hash Joins, Bitmap Indexes

pga_aggregate_target=25165824

sort_area_size=65536

# Database Identification

db_domain=""

db_name=mydb

# File Configuration

control_files=("D:\oracle\product\10.2.0\oradata\mydb\control01.ctl",

"D:\oracle\product\10.2.0\oradata\mydb\control02.ctl","D:\oracle\product\10.2.0\oradata\mydb\control03.ctl")

db_recovery_file_dest=D:\oracle\product\10.2.0\flash_recovery_area

db_recovery_file_dest_size=2147483648

# Pools

java_pool_size=50331648

large_pool_size=8388608

shared_pool_size=83886080

# Cursors and Library Cache

open_cursors=300

# System Managed Undo and Rollback Segments

undo_management=AUTO

第6页

undo_tablespace=UNDOTBS1

# Diagnostics and Statistics

background_dump_dest=D:\oracle\product\10.2.0\admin\mydb\bdump core_dump_dest=D:\oracle\product\10.2.0\admin\mydb\cdump user_dump_dest=D:\oracle\product\10.2.0\admin\mydb\udump # Processes and Sessions

processes=150

# Cache and I/O

db_block_size=8192

db_cache_size=25165824

db_file_multiblock_read_count=16

5.运行命令实例初始化

STARTUP NOMOUNT

pfile="D:\oracle\product\10.2.0\admin\mydb\pfile\initmydb.ora";

6.运行创建数据库SQL命令

CREATE DATABASE mydb

MAXINSTANCES 1

MAXLOGHISTORY 1

MAXLOGFILES 5

MAXLOGMEMBERS 5

第7页

MAXDATAFILES 100

DATAFILE

'D:\oracle\product\10.2.0\oradata\mydb\system01.dbf'

SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED

SYSAUX DATAFILE

'D:\oracle\product\10.2.0\oradata\mydb\sysaux01.dbf' size 20M

UNDO TABLESPACE UNDOTBS1 DATAFILE

'D:\oracle\product\10.2.0\oradata\mydb\undotbs01.dbf'

SIZE 150M REUSE AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED

DEFAULT TEMPORARY TABLESPACE TEMP1 TEMPFILE 'D:\oracle\product\10.2.0\oradata\mydb\temp01.dbf' SIZE 100M REUSE

CHARACTER SET ZHS16GBK

NATIONAL CHARACTER SET AL16UTF16

LOGFILE

'D:\oracle\product\10.2.0\oradata\mydb\redo01.log' SIZE 50M,

'D:\oracle\product\10.2.0\oradata\mydb\redo02.log' SIZE 50M,

'D:\oracle\product\10.2.0\oradata\mydb\redo03.log' SIZE 50M;

7.创建用户表空间USERS

CREATE TABLESPACE USERS

DATAFILE

'D:\oracle\product\10.2.0\oradata\mydb\users01.dbf' SIZE 128M REUSE

第8页

AUTOEXTEND ON NEXT 1280K

MAXSIZE UNLIMITED;

8.创建数据字典(需要几分钟,报错不要紧)

@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\catalog.sql;

9. 创建内部包(需要几分钟,报错不要紧)

@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\catproc.sql;

10.创建自启动文件,以便以后不用每次打开数据库实例都要运行一次第5步。

create spfile FROM

pfile='D:\oracle\product\10.2.0\admin\mydb\pfile\initmydb.ora';

11.重启数据库,即关闭再打开。

shutdown ;

connect sys/bhbh as sysdba;

startup;

12.授权用户system为dba,置密码为bhbh

grant dba to system identified by bhbh;

13.使用system用户登录

conn system/bhbh;

14.为system用户创建一张KC表

CREATE TABLE KC

( KCH CHAR(3) NOT NULL,

KCM CHAR(16) NOT NULL,

第9页

KKXQ NUMBER(1) NOT NULL,

XS NUMBER(2) NOT NULL,

XF NUMBER(2),

CONSTRAINT CH_KKXQ CHECK(kkxq between 1 and 8), CONSTRAINT "PK_KCH" PRIMARY KEY("KCH"))

TABLESPACE USERS ;

15.给KC表插入一条数据,并提交。

INSERT INTO KC VALUES('001','数据库',7,68,4);

commit;

16.测试查询

Select * from kc;

17.使用Net Configuration Assistant添加监听器,并重启监听器(运行cmd->netca也一样)。

18. 创建Em资料档案库(这一步可以省略,只为创建OEM,我们以后学习用不到)。

cmd->emca -config dbcontrol db -repos create

19.打开SQLDeveloper,并新建数据库连接并测试是否成功。

20.若之前手工安装数据库出现差错,可使用以下命令删除数据库实例: cmd->oradim -delete -sid mydb

然后删除第1步所建目录即可。

第10页

四、上机作业

根据实验步骤完成逐个实验目标中的任务。

五、心得体会:

通过这次的实验,明白了手动建数据库,建表空间等。还知道了运行数据库的命令,授权命令插表等等。这次学习让我对数据库的了解和运用又新的体会。

实验三:数据库修改

一、实验目标:

学习简化实验二里的实验步骤,学习修改数据库某些属性,完成数据库作业1:手工快速创建数据库实例XSCJ和数据库XSCJ。

二、实验学时数

2学时

三、实验步骤和内容:

1.安装好ORACLE 10g,(不需要安装数据库)。

2.快速安装数据库实例mydb和数据库mydb需要3个文件:init.bat,initmydb.ora,ctreatedb.sql。

(1)双击运行init.bat文件;

(2)将initmydb.ora放到正确的路径下(参考实验二);

(3)在sqlplus环境下运行ctreatedb.sql

3.了解startup nomount,startup mount和startup三种状态的使用情况的区别,即打开实例不装载数据库、打开实例装载数据库但不打开数据库和打开实例装载数据库同时打开数据库。

第11页

(1)运行P45页例子2-7修改数据库(提示:startup;)

ALTER DATABASE mydb

DATAFILE 'D:\oracle\product\10.2.0\oradata\mydb\users01.dbf' RESIZE 200M;

(2)运行P45页例子2-9删除数据库(提示:startup mount;) 取消数据库的受限制状态:

alter system enable restricted session;

删除数据库:

DROP DATABASE;

(3)重建数据库

sys重新登录,运行ctreatedb.sql。

4.删除数据库实例mydb和数据库mydb。使用命令 oradim -delete -sid mydb 以及删除相关文件夹。

四、上机作业

适当地修改建库所用到的3个文件里的参数,手工安装数据库实例xscj和数据库xscj (快速安装),用户表空间myts。

五、心得体会

这次学习,让我明白了怎样修改数据库某些属性,手工快速创建数据库实例XSCJ和数据库XSCJ。DROP DATABASE命令可以删除数据库…

实验四:表的创建、修改和删除

第12页

以及表数据的插入、修改和删除

一、实验目标:

学习表的创建、插入、修改和删除以及表数据的插入、修改和删除。

二、实验学时数

4学时

三、实验步骤和内容:

1.手工创建好数据库XSCJ。

2.为用户system创建3个表XSB、KCB和CJB(P66-67 例子3.7-3.9, create table用法,自己照书完成)。

CREATE TABLE XSB

( XH

char(6) NOT NULL PRIMARY KEY, XM char(8) NOT NULL, XB char(2) DEFAULT '1' NOT NULL, CSSJ date NOT NULL, ZY char(12) NULL, ZXF number(2) NULL, BZ varchar2(200) NULL

)TABLESPACE myts ;

CREATE TABLE KCB

( KCH char(3) NOT NULL PRIMARY KEY,

KCM char(16) NOT NULL,

第13页

KKXQ number(1) NULL, XS number(2) NULL, XF number(1) NOT NULL

)TABLESPACE myts ;

CREATE TABLE CJB

( XH CHAR(6) NOT NULL,

KCH CHAR(3) NOT NULL,

CJ NUMBER(2),

XF NUMBER(1),

PRIMARY KEY(XH,KCH)

)TABLESPACE myts ;

3.学习修改表结构(P70 例子3.11 (1)-(3)alter table用法)。

(1)在表XSB中增加两列:JXJ(奖学金等级)、DJSM(奖学金等级说明)。 ALTER TABLE XSB

ADD ( JXJ number(1), DJSM varchar2(40) DEFAULT '奖金1000元');

(2)在表XSB中修改名为DJSM的列的默认值。

ALTER TABLE XSB

MODIFY ( DJSM DEFAULT '奖金800元' );

(3)在表XSB中删除名为JXJ和DJSM的列。

ALTER TABLE XSB

第14页

DROP COLUMN JXJ;

ALTER TABLE XSB

DROP COLUMN DJSM;

修改好可用命令:describe table_name; 查看。

4.删除表(P71 drop table用法)。

DROP TABLE table_name;

5. 向XSCJ数据库的表XSB中插入一行(P75 例子3.12 insert用法)。 INSERT INTO XSB(XH, XM, XB, CSSJ, ZY, ZXF)

VALUES('101101', '王林', '男',TO_DATE('19900210','YYYYMMDD'), '计算机', 50);

提交数据:

Commit;

插入后可用命令:select * from table_name;查看。

6.学习删除表数据(P78 DELETE和TRUNCATE的用法)。

将XSCJ数据库的XSB表中总学分小于50的行删除:

DELETE FROM XSB WHERE ZXF<50;

使用TRUNCATE TABLE语句删除表中的所有数据,且不能恢复。 TRUNCATE TABLE table_name;

插入后可用命令:select * from table_name;查看。

7. 为3个表XSB、KCB和CJB插入数据(使用insert.sql)

8.学习修改表数据(P78-79 例子3.17-3.20 UPDATE 用法)。

第15页

UPDATE XSB

SET BZ='三好'

WHERE XH='101110';

UPDATE XSB

SET ZXF=ZXF+10;

UPDATE XSB

SET ZY='通信工程',

BZ='转专业学习',

XH='101241'

WHERE XM= '罗林琳';

UPDATE XS

SET ZXF=ZXF+ 4,

BZ= '提前修完《数据结构》,并获得学分'

插入后可用命令:select * from table_name where (条件);查看。

9.将数据恢复到刚插入时的状态(即把修改过的表清空再插入)。

10.了解一下同义词,知道同义词的作用(不作重点)。

四、上机作业

第16页 WHERE XM='李明';

手工安装数据库实例xscj和数据库xscj (快速安装),用户表空间myts后,为用户system创建3个表XSB、KCB和CJB,并插入所有数据。

五、心得体会

这次学习的表创建,删除和修改的学习使我对数据库的表的认识更进一步。通过这次的学习,学会对表的创建、修改、删除。创建表就是按格式写些代码;修改(UPDATE+表名+需修改的内容)和删除(DROP TABLE + 表名)就是使用指定的指令对表进行操作,使之完成想要的目的。

实验五:数据库查询练习

一、实验目标:

学习数据库数据查询语句的基本方法以及视图的使用方法。

二、实验学时数

6学时

三、实验步骤和内容:

课本例子:4.5,4.6,4.8,4.9,4.12(2),4.14,4.15(2),4.16,4.17

4.18,4.19,4.28,4.29,4.37,4.39(1),(3),4.42,4.43,4.46

(一)学习和掌握课本查询语句的基本语法和使用方法,完成下面练习(*为必做,@为选做)。

*1、查询所有计算机系学生的信息 。

Select * from xsb;

第17页

*2、查询王同学所修的学号

Select kch from xsb where xm like '王%';

*3、查询出生于85和86年的女同学的学号和姓名。

Select xh,xm from xsb where cssj between

to_date('19900101','yyyymmdd') and to_date('19911231','yyyymmdd')and xb='女';

*4、查询学号为101104所选修的全部课程成绩。

Select cj from cjb where xh='101104';

*5、检索每个学生的姓名和年龄。

Select xm,to_char(sysdate,'yyyy')-to_char(cssj,'yyyy') as 年龄 from xsb;

*6、在XS表中检索学生的姓名和出生年份,输出的列名为姓名和生年 Select xm,to_char(cssj,'yyyy') as 出生时间 from xsb;

*7、在XS_KC表中,求选修课程206的学生的学号和得分,并将结果按分数降序排序。

Select xh,cj from cjb where kch=’206’ order by cj desc;

*8、把课程名为软件工程的成绩从学生选课数据表XS_KC中删除。

Delete from kcb where kcm=(select kch from kcb where kcm=‘软件工程’);

*9、把女同学的成绩提高10%。

Update cjb set cj=cj*1.1 where xh in (select xh from xsb where xb='女') and cj<=90;

*10、如果学号为061106的学生的成绩少于90,则加上10分。

Update cjb set cj=cj+10 where xh=’061106’and cj<90;

第18页

*11、查询学号为061104的学生选修的课程号和课程名。

Select xh,xm from xsb where xh in (select xh from cjb where kcb=’061104’;

*12、检索学习课程号为206的学生学号与姓名。

Select xm,xh from xsb where kch=’206’;

*13、检索‘李明’所选修的全部课程名称。

Select kcm from kch where xm=(select xm from xsb where xm=’李明’); *14、查找每个同学的学号及选修课程的平均成绩情况。

Select xh,avg as 课程号 平均成绩 from cjb;

*15、求选修了各课程的学生的人数。

Select count(distinct xh) as 选修课程总人数 from cjb;

Select kch as课程号 ,count (xh) as 选修人数 group by kch;

*16、查询平均成绩都在80分以上的学生学号及平均成绩。

Select xh,cj from cjb group by xh having avg(cj)>80;

Select xh,cj from cjb group by xh having avg(cj)>80 order by avg(cj); Select xh,cj from cjb group by xh having avg(cj)>80 order by avg(cj) desc;

*17、查询至少有6人选修的课程号。

Select kch as 课程号 from cjb group by having count(*)>=6; *18、检索选修课程号为101或102的学生学号,姓名和所在系

Select xh,xm,zy from kch=(select kch from kcb where kch=’101’and

第19页

kch= ‘102’;

*19、统计被学生选修的课程门数。

Select cjb

每个学生情况以及选修课程情况

Select * from xsb inner join cjb on xsb.xh=cjb.xh

Select xsb .*,cjb.* from xsb,cjb where xsb.xh=cjb.xh *20、查询没有选修数据库的学生学号,姓名和专业名。

@21、取出选修‘操作系统’课程的学生姓名。

@22、检索至少选修课程“数据结构”和“计算机基础”的学生学号。 @23、检索至少选修课程号为101和206的学生姓名。

@24、列出学生所有可能的选课情况。

@25、查询101号课程得最高分的学生的学号

@26、‘计算机基础’课程得最高分的学生的姓名、性别、所在系。 @27、将成绩最低的学生的成绩加上10分。

@28、所有成绩都在70分以上的学生姓名及所在系。

@29、列出选修课程超过3门的学生姓名及选修门数。

@30、至少选修了两门课及以上的学生的姓名和性别

@31、检索至少有两名男生选修的课程名。

@32、统计每门课程的学生选修人数(超过10人的课程才统计)。 @33、计算机基础成绩比离散数学成绩好的学生

@34、列出每个同学的学号、姓名及选修课程的平均成绩情况,没有选修的同学也列出。

第20页

@35、列出每个同学的学号及选修课程号,没有选修的同学也列出

(二)视图

1、创建一个名为zy_view的视图,该视图可以用来查看每个系名称和学生人

Create or replace view zy_view(专业,专业人数) as select zy,count(xh) from xsb group by zy;

2、创建一名为xs_view的视图,该视图可以用来查看每个学生的姓名、选修的课程名和成绩。查看视图。

Create or replace view xs_view(姓名,课程名,成绩) as select xm kcm cj from xsb,kcb,cjb where xsb.xh=cjb.xh and cjb.kch=kcb.kch;

3、创建一个名为kc_view的视图,该视图可以用来查看每门课的课程号,课程名,选修人数和平均成绩。

Create or replace view kc_view(课程号,课程名,选修人数,平均成绩) as select kcb.kch,kcm,count(xh),avg(cj) from cjb,kcb where cjb.kch=kcb.kch group by kcb.kch,kcm;

4、利用kc_view视图,查看平均成绩最高的课程名。

Select 课程名 from kc_view where 平均成绩=(select max(平均成绩) from kc_view);

5、修改xs_view视图,将视图重定义为每个学生的姓名、选课门数和平均成绩。

Create or replace view xs_view(姓名,选课门数,平均成绩) as select

xm,count(kch),avg(cj) from cjb,xsb where xsb.xh=cjb.xh group by xsb.xh,xm;

6、删除zy_view视图。

Drop view zy_view;

四、上机作业

完成实验内容中的任务,并把语句记录在每道题的下面。

五、心得体会

这次学习,我知道了对表的内容的查询,修改的操作,并通过实践对这次操

第21页

作命令进一步的熟悉,运用和掌握。还学会了怎么建立视图,视图是可以快速的查询多个表的不同的信息的图表,它使我们更方便。

实验六:索引和约束

一、实验目标:

(1)掌握索引的使用方法。

(2)掌握各种约束即数据完整性的实现方法。

二、实验学时数

2学时

三、实验步骤和内容:

1.关于索引

建立索引的最大好处是快速存取数据。

假设有10个学生,10门课,则成绩表会有100条记录,对于成绩表中某人某门课成绩的查找,最坏情况是逐行查找100次,即最后一行。而如果对成绩表中的学号和课程号创建索引,则最坏情况只需查找20次(先查找学号,再查找课程号)。

建立索引的原则:

(1)先插数据再建索引。

(2)如果经常检索的内容仅为包含大量数据的表中少于15%的行,就需要创建索引。

(3)建立索引的先后顺序会影响查询的性能。

第22页

2.创建索引表空间

CREATE TABLESPACE INDX

DATAFILE

'D:\oracle\product\10.2.0\oradata\xscj\indx01.dbf' SIZE 32M REUSE

AUTOEXTEND ON NEXT 1280K

MINIMUM EXTENT 128K

DEFAULT STORAGE

(INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

2.创建索引

CREATE INDEX kc_name_idx

ON KCB(KCM)

TABLESPACE "INDX";

3.维护索引

ALTER INDEX kc_name_idx

4.删除索引

DROP INDEX kc_idx;

5.数据完整性

生活中有些数据除了数据类型和宽度,还必须要定义其他规则的,比如学生学号必须是唯一的,不能重复的;性别必须是男或女,成绩必须是0-100的范围等。因此必须使用一些方法对数据进行约束,才得以保持数据完整性。

第23页 RENAME TO kc_idx;

6.约束

(1)建表同时添加约束:

XSB表:

主键为学号。

KCB表:

课程号为主键,

开课学期默认值为1,且只能为1-8。

CJB表

主键为学号和课程号,

存在外键XH参照XSB表的XH,

存在外键KCH参照KCB表的KCH。

(2)建表后时添加约束

XSB表:

性别必须为“男”或者“女”。

CJB表:

成绩必须>=0且<=100或者为空。

7.插入数据验证。

8.思考题

(1)建KCB表时添加约束,使课程号必须为三位0-9数字

(2)建XSB表时添加约束,使学号为101开头,后三位为0-9数字

四、上机作业

第24页

完成实验内容中的任务,并把语句记录在每道题的下面。

五、心得体会

通过这次的学习,我知道了索引的最大好处是快速存取数据。1:先插数据再建索引。2:如果经常检索的内容仅为包含大量数据的表中少于15%的行,就需要创建索引。3:建立索引的先后顺序会影响查询的性能。这3条是建立索引的原则。

我还知道了可以增加约束,就是制约范围。

实验七:PL/SQL编程

一、实验目标:

(1)掌握变量、运算符以及控制语句的使用。

(2)掌握系统函数和自定义函数的使用。

二、实验学时数

4学时

三、实验步骤和内容:

SYS登录,先导入数据字典:

@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\catalog.sql;

@D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\catproc.sql;

(1)定义变量

例子1:定义一个长度为10的变量count,其初始值为1,是varchar2类型。

count varchar2(10) := '1';

例子2:在表XSB中包含XH列,为了声明一个变量my_xh与XH列具有相同的数据类型,声明时可使用点和%TYPE属性,格式如下:

my_xh XSB.XH%TYPE;

第25页

例子3:可以使用%ROWTYPE属性声明描述表的行数据的记录。

如:声明一个记录名为cj_rec,它与CJB表具有相同的名称和数据类型,格式如下:

DECLARE

cj_rec CJB%ROWTYPE;

对于用户定义的记录,必须声明自己的域:

DECLARE

TYPE TimeRec IS RECORD(HH number(2),MM number(2));

(2)程序块

例子6.6:查询总学分大于50的学生人数

set serveroutput on

DECLARE

v_num number(3);

BEGIN

SELECT COUNT(*) INTO v_num

FROM xsb

WHERE zxf>50;

IF v_num<>0 THEN

dbms_output.put_line('总学分>:50的人数为:'|| TO_CHAR(v_num));

END IF;

END;

第26页

/

例子6.9:求10的阶乘。

DECLARE

n number:=1; count1 number:=2;

BEGIN

LOOP n:=n*count1; count1:=count1+1; IF count1>10 THEN EXIT; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE (to_char(n));

END;

/

(3)函数

系统函数:例子6.20、6.21、6.22、6.23、6.24

自定义函数:例子6.26、6.27、6.28

如果李明同学的年龄大于20岁,则显示“李明同学年龄为X岁”,否则打印“李明同学不符合条件”

第27页

set serveroutput on

declare

age number(2);

begin

select to_char (sysdate, 'yyyy')-to_char (cssj, 'yyyy') into age from xsb

where xm='李明';

if age>20 then

dbms_output.put_line('李明同学年龄为'||to_char(age)||'岁'); else

dbms_output.put_line('李明同学不符合条件');

end if;

end;

/

2.计算1+3+5+??+99的和,并显示结果。

declare

s number:=0;

i number:=1;

begin

loop

s:=s+i;

i:=i+2;

exit when i>99;

end loop;

dbms_output.put_line(to_char(s));

end;

/

3.编写一个函数f_age,可以在xs表中根据姓名求出某人的年龄。 create or replace function f_age(sname in char)

return number

as

age number;

begin

select to_char(sysdate,'yyyy')-to_char(cssj,'yyyy') into age from xsb

第28页

where xm=sname;

return(age);

end;

/

4.改写第1题的程序块,调用函数f_age来求年龄。

set serveroutput on;

declare

age number(2);

begin

age:=f_age('李明');

if age>20 then

dbms_output.put_line('李明同学年龄为'||to_char(age)||'岁'); else

dbms_output.put_line('李明同学不符合条件');

end if;

end;

/

四、上机作业

完成实验内容中的任务,并把语句记录在每道题的下面。

五、心得体会

通过这次的学习,学会了用sql语言编写简单的程序,定义和调用简单函数。在此基础上还巩固了sql语句查询的方法。在以后的学习中要多加理解,上机练习。

实验八:游标与存储过程

一、实验目标:

(1)掌握游标的使用方法。

第29页

(2)掌握存储过程的使用方法。

二、实验学时数

6学时

三、实验步骤和内容:

游标

例子:

set serveroutput on

DECLARE

v_xh char(6);

v_zxf number(2);

CURSOR XS_CUR3

IS

SELECT XH,ZXF

FROM XSB

WHERE ZYM='计算机';

BEGIN

OPEN XS_CUR3;

FETCH XS_CUR3 INTO v_xh,v_zxf;

WHILE XS_CUR3%FOUND

LOOP

dbms_output.put_line (v_xh||' '||TO_CHAR(v_zxf));

第30页

FETCH XS_CUR3 INTO v_xh,v_zxf;

END LOOP;

CLOSE XS_CUR3;

END;

1. 使用游标,将平均分大于75分的学生的学号、姓名、平均分逐行输出。

set serveroutput on

DECLARE

v_xh char(12);

v_xm char(12);

v_cj number(38);

CURSOR XS_CUR3

IS

SELECT CJB.XH,XSB.XM,avg(CJ)

FROM XSB,CJB

WHERE xsb.xh=cjb.xh

group by CJB.XH,XSB.XM having avg(cj)>75 ;

BEGIN

OPEN XS_CUR3;

FETCH XS_CUR3 INTO v_xh,v_xm,v_cj;

WHILE XS_CUR3%FOUND

LOOP

dbms_output.put_line (v_xh||' '||TO_CHAR(v_xm)||v_cj);

FETCH XS_CUR3 INTO v_xh,v_xm,v_cj;

END LOOP;

CLOSE XS_CUR3;

END;

存储过程

例子1:

CREATE OR REPLACE PROCEDURE update_info ( xname in char )

第31页

AS xf number; BEGIN

SELECT ZXF

INTO xf

FROM XS

WHERE XM=xname;

IF XF>60 THEN

UPDATE XSB SET BZ='三好学生' WHERE XM= xname;

END IF;

IF XF<35 THEN

UPDATE XS SET BZ='学分未修满'

WHERE XM=xname;

END IF;

END update_info;

执行:

(1)EXECUTE update_info('李明');

(2)begin

update_info('李明');

end;

第32页

例子2:

CREATE OR REPLACE PROCEDURE count_grade ( zym in char,person_num out number ) AS

BEGIN

SELECT COUNT(XH)

INTO person_num

FROM XS

WHERE ZYM=zym;

END count_grade;

执行:

set serveroutput on

DECLARE

v_num number;

BEGIN

count_grade('计算机',v_num);

dbms_output.put_line(v_num);

END;

/

1. 创建一个存储过程p_delete可以删除CJB表的信息。CREATE OR REPLACE PROCEDURE p_delete

AS

第33页

BEGIN delete FROM CJB; END p_delete;

执行

EXECUTE p_delete;

2. 创建一个存储过程p_insert,可以给学生表添加一条记录。 CREATE OR REPLACE PROCEDURE p_insert

(XH IN CHAR,XM IN CHAR,XB IN CHAR,CSSJ IN DATE,ZY IN CHAR,ZXF IN NUMBER,BZ IN CHAR)

AS

BEGIN

insert into xsb values(XH,XM,XB,CSSJ,ZY,ZXF,BZ);

END p_insert;

执行:

execute p_insert('102222','罗','女

',to_date('19860310','yyyymmdd'),'通信工程',50,'转专业学习');

3. 创建一个存储过程p_count,输入参数为姓名,输出参数为选课门数,平均成绩。

CREATE OR REPLACE PROCEDURE p_count

(XNO IN CHAR,K_COUNT OUT NUMBER,AVG_CJ OUT NUMBER)

BEGIN

SELECT count(kch),avg(cj) INTO K_COUNT,AVG_CJ

FROM XSB,CJB

WHERE XSB.XH=CJB.XH AND

XSB.XH=XNO;

END p_count;

set serveroutput on

DECLARE

v_num1 number;

v_num2 number(4,2);

BEGIN

p_count('101104',v_num1,v_num2);

第34页

dbms_output.put_line(v_num1||' '||v_num2);

END;

四、上机作业

完成实验内容中的任务,并把语句记录在每道题的下面。

五、心得体会

通过这次学习,我知道了游标和存储过程,还知道了游标和存储过程的使用方法,并且掌握了它们的使用方法,为以后打下基础。

实验九:触发器、用户角色创建和逻辑备份

一、实验目标:

(1)掌握触发器的使用。

(2)掌握用户和角色的创建和使用。

(3)掌握数据表的导入导出。

二、实验学时数

2学时

三、实验步骤和内容:

(一)触发器

例子1: 假设XSCJ数据库中增加一个新表XSB_HIS,表结构和表XSB相同,用来存放从XSB表中删除的记录。创建一个触发器,当XSB表被删除一行,把删除的记录写到日志表XSB_HIS中。

第35页

CREATE OR REPLACE TRIGGER del_xs

BEFORE DELETE ON XSB FOR EACH ROW

BEGIN

INSERT INTO XSB_HIS (XH,XM, XB,CSSJ, ZY, ZXF,BZ)

VALUES(:OLD.XH,:OLD.XM, :OLD.XB, :OLD.CSSJ, :OLD.ZY, :OLD.ZXF, :OLD.BZ);

END;

1.创建一个触发器,当XSB表删除一个人时,把这个人的选课信息也删掉。 CREATE OR REPLACE TRIGGER del_xs

BEFORE DELETE ON XSB FOR EACH ROW BEGIN DELETE FROM CJB WHERE XH=:OLD.XH; END del_xs;

(二)用户和角色

1.创建一个用户tom,密码为cat。该用户角色为dba。

使用该用户建表,插入数据。

CREATE USER tom identified by cat default tablespace users; grant dba to tom;

导入table.sql和insert.sql

drop user tom cascade;

(三)数据库逻辑备份

第36页

exp和imp的使用

(1)将XSB,KCB和CJB表导出成为DMP文件

(2)将XSB,KCB和CJB表删除

(3)将刚导出DMP文件导入恢复3个表

(1)将用户tom导出成为DMP文件

(2)将用户tom删除再重建

(3)将刚导出DMP文件导入恢复用户tom

四、上机作业

完成实验内容中的任务。

五、心得体会

通过这次实践,我明白了什么是触发器,并掌握的它的使用方法,还掌握了用户和角色的创建和使用。还学会了数据表的导入导出,使保存数据变的很容易。

第37页

相关推荐