1、 Oracle数据库 实验指导 段华斌 编著 计算机与通信工程系 实验一 实验名称:数据库的管理 实验学时:2 实验目的: 1)了解Oracle数据库的逻辑结构和物理结构。 2)熟悉Oracle的命令操作环境SQL*PLUS。 3)了解启动和关闭数据库的不同方式及其优缺陷。 4)熟悉掌握各种启动、关闭方式。 实验内容及环节: 1、 SQL*Plus的启动与关闭 (一)SQL*Plus的启动 当登录到操作系统后,有三种方法启动SQL*Plus。 方法一: (1) 执行“开始”→“程序”→“Oracle –
2、 OraDb11g_home1”→“应用程序开发”→“SQL Plus”命令,打开SQL Plus窗口,显示登录界面。 (2) 在登录界面中将提醒输入用户名,根据提醒输入相应的用户名和口令(例如system和admin)后按Enter键,SQL*Plus将连接到默认数据库。 (3) 连接到数据库之后,显示SQL>提醒符,可以输入相应的SQL命令。 方法二: (1) 执行“开始”→“程序”→“附件”→“命令提醒符”,打开命令提醒符窗口。 (2) 输入命令:Sqlplus / nolog Connect sys/口令 a
3、s sysdba 方法三: (1) 执行“开始”→“程序”→“附件”→“命令提醒符”,打开命令提醒符窗口。 (2) 输入命令:sqlplus 用户名/口令 as sysdba。 (二)断开与数据库的连接 SQL>DISCONNECT (三)退出SQL*Plus SQL>EXIT 或: SQL>Quit (四)启动sqlplus,也许的故障ORA-12560 导致ORA-12560: TNS: 协议适配器错误的问题的因素有三个: (1)监听服务没有起起来。windows平台个一如下操作:开始---程序---管理工具---服务,打开服务
4、面板,启动TNSlistener服务。 (2)database instance没有起起来。windows平台如下操作:开始---程序---管理工具---服务,打开服务面板,启动oracleserviceXXXX,XXXX就是你的database SID. (3)进入sqlplus前,在command line下输入 set oracle_sid=XXXX,XXXX就是你的database SID。 2、 使用shutdown命令关闭数据库 练习使用shutdown命令关闭数据库实例,分别按以下方式启动数据库实例。 (1)正常关闭。等待当前所有已连接的用户断开与
5、数据库的连接,然后关闭数据库。正常关闭的语句如下: SHUTDOWN NORMAL (2)立即关闭。回退活动事务解决并断开所有已连接的用户,然后关闭数据库。 立即关闭语句如下: SHUTDOWN IMMEDIATE (3)事务关闭:完毕事务解决后断开所有已连接的用户,然后关闭数据库。事务解决关闭语句如下: SHUTDOWN TRANSACTIONAL (4)中止关闭:中止数据库实例, 立即关闭数据库。中止关闭的语句如下: SHUTDOWN ABORT 3、 使用startup命令启动数据库 练习使用STA
6、RTUP命令启动数据库实例,分别按以下方式启动数据库实例。 (1)启动数据库实例时不装载数据库。执行此操作的命令如下: STARTUP NOMOUNT (2)启动数据库实例,装载数据库,但不打开数据库。通常在数据库维护时执行此操作,相应的命令如下: STARTUP MOUNT (3)启动后限制对数据库实例的访问。执行此操作的命令如下: STARTUP RESTRICT (4)强制实例启动。在碰到特殊异常的情况时,可以强制启动实例。强制启动实例的语句如下: STARTUP FORCE 4.改变数据库的状态 (1)装载数据库实例。
7、 在执行某些管理操作时,数据库必须启动、装载一个实例,但此时数据库处在关闭状态。 ALTER DATABASE MOUNT (2)打开已关闭的数据库。 ALTER DATABASE OPEN (3)以只读方式打开数据库。 ALTER DATABASE OPEN READ ONLY 思考题: 1、在数据库的nomount、mount、open三种模式下,分别打开数据库的什么文献? 2、当关闭数据库时使用shutdown命令,好久没有关闭,随即将“命令提醒符”窗口关闭,之后重新“启动命令提醒符”并登录SQL*PLUS,使用shutdown immedi
8、ate关闭数据库出现如下问题如何解决? ORA-24324: 未初始化服务句柄 ORA-24323: 不允许此值 ORA-01090: 正在关闭 - 不允许连接 3、如何把数据库从nomount状态改为mount状态? 实验二 实验名称:日记文献的管理 实验学时:2 实验目的: 1)了解日记文献的作用。 2)了解管理重做日记文献的准则。 3)掌握重做日记文献组及成员的添加、清除、删除等操作方法。 实验内容及环节: 重做日记文献对于Oracle数据库来说是至关重要的,Oracle数据库的变化,都会生成相应的重做日记,这些日记被记录在重
9、做日记文献中。 1、 重做日记文献的查看 (1)查看数据库各组联机重做日记文献的日记序列号: SQL>ARCHIVE LOG LIST; SQL>SELECT GROUP#,SEQUENCE# FROM V$LOG; (2)查看日记文献组的状态: SQL>SELECT GROUP#,STATUS FROM V$LOG; (3)查看重做日记组及其成员的基本信息: SQL>SELECT GROUP#,STATUS,MEMBER FROM V$LOGFILE; 2、 添加重做日记文献组 SQL>ALTER DATABASE ADD LOGFILE 2 GROUP 4
10、'E:\REDO04_1.LOG') 3 SIZE 10M; 3、 添加重做日记文献组的成员 方法一: SQL>ALTER DATABASE ADD LOGFILE MEMBER 2 'E:\REDO04_2.LOG' 3 TO GROUP 4; 方法二:假如不知道组编号,可以通过下述操作向组中其他成员的名称来添加新的成员: SQL>ALTER DATABASE ADD LOGFILE MEMBER 2 'E:\REDO04_3.LOG' 3 TO 4 (‘E:\REDO04_1.log’,’ 'E:\REDO 04_2.log’); 查询
11、v$log可以看到添加完毕后的结果: SQL>SELECT GROUP#,MEMBERS,STATUS,FIRST_TIME FROM V$LOG; 4、 删除重做日记文献组成员: SQL>ALTER DATABASE DROP LOGFILE MEMBER ' E:\REDO04_3.LOG '; 5、 删除重做日记文献组: SQL>ALTER DATABASE DROP LOGFILE GROUP 4; 也许的错误信息: Ora-01623:日记10 是实例orcl的当前日记。 解决方法: SQL> alter system switch logfile;
12、 SQL> select * from v$log; 交替日记文献组,假如多次切换后想要删除的重做日记组状态依旧是active的时候可以重启动一下数据库。 6、 清除重做日记文献组: SQL>ALTER DATABASE CLEAR LOGFILE GROUP 3; 7、 改变数据库的归档模式: (1) 修改初始化参数 ,指定归档位置和归档日记文献的命名方法。 SQL> ALTER SYSTEM 2 SET LOG_ARCHIVE_DEST='D:\ORACLE\ORADATA\ARCHIVE'; SQL> ALTER SYSTEM 2 SET LOG_A
13、RCHIVE_DUPLEX_DEST='E:\ORACLE\ARCHIVE'; SQL> ALTER SYSTEM 2 SET LOG_ARCHIVE_FORMAT='%R_%T_%S.ARC' SCOPE=SPFILE; (2) 关闭数据库实例SHUTDOWN IMMEDIATE; (3) Startup mount; (4) Alter database archivelog; (5) Alter database open; 8、 强制进行日记切换,以检查日记文献能否对的归档。 SQL>ALTER SYSTEM SWITCH LOGFILE; 在资源管理器中查
14、看指定归档位置下的归档日记文献。 9、 查看数据库的当前模式: SQL>SELECT NAME,LOG_MODE FROM V$DATABASE; 10、 查看数据库的归档进程信息: SQL>SELECT * FROM V$ARCHIVE_PROCESSES; 11、 查询数据库的归档日记文献名称、重做日记序列号以及每次归档的完毕时间等。 SQL>SELECT NAME,SEQUENCE#,COMPLETION_TIME FROM V$ARCHIVED_LOG; 思考题: 1、 移动、重命名重做日记文献成员的环节如下,请完毕各环节的命令代码。 (1)关闭数据库。 (2
15、将重做日记文献E:\REDO04_3.LOG移动或复制到D盘,并重命名为REDO04_03.LOG。 (3)以MOUNT状态打开数据库。 (4)重命名数据库的重做日记文献。 (5)打开数据库。 (6)查看重做日记文献信息。 2、在实验内容中添加重做日记文献组group4时,是否可以将group4 改为group1?改为group6呢?请分别说明因素。 3、当重做日记文献组被清除后,该组还可以继续使用吗?为什么? 实验三 实验名称:角色和用户管理 实验学时:2 实验目的: 1)了解数据库用户。 2)熟悉创建、更改、删除、查看用户的方法。 3)了解数据库的不同权限。
16、 4)掌握权限的授予和回收的方法。 5)了解权限、角色的不同点以及它们之间的关系。 6)纯熟掌握对角色的管理。 实验内容及环节: 在Oracle中,只有具有一定权限的用户才干对数据库进行操作。在安装Oracle时,数据库自身会自动创建一些用户或帐户,如SYS、SYSTEM、SYSMAN、DBSNMP等,这些预定义的用户具有特殊的权限能管理数据库。用SYS用户来实现创建、更改、删除用户等操作。 1、 创建用户 CREATE USER语句在数据库中创建新用户,语法如下: CREATE USER <用户名> IDENTIFIED {BY <口令>|EXTERNALLY|GLOBAL
17、LY} [ PASSWORD EXPIRE ] [ ACCOUNT LOCK | UNLOCK ] [TEMPORARY TABLESPACE <临时表空间>]; [DEFAULT TABLESPACE <默认表空间>] [QUOTA quota [ K | M ] | UNLIMITED ON 表空间] [ PROFILE 概要文献 ] 例1:创建管理用户USERMAN。 CREATE USER USERMAN IDENTIFIED BY USERMAN; 2、 更改用户 ALTER USER语句也可以修改用户信息。 (1) 修改密码密码。 例2:将用户USERM
18、AN的密码修改为NewPassword: ALTER USER USERMAN IDENTIFIED BY NewPassword; (2)PASSWORD EXPIRE关键词设立密码过期。 例3:设立用户USERMAN的密码立即过期,它在下一次登录时必须修改密码: ALTER USER USERMAN PASSWORD EXPIRE; (3)ACCOUNT LOCK关键词锁定用户。 例4:锁定用户USERMAN,使其无法登录到数据库: ALTER USER USERMAN ACCOUNT LOCK; (4)ACCOUNT UNLOCK关键词解锁用户。 例5:解除
19、对用户USERMAN的锁定: ALTER USER USERMAN ACCOUNT UNLOCK; 3、 删除用户 DROP USER语句也可以删除指定的用户。 DROP USER 用户名 [CASCADE]; 4、 查询用户 例5:SELECT username, profile,account_status,created FROM dba_users WHERE username=’ty’; 不同用户可以对数据库进行不同的操作,所有对数据库可以进行操作的用户都必须具有一定的操作权限,而不同用户权限不全相同。为不同用户赋予不同权限的目
20、的是为了保证数据库的安全,以下关于用户赋予、回收权限的操作。 5、 授予系统权限 使用GRANT语句,其语法如下: GRANT system_privilege [ , ... ] TO { user_name [ , ... ] | role_name [ , ... ] | PUBLIC } [ WITH ADMIN OPTION ] ; 例6:对于用户USERMAN授予SYSDBA角色: GRANT SYSDBA TO USERMAN; 6、 授予对象权限 使用GRANT语句,其语法如下: GRANT object_privilege [ , ... ] | A
21、LL [ PRIVILEGES ] ON
22、r_admin,还用数据库口令认证方式。 create role sr_admin identified by admin; 8、 给角色授权 给角色授权的语法如下: Grant {All|对象权限1 [,对象权限2…] }[列1[,列2]…] On{[模式名.]对象名|directory 目录名} to 角色 [with grant option]; 例8:grant create session to sr_admin; 9、 删除角色 Drop role 删除角色 格式: Drop role 角色; 思考题: 完毕如下操作的命令代码: 1、 以sys用户登
23、陆sqlplus. sqlplus sys/123 as sysdba 2、 创建角色role1。 Create role role1 3、为角色role1授予create session、resource权限。 grant create session to role1; grant resource to role1; 3、 创建用户,指定密码、表空间。用户名命名以本人姓名的拼音首字母缩写+‘_’+学号最后两位。 Create user ty_06 identified by 123 default tablespace users temporary tabl
24、espace temp; 5、修改用户密码。 alter user ty06 identified by 123; 6、为用户授予系统权限UNLIMITED TABLESPACE。 grant UNLIMITED TABLESPACE to ty06; 7、为用户指定角色role1。 grant role1 to ty06; 8、收回用户的UNLIMITED TABLESPACE权限。 revoke UNLIMITED TABLESPACE from ty06; 9、锁定用户。 10、解锁用户。 12、删除用户。 13、删除角色role1。 14、忘掉SYS用
25、户的解决方法。
Sqlplus / as sysdba
Alter user sys identified by 123;
Commit;
Connect sys/123 as sysdba
实验4
实验名称:表的管理
实验学时:4
实验目的:
1)了解Oracle表和视图的概念。
2)纯熟掌握使用SQL语句创建表。
3)学习使用SELECT语句查询数据。
实验内容及环节:
1、 创建表
CREATE TABLE语句的基本使用方法如下所示:
CREATE TABLE [ 26、atype> [DEFAULT expr] [CONSTRAINT constraint_name constraint_def]
[, 27、storage)])
例1、创建表Users,SQL语句如下:
CREATE TABLE dhb.Users1
(UserId Number Primary Key,
UserName Varchar2(40),
UserType Number(1),
UserPwd Varchar2(40));
2、 修改表
添加列语法形式如下:
ALTER TABLE [schema.] table_name
ADD new_column data_type [dafault expr ]
[CON 28、STRAINT constraint_name constraint_def]
[, 29、);
例3、向表Users中插入数据
INSERT INTO Users (UserId, UserName, UserType, UserPwd) VALUES ( 1, 'Admin', 1, 'Admin');
COMMIT;
4、 修改数据
UPDATE语句的基本使用方法如下所示:
UPDATE <表名> SET 列名1 = 值1, 列名2 = 值2, …, 列名n = 值n
WHERE <更新条件表达式>
例4、将用户Admin的密码修改为111111:
UPDATE Users
SET UserPwd='111111'
WHERE UserName= 30、'Admin';
COMMIT WORK;
5、 删除数据
DELETE命令删除表中的数据:
DELETE <表名>
WHERE <删除条件表达式>
例5、删除表Users中列UserName等于空('')的数据:
DELETE FROM Users WHERE UserName = '';
COMMIT WORK;
6、 查询数据
(1)SELECT语句的基本语法结构如下:
SELECT子句 [ INTO 子句 ]
FROM 子句
[ WHERE 子句 ]
[ GROUP BY 子句]
[ HAVING 子句 ]
[ ORDER BY 子句 ]
SE 31、LECT语句中各子句的说明:
SELECT子句
描述
SELECT子句
指定由查询返回的列
INTO 子句
创建新表并将结果行插入新表中
FROM 子句
指定从其中检索行的表
WHERE 子句
指定查询条件
GROUP BY 子句
指定查询结果的分组条件
HAVING 子句
指定组或聚合的搜索条件
ORDER BY 子句
指定结果集的排序
UNION运算符
将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的所有行
COMPUTE子句
生成合计作为附加的汇总列出现在结果集的最后。当与BY一起使用时,COMPUTE子句在结果集内生成控 32、制中断和分类汇总。可在同一查询内指定COMPUTE BY和COMPUTE
FOR子句
FOR子句用于指定BROWSE或XML选项
OPTION子句
应在整个查询中使用指定的查询提醒。每个查询提醒只能指定一次,但允许指定多个查询提醒。用该语句只也许指定一个OPTION子句。查询提醒影响语句中的所有运算符。假如主查询中涉及UNION,则只有涉及UNION运算符的最后一个查询可以有OPTION子句。
例6、在SELECT语句中查询指定的列名
COL EMP_NAME FORMAT A20
COL SEX FORMAT A10
COL TITLE FORMAT A10
SELEC 33、T Emp_name, Sex, Title FROM dhb.Employees;
(2)使用ROWNUM
(3)使用LIKE关键字实现模糊查询
Oracle的通配符及其含义
%
包含零个或多个任意字符的字符串
_
任意单个字符
?
任意单个字符
#
表达0——9的数字
[]
指定范围或集合中的任意单个字符
查询所有身份证号中包含ddd的员工记录
例7、SELECT EMP_NAME, TITLE, IDCard FROM DHB.Employees
WHERE IDCard LIKE '%ddd%';
(3)在SELECT中使用DECODE函数
DEC 34、ODE函数语法如下:
DECODE(<输入值>,<值1>,<结果1>,[,<值2>,<结果2>…][,<默认结果>])
假如<输入值>等于<值1>,则DECODE函数返回<结果1>;假如<输入值>等于<值2>,则DECODE函数返回<结果2>,以此类推。假如参数列表中没有与<输入值>相等的值,则DECODE函数返回<默认结果>
例8、SELECT Emp_name, DECODE(Sex, '男', '先生', '女', '女士', '未知') AS Sex
FROM DHB.Employees;
(4)在SELECT中使用CASE函数
CASE函数还可以根据不同逻辑表达式是否成立 35、来决定函数的返回值,语法如下:
CASE
WHEN <逻辑表达式1> THEN <结果1>
[WHEN <逻辑表达式2> THEN <结果2> …]
[ELSE <默认结果>]
END
例9:在Employees中,将员工工资分3个级别,工资小于等于3000的级别为低,工资大于3000且小于5000的级别为中,工资大于等于5000的级别为高。
SELECT Emp_name, Wage, CASE WHEN Wage<=3000 THEN '低' WHEN Wage>3000 AND Wage<5000 THEN '中' WHEN Wage>=5000 THEN '高' END 36、 AS GRADE
FROM DHB.Employees;
(5)保存查询结果
在CREATE TABLE语句中使用SELECT子句可以将查询结果集填充到新建的表中。新表的结构由选择列表中列的特性定义。语法如下:
CREATE TABLE <新表名> AS
37、Dep_Id AND d.Dep_Name = '办公室';
思考题:
1、创建用户,指定密码、表空间。用户名命名以本人姓名的缩写+_+学号后两位命名。
2、创建如下表,将表保存到自己的用户方案中。
学生表:student
字段名称 字段类型 约束
sno varchar2(10) 主键
sname varchar2(20)
sage number(2)
ssex varchar2(5)
CREATE TABLE student
(sno varchar2(10) 38、 Primary Key,
sname varchar2(20),
sage number(2),
ssex varchar2(5));
教师表:teacher
tno varchar2(10) 主键
tname varchar2(20)
CREATE TABLE teacher
(tno varchar2(10) Primary Key,
tname varchar2(20));
课程表:course
cno varch 39、ar2(10) 与tno联合做主键
cname varchar2(20)
tno varchar2(20)
CREATE TABLE course
(cno varchar2(10),
cname varchar2(20),
tno varchar2(20),
Primary Key(cno,tno));
成绩表:sc
sno varchar2(10) 与cno联合做主键
cno varchar2(10)
score number(4,2)
c 40、reate table sc(
sno varchar2(10),
cno varchar2(10),
score number(4,2),
primary key (sno,cno)
);
3\为各表输入数据。
insert into student values ('s001','张三',23,'男');
insert into student values ('s002','李四',23,'男');
insert into student values ('s003','吴鹏',25,'男');
insert into student values ('s00 41、4','琴沁',20,'女');
insert into student values ('s005','王丽',20,'女');
insert into student values ('s006','李波',21,'男');
insert into student values ('s007','刘玉',21,'男');
insert into student values ('s008','萧蓉',21,'女');
insert into student values ('s009','陈萧晓',23,'女');
insert into student values ('s0 42、10','陈美',22,'女');
commit;
insert into teacher values ('t001', '刘阳');
insert into teacher values ('t002', '谌燕');
insert into teacher values ('t003', '胡明星');
commit;
insert into course values ('c001','J2SE','t002');
insert into course values ('c002','Java Web','t002');
insert into course v 43、alues ('c003','SSH','t001');
insert into course values ('c004','Oracle','t001');
insert into course values ('c005','SQL SERVER 2023','t003');
insert into course values ('c006','C#','t003');
insert into course values ('c007','JavaScript','t002');
insert into course values ('c008','DIV+CSS','t001 44、');
insert into course values ('c009','PHP','t003');
insert into course values ('c010','EJB3.0','t002');
commit;
insert into sc values ('s001','c001',78.9);
insert into sc values ('s002','c001',80.9);
insert into sc values ('s003','c001',81.9);
insert into sc values ('s004','c001',60.9);
ins 45、ert into sc values ('s001','c002',82.9);
insert into sc values ('s002','c002',72.9);
insert into sc values ('s003','c002',81.9);
insert into sc values ('s001','c003','59');
commit;
4、 查询每门课程被选修的学生数。
SELECT cno,count(sno)
FROM sc
GROUP BY cno
Order by cno;
5、 查询出只选修了一门课程的所有学生的学号和姓名。
46、SELECT sc.sno,student.sname
FROM sc,student
Where sc.sno= student.sno
GROUP BY sc.sno,student.sname HAVING count(cno)=1 ;
6、查询男生、女生人数。
7、查询姓“张”的学生名单。
8、查询同名同姓学生名单,并记录同名人数。
9、1981 年出生的学生名单。
10、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列。
11、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩。
12、记录每门课程的学生选修人数 47、超过10 人的课程才记录)。规定输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
13、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分。
14、按各科平均成绩从低到高和及格率的百分数从高到低顺序。
15、记录列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]。
实验五
实验名称:PL/SQL编程
实验学时:4
实验目的:
1) 纯熟掌握PL/SQL程序设计的基本知识。
2) 纯熟掌握PL/SQL中控制结构的使用。具体涉及选择结构语句(IF语句和CASE语句),循环结 48、构(四种循环结构)。
3) 纯熟使用PL/SQL中系统函数。
4) 掌握PL/SQL中异常解决语句的使用
5) 掌握PL/SQL中SELECT语句和DML语句的综合运用。
实验内容及环节
1、条件语句IF的语法及使用
IF <条件表达式> THEN
<执行语句> …… <执行语句n>
[ELSIF <条件表达式> THEN
<执行语句> …… <执行语句n>
……
ELSE
<执行语句>]
END IF;
例1:声明一个整型变量Num,使用IF语句判断Num变量是正数、负数或0。
SET ServerOutput ON;
DECLARE
49、 Num INTEGER := -11;
BEGIN
IF Num < 0 THEN
dbms_output.put_line('负数');
ELSIF Num >0 THEN
dbms_output.put_line('正数');
ELSE
dbms_output.put_line('0');
END IF;
END;
2、分支语句CASE 语法:
CASE <变量>
WHEN <表达式1> THEN 值1
WHEN <表达式2> THEN 值2
……
WHEN <表达式n> THEN 值n
E 50、LSE 值n + 1
END;
例2、使用CASE语句根据给定的整数输出相应的星期值:
SET ServerOutput ON;
DECLARE
varDAY INTEGER := 3;
Result VARCHAR2(20);
BEGIN
Result := CASE varDAY
WHEN 1 THEN '星期一'
WHEN 2 THEN '星期二'
WHEN 3 THEN '星期三'
WHEN 4 THEN '星期四'
WHEN 5 THEN '星期五'
WHEN 6 THEN '星期六'






