Oracle基本安装与应用实验报告

延安大学计算机学院实验报告专用纸

实验室:软件工程实验室      机号:14       实验日期:12 年 11月5 日

延安大学计算机学院实验报告附页

                            

13. 数据库创建完成时,显示“Database Configuration Assistant”窗口,如图1.13所示。

                      图1.13

单击“确定”返回“Database Configuration Assistant”窗口。

14.在图15所示窗口单击“确定”,进入“Oracle Universal Installer:安装 结束”窗口,如图1.14所示。

    图 1.14

                   

15.单击退出,安装完成,可以在“开始”菜单中找到Oracle的目录

16.查看注册表环境变量与系统环境变量

17.可以根据需要安装Oracle客户端。

(二)2.1练习使用不同的方法启动和关闭数据库实例;

①使用Oracle Enterprise Manager 10g关闭数据库实例

进入Enterprise Manager 10g登录窗口。用SYS帐户,以SYSDBA身份登录Oracle数据库;

单击“关闭按钮”,可以打开主机和目标数据库身份证明页面,连接身份选择SYSDBA;

“确定”—“确认关闭”——“是”,开始关闭数据库,单击刷新后,打开“启动数据库实例”页面。

②使用Oracle Enterprise Manager 10g启动数据库实例

使用SYS用户已SYSDBA的身份登录到Enterprise Manager;

单击“启动”,可以打开主机和目标数据库身份证明页面,连接身份选择SYSDBA;

单击相应按钮,开始打开数据库

2.2创建和删除数据库

  使用“数据库配置助手”工具创建新的数据库

 1)单击“开始/程序/Oracle-OraDB10g-home1/配置和一只工具/Database configuration Assistant”,进入欢迎使用窗口

2)单击“下一步”,选择“创建数据库”

3)单击“下一步”,选择“一般用途”

4)单击“下一步”,输入全局数据库名和Oracle系统标识符

5)单击“下一步”,选择默认值

6)单击“下一步”,为新数据库中的SYS、SYSTEM、DBSNMP、SYSMAN用户制定口令

7)单击“下一步”,选择默认值

8)后面几步都同步骤7)直至“创建完成”

使用“数据库配置助手”工具删除数据库

  使用“数据库配置助手”工具创建新的数据库

 1)单击“开始/程序/Oracle-OraDB10g-home1/配置和一只工具/Database configuration Assistant”,进入欢迎使用窗口

2)单击“下一步”,选择“删除数据库”

3)单击“下一步”,在“可用数据库”列表中选择需要配置的数据库

4)单击“完成”按钮,在相应对话框中进行适当的选择;

(三)3.1练习使用SQL语句创建数据库角色

●以SYSTEM用户登录到iSQL*Plus;

●使用CREATE ROLE语句创建角色UserManRole,密码为abc,

代码如下:

CREATE ROLE UserManRole IDENTIFIED BY abc;

3.2练习使用SQL语句为数据库角色授予权限

●以SYSTEM用户登录到iSQL*Plus;

●使用GRANT语句将角色UserManRole授予CONNECT、RESOURCE和UNLIMITED TABLESPACE权限,代码如下:

GRANT CONNECT TO UserManRole;

 GRANT RESOURCE TO UserManRole;

    3.3练习使用SQL语句创建数据库用户;

●以SYSTEM用户登录到iSQL*Plus;

●使用CREATE USER 语句创建用户UseManAdmin,密码为abc,代码如下:

CREATE UseManAdmin

IDENTIFIED BY abc

DEFAULT TABLESPACE UESRS

TEMPORARY TABLESPACE TEMP;

●使用CREATE语句对用户UseManAdmin授予系统权限UNLIMITED TABLESPACE,代码如下:

GRANT UNLIMITED TABLESPACE TO UseManAdmin;

3.4练习使用SQL语句指定用户角色;

●以SYSTEM用户登录到iSQL*Plus;

●使用CREATE 语句对用户Userman指定角色UserManRole,代码如下:

GRANTE UserManRole TO UserManAdmin;

(四)4.1练习使用SQL语句创建表

●以UserManAdmin用户登录到iSQL*Plus;

●使用CREATE TABLE 语句创建表Users,代码如下:

CREATE TABLE Users

(

UserId Number Primary Key,

UserName  Varchar2(20),

UserType Number(1),

UserPwd Varchar2(10)

);

4.2练习使用SQL语句想表中插入数据

●以SYSTEM用户登录到iSQL*Plus;

●使用INSERT语句向表Users中插入数据,代码如下:

Insert into Users values(1,’Admin’,1,’weiyuan’);

Insert into Users values(1,’User’,2,’zhang’);

4.3练习使用SQL语句修改表中的数据

●以SYSTEM用户登录到iSQL*Plus;

●使用UPDTAE语句将表Users中Admin用户的密码改为love,代码如下:

Update Users set UserPwd=’love’where UserName=’Admin’;

●使用SELECT 语句查看用户Admin的密码,代码如下:

Select UserPwd  from Users where UserNmae=’Admin’;

4.4练习使用SQL语句删除表中的数据

●以SYSTEM用户登录到iSQL*Plus;

●使用DELETE语句将表Users中的User用户删掉,代码如下:

Delete from Users where UserName=’user’;

●使用SELECT 语句查看用户User是否被删除,代码如下:

Select *  from Users;

4.5练习使用SELECT语句查询数据

4.6练习使用SQL语句添加一个列或删除一列

在表Users中添加一列phone,代码如下:

Alter table Users

Add(phone Number(11));

在表Users中删除一列phone,代码如下:

Alter table Users

Drop column phone;

4.7练习使用SQL语句修改某列名

讲表Users中UserPWD列的名称修改为password,代码如下:

Alter table Users

Rename column UserPWD to password;

四、出现的问题及解决办法

1.在安装完Oracle 10g后,启动Enterprise Manager 10g,用sys一SYSDBA身份进入EM后,显示“错误”

解决办法:找到Oracle安装目录,“oracle/product/10.2.0/db_1/20##-20121117PN_orcl/sysman/config/emd”文件下,最后一行改为‘agentTZRegion=Asia/Shanghai’;

在“oracle/product/10.2.0/db_1/20##-20121117PN_orcl/sysman/config/emd.properties”文件下,最后一行改为‘agentTZRegion=Asia/Shanghai’;

在“oracle/product/10.2.0/db_1/20##-20121117PN_orcl/sysman/config/ emd.properties” 文件下,最后一行改为‘agentTZRegion=Asia/Shanghai’;

2.无法登陆到iSQL*Plus

解决办法:在“计算机/管理/服务”中找到“OracleOraDb10g_home1iSQL*Plus”,启动该服务。

3.向数据库中插入数据时,总是提示“无效字符”

解决办法:经检查,发现原因是由于粗心使用了中文标点符号,或者列名不一致导致,经改正,成功写入数据。

五、实验体会

经过本次实验,感受到Oracle数据库与SQl数据库的不同,感受到Oracle数据库的强大以及其较高的安全性。

因为对Oracle数据库各方面知识还不是很懂,所以会犯很多错误,在今后的学习过程中我会加强自己的动手能力,总结错误,提高自己的能力。

 

第二篇:oracle总实验报告

实验一   Oracle数据库创建及SqlPlus的启动与退出

一、实验目的

1、掌握使用DBCA建立、删除和管理数据库模板;

2、掌握sqlplus工具的启动和退出;

二、实验内容

1、用DBCA建立数据库;

2、用DBCA删除数据库;

3、用SQL Plus测试数据库正确;

4、用DBCA管理数据库模板;

5、基于DOC方式启动和退出sqlplus

(1)单击“开始”菜单,选择运行选项,在运行对话框中输入cmd,进入Dos控制台以后在提示符下键入sqlplus-?

比如:sqlplus scott/tiger@sa

(2)在sql提示符下使用输入查询语句“select * from scott.emp”。

(3)执行完成后,输入quit或exit命令返回Dos控制台。

6、基于Windows方式启动与关闭sqlplus

(1)单击“开始”按钮,在程序组中选择\Oracle-orahome92\application development\sql plus选项。在打开的对话框中输入用户名、密码和服务器名进行登陆。

(2)当成功连接后,可以来验证:比如输入查询语句: select * from scott.emp。

(3)使用Disconnect命令中断与数据库的会话连接;如果再次连接可以使用Connect命令。比如输入connect system/manager@sa。

(4)如果想更改口令,可以使用Password命令。

(5)如果想从SQL*PLUS中退出,在SQL提示下输入Quit或Exit返回到Windows界面。

三、实验过程与步骤:

1、用DBCA建立数据库;

(1) 启动DBCA后,出现欢迎画面后,选择创建数据库,单击下一步。

(2) 选择数据库类型

(3) 输入全局数据库名称和SID

(4)设置数据库选项

(5)创建数据库过程

2、用DBCA删除数据库;

过程同建立数据库相同,在选择时,要选择删除数据库。

3、用SQL Plus测试数据库正确;(使用Connect命令)

4、用DBCA管理数据库模板;

过程:开始——所有程序——DBCA——管理模板——下一步……

5、基于DOC方式启动和退出sqlplus

(1)单击“开始”菜单,选择运行选项,在运行对话框中输入cmd,进入Dos控制台以后在提示符下键入sqlplus-?

比如:sqlplus scott/tiger@sa

(2)在sql提示符下使用输入查询语句“select * from scott.emp”。

(3)执行完成后,输入quit或exit命令返回Dos控制台。

6、基于Windows方式启动与关闭sqlplus

(1)单击“开始”按钮,在程序组中选择\Oracle-orahome92\application development\sql plus选项。在打开的对话框中输入用户名、密码和服务器名进行登陆。

(2)当成功连接后,可以来验证:比如输入查询语句: select * from scott.emp。

(3)使用Disconnect命令中断与数据库的会话连接;如果再次连接可以使用Connect命令。比如输入connect system/manager@sa。

(4)如果想更改口令,可以使用Password命令。

(5)如果想从SQL*PLUS中退出,在SQL提示下输入Quit或Exit返回到Windows界面。

二、实验总结:

这次实验在创建的过程中遇到过困难,在用DBCA管理数据库模板时,不知道自己创建的是不是正确的,我根据提示步骤一步步来做的,有的在同学的帮助下,基本完成了此次实验。

实验二   SQL Plus命令

一、实验目的

1、掌握SQL Plus命令;

二、实验内容及过程

1、以HR连接数据库(HR的初始口令为HR),验证是否能成功连接;

2、以SYSTEM连接数据库,执行 ALTER USER hr ACCOUNT UNLOCK命令;

3、改变HR的用户口令;

4、再重新连接HR。比如:CONNECT hr/口令@数据库SID;

5、用SHOW USER显示当前用户;

6、执行相关的查询语句:比如:

 

7、使用edit命令编辑上述sql命令;

8、将上述语句用Save命令保存并退出;

9、用Get命令打开保存的脚本;

10、@文件名运行PL/SQL文件;

11、用Host命令和Host Dir在SQL Plus中执行操作系统命令和暂时退出SQL Plus而回到操作系统提示符下。

12、用Show命令显示所有的环境变量的值;

三、实验总结

能基本的掌握SQL Plus命令,用命令完成实验内容,在操作过程中,也会出现错误,但仔细的查找后会及时的改过来。

实验三   SQL函数

一、实验目的

1、掌握SQL函数的使用;

二、实验内容及过程

内容

(一)数值函数

1、select abs(-100)+ln(10) from dual;

2、select mod(103,4)*10+sin(100)*cos(200) from dual;

3、select round(10.34563,2) from dual;

4、select trunc(10.34563,2) from dual;

(二)单行字符函数

1、select concat('中国','人民') from dual

2、select  replace('TTisTTAA','TT','中中') FROM dual;

3、select length(substr('THIS IS 中国',9,4)) FROM DUAL;

(三)单行日期函数

1、select current_date from dual;

2、select sysdate from dual;

3、select extract(year from sysdate) from dual;

4、select last_day(sysdate) from dual;

(四)单行类型转换函数

1、select ‘今天是:'||TO_CHAR(sysdate,'yyyy-mm-dd') FROM dual;

2、select TO_CHAR('133.4564','999.99')||'元 ' FROM dual;

3、select TO_DATE('1999-10-10','yyyy-mm-dd')+10 FROM dual;

4、select TO_NUMBER('123','999.99')*10 FROM dual;

(五)数字格式模式

1、select TO_CHAR(123,'$999') FROM dual;

2、select TO_NUMBER('134.45','999.99') FROM dual;

3、Select to_char(1000002,'9.9EEEE') from dual;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

过程

SQL> select abs(-100)+ln(10)from dual;

ABS(-100)+LN(10)

----------------

102.302585092994

SQL> select mod(103,4)*10+sin(100)*cos(200) from dual;

MOD(103,4)*10+SIN(100)*COS(200

------------------------------

              29.7533049006043

SQL> select round(10.34563,2)from dual;

ROUND(10.34563,2)

-----------------

            10.35

SQL> select trunc(10.34563,2)from dual;

TRUNC(10.34563,2)

-----------------

            10.34

SQL> select concat('中国','人民')from dual;

CONCAT('中国','人民')

---------------------

中国人民

SQL> select replace('TTisTTA','TT','中中')from dual;

REPLACE('TTISTTA','TT','中中')

------------------------------

中中is中中A

SQL> select length(substr('THIS IS 中国',9,4))from dual;

LENGTH(SUBSTR('THISIS中国',9,4

------------------------------

                             2

SQL> select current_date from dual;

CURRENT_DATE

------------

20##-2-27 8:

SQL> select sysdate from dual;

SYSDATE

-----------

20##-2-27 8

SQL> select extract(year from  sysdate )from dual;

EXTRACT(YEARFROMSYSDATE)

------------------------

                    2012

SQL> select last_day(sysdate)from dual;

LAST_DAY(SYSDATE)

-----------------

20##-2-29 8:28:25

SQL> select '今天是:'||to_char(sysdate,'yyyy-mm-dd') from dual;

'今天是:'||TO_CHAR(SYSDATE,'YY

------------------------------

今天是:20##-02-27

SQL> select to_date('1999-10-10','yyyy-mm-dd')+10 from dual;

TO_DATE('1999-10-10','YYYY-MM-

------------------------------

1999-10-20

SQL> select to_char('133.4564','999.99')||'元'from dual;

TO_CHAR('133.4564','999.99')||

------------------------------

 133.46元

SQL> select to_number('123','999.99')*10 from dual;

TO_NUMBER('123','999.99')*10

----------------------------

                        1230

SQL> select to_char(123,'$999') from dual;

TO_CHAR(123,'$999')

-------------------

 $123

SQL> select to_number('134.45','999.99') from dual;

TO_NUMBER('134.45','999.99')

----------------------------

                      134.45

SQL> select to_char(1000002,'9.9EEEE') from dual;

TO_CHAR(1000002,'9.9EEEE')

--------------------------

  1.0E+06

三、实验总结

这个相对于上学期学的sql函数是才不多的意思,只是在写代码的时候同样存在差异。例如“from dual”“||”等等。总体上不是很难。

实验四   表空间的创建与管理\数据文件的创建与修改报告

一、实验目的

1、掌握表空间的创建。

2、掌握表空间的修改与删除。

3、掌握数据文件的创建。

4、掌握数据文件的修改。

二、实验内容及过程

内容:

1、表空间的创建。

2、表空间的修改与删除。

3、数据文件的创建。

4、数据文件的修改。

过程:

在sql window

create tablespace tt

datafile 'd:\tt\tt01.dat'

size 10m

autoextend on next 50k

maxsize 50m

alter tablespace tt offline

alter tablespace tt rename

datafile 'd:\tt\tt01.dat'

to 'd:\tt.dat'

alter tablespace tt online

alter tablespace tt

add datafile 'd:\tt02.dat'

size 5m

alter database

datafile 'd:\tt02.dat'

autoextend on next 10k

alter database

datafile 'd:\tt02.dat'

resize 4m

在command window

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

SQL> desc user_tablespaces;

Name                     Type         Nullable Default Comments                                                             

------------------------ ------------ -------- ------- --------------------------------------------------------------------

TABLESPACE_NAME          VARCHAR2(30)                  Tablespace name                                                      

BLOCK_SIZE               NUMBER                        Tablespace block size                                               

INITIAL_EXTENT           NUMBER       Y                Default initial extent size                                         

NEXT_EXTENT              NUMBER       Y                Default incremental extent size                                     

MIN_EXTENTS              NUMBER                        Default minimum number of extents                                   

MAX_EXTENTS              NUMBER       Y                Default maximum number of extents                                   

PCT_INCREASE             NUMBER       Y                Default percent increase for extent size                            

MIN_EXTLEN               NUMBER       Y                Minimum extent size for the tablespace                              

STATUS                   VARCHAR2(9)  Y                Tablespace status: "ONLINE", "OFFLINE", or "READ ONLY"              

CONTENTS                 VARCHAR2(9)  Y                Tablespace contents: "PERMANENT", or "TEMPORARY"                    

LOGGING                  VARCHAR2(9)  Y                Default logging attribute                                           

FORCE_LOGGING            VARCHAR2(3)  Y                Tablespace force logging mode                                       

EXTENT_MANAGEMENT        VARCHAR2(10) Y                Extent management tracking: "DICTIONARY" or "LOCAL"                 

ALLOCATION_TYPE          VARCHAR2(9)  Y                Type of extent allocation in effect for this tablespace             

SEGMENT_SPACE_MANAGEMENT VARCHAR2(6)  Y                Segment space management tracking: "AUTO" or "MANUAL"               

DEF_TAB_COMPRESSION      VARCHAR2(8)  Y                Default table compression enabled or not: "ENABLED" or "DISABLED"   

RETENTION                VARCHAR2(11) Y                Undo tablespace retention: "GUARANTEE", "NOGUARANTEE" or "NOT APPLY"

BIGFILE                  VARCHAR2(3)  Y                Bigfile tablespace indicator: "YES" or "NO"                         

SQL> edit;

SQL> edit;

SQL> select  TABLESPACE_NAME from user_tablespaces;

TABLESPACE_NAME

------------------------------

SYSTEM

UNDOTBS1

SYSAUX

TEMP

USERS

TT

6 rows selected

三、实验总结

通过这次的实验我明白只有在理解的基础上才能很好的明白以上的语句。最开始的时候说实在的觉得那些语句莫名奇妙,听得也是云里雾里。不过这次明白每句的意识之后就觉得自己终于弄懂了一点知识。

实验五   用户的创建与修改

一、实验目的

1、掌握用户的创建。

2、掌握用户的修改与删除。

3、掌握用户的授权。

4、掌握权限的回收。

二、实验内容及过程

---------用户的创建

例1:

1)(以system的身份登录创建普通用户)

2)用SWJ1第一次登录ORACLE时,将提示什么?如何解决?

说明:缺省或临时表空间为SYSTEM, 没有指定配额。必须CREATE SESSION才能登录。要建立对象必须用QUOTA配额。

思考:如果用scott用户进行连接并创建用户,是否能创建成功?

答案:不能,只有在sys或system的身份进行创建用户

例2:

1)(以system的身份登录创建密码强制修改用户)

例3:1)(以system的身份登录锁定用户)

2)用SWJ2登记时,显示错误:ERROR:

ORA-2800:the account is locked.

必须由管理员解锁:

(以system的身份登录解锁)

-------用户创建的代码如下

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

SQL> conn system/manager;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

SQL> create user temp identified by temp;

User created

SQL> conn temp/temp;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

SQL> conn scott/tiger;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

SQL> create user temp identified by temp;

create user temp identified by temp

ORA-01031: 权限不足

SQL> conn system/manager;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

SQL> create user swj1 identified by tttt

  2  default tablespace users

  3  temporary tablespace temp

  4  quota unlimited on users

  5  password expire

  6  ;

User created

--------修改用户

1.  修改用户(系统权限:ALTER USER)

    ALTER USER 用户名 [选项]

这里的选项与CREATE USER中的一样。

(以system的身份登录)

例1: alter user temp account lock;         --加锁

例2: alter user temp account unlock;    --解锁

例3: alter user temp identified by swj   --改口令

例4: alter user temp quota unlimited on system

            quota 5M on swj ;

例5:alter user temp password expire;

下次用temp 登录到ORACLE时,提示改口令。

--------修改用户的代码如下

SQL> conn system/manager;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

SQL> alter user swj2 account unlock;

User altered

SQL> conn swj2/tttt;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

SQL> conn system/manager;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

SQL> create user swj3 identified by swj3;

User created

SQL> alter user swj3 account lock;

User altered

SQL> alter user swj3 account unlock;

User altered

SQL> alter user swj3 identified by 123;

alter user swj3 identified by 123

ORA-00988: 口令缺失或无效

SQL> alter user swj3 qouta unlimited on system qouta 5m on swj3;

alter user swj3 qouta unlimited on system qouta 5m on swj3

ORA-00922: 选项缺失或无效

SQL> alter user swj3 password expire;

User altered

-------删除用户

例6: 删除没有对象的用户

例7: 如果用户模式下有对象,必须用命令:

         DROP USER temp CASCADE;

例8: 不能删除当前用户。设当前用户temp

SQL> drop user temp cascade;

drop user temp cascade

*

ERROR 位于第 1 行:

ORA-01940: cannot drop a user that is currently connected

--------删除用户的代码如下

SQL> drop user swj3 cascade;

drop user swj3 cascade

ORA-01918: 用户 'SWJ3' 不存在

SQL> create user swj3 identified by swj3;

User created

SQL> drop user swj3 cascade;

User dropped

----授权相关内容

SQL> grant select any table to temp;

Grant succeeded

SQL> grant create user ,drop user to temp;

Grant succeeded

-----回收系统权限

SQL> revoke create user from temp;

Revoke succeeded

三、实验总结

关于用户的创建、修改、授权都感觉还好不是很难。只是最后的回收系统权限不是很懂。

实验六   表管理

一、实验目的

1、掌握使用Create Table命令创建表

2、掌握修改表、重命名表和删除表

3、掌握数据管理(Insert、Update、Delete命令)

4、掌握[NOT]NULL([非]空)、PRIMARY KEY(主键)、UNIQUE(惟一性)、CHECK(检查)及FOREIGN KEY(外键)约束的使用

二、实验内容及过程

内容如下:

1、建表操作

(1)在tmp用户下建立LEND数据表。该表主要保存图书数据借出信息,如下表所示。

(2)在tmp用户下建立Reader数据表。该表主要保存读者信息,如下表所示。

(3)在Reader数据表中增加一列IDCardNo(身份证号),数据类型为文本类型,长度为20。

(4)将字段name的长度由50改为30。

2、数据操作

(1)对LEND和Reader表执行插入记录操作(要求使用参数替换执行)

其中LEND表要插入的记录为:

0001 200701 08-2-01

0002 200702 08-03-08

0003 200703 09-04-01

Reader表要插入的记录为:

200701 张三  男  4564784789412345617

200701 李四  女  1234567891234567897

(2)修改Reader表中李四的身份证号,将其改为789456123789456123。

(3)删除表Lend中书号为0003的记录。

(4)将表复制到Lend表复制到HR用户下,用Truncate命令删除,并验证Truncate命令和Drop命令的区别。

代码如下:

SQL> create tablespace tt

  2  datafile 'd:\tt01.dat'

  3  size 10m

  4  autoextend on next 50k

  5  maxsize 50m

  6  ;

Tablespace created

SQL> create user tmp  identified by  temp

  2  default tablespace tt

  3  ;

User created

SQL> grant create session to tmp;

Grant succeeded

SQL> grant create  any table to tmp;

Grant succeeded

SQL> grant alter  any table to tmp;

Grant succeeded

SQL> grant drop any table to tmp;

Grant succeeded

SQL> grant update any table to tmp;

Grant succeeded

SQL> grant connect to tmp;

Grant succeeded

SQL> alter user tmp account unlock;

User altered

SQL> conn tmp/temp;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as tmp

SQL> create table lend (code char(10) primary key,readid char(10),outdate date);

Table created

SQL> create table reader (readid char(10) primary key,name char(50) not null unique,sex char(2)check(sex in ('男','女')));

Table created

SQL> alter table lend

  2  add

  3  constraint lend_借书号 foreign  key (readid) references reader (readid) on delete cascade;

Table altered

SQL> alter table reader add (idcardno char(20));

Table altered

SQL> alter table reader modify (name char(30));

Table altered

SQL> insert into reader values ('200702','李四','女','1234567891234567897');

1 row inserted

SQL> insert into reader values ('200701','张三','男','4564784789412345617');

1 row inserted

SQL> insert into lend values('0001','200701',to_date('08-02-01','dd-mm-yy'));

1 row inserted

SQL> insert into lend values('0002','200702',to_date('08-03-08','dd-mm-yy'));

1 row inserted

SQL> update reader set  idcardno=' 789456123789456123' where name='李四';

1 row updated

SQL> Delete from lend where code='0002';

1 row deleted

SQL> create table lendl as select *from tmp.lend;

Table created

三、实验总结

表的管理都是去年的内容,所以不是很难。不过最开始不懂"on delete cascade",不过在老师的帮助下还是弄懂啦。

实验七   查询

一、实验目的

1、掌握简单查询

2、掌握分组统计查询

3、掌握数据排序

4、掌握连接查询(多表查询)(等值查询、不等值查询、外部连接、自连接、子查询)

二、实验内容与过程

(一)简单查询、分组及排序(注:在HR用户下查询)

SQL> conn system/manager;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

SQL> alter user hr account unlock;

User altered

SQL> alter user hr identified by hr123;

User altered

SQL> conn hr/hr123;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as hr

1、从表EMPLOYEES中查询出所有名字(last_name)以G开头且工资(salary)大于3000的人的名字、工资、部门编号,工资按降序排列。

SQL>  select LAST_NAME  名字,SALARY 工资,DEPARTMENT_ID 部门编号 from EMPLOYEES

  2  where SALARY>3000 and LAST_NAME like 'G%'

  3  order by SALARY desc

  4  ;

名字                            工资 部门编号

------------------------- ---------- --------

Greenberg                   12000.00      100

Greene                       9500.00       80

Gietz                        8300.00      110

Grant                        7000.00

 2、按部分编号统计出表EMPLOYEES中每个部门的人数。

SQL> select DEPARTMENT_ID 部门编号,count(*)  部门人数

  2  from EMPLOYEES

  3  group by DEPARTMENT_ID;

3、显示部门人数少于5人的部门编号及人数。

SQL> select DEPARTMENT_ID 部门编号,count(*)  部门人数

  2  from EMPLOYEES

  3  group by DEPARTMENT_ID

  4  ;

部门编号   部门人数

-------- ----------

     100          6

      30          6

                  1

      20          2

      70          1

      90          3

     110          2

      50         45

      40          1

      80         34

      10          1

      60          5

12 rows selected

4、显示所有工资大于5000,且部门人数大于5个的部门编号、部门最低工资和部门人数。

SQL> select DEPARTMENT_ID 部门编号,min(SALARY) 最低工资,count(*) 部门人数

  2  from EMPLOYEES

  3  where SALARY>5000

  4  group by DEPARTMENT_ID

  5  having count(*)>5

  6  ;

部门编号   最低工资   部门人数

-------- ---------- ----------

     100       6900          6

      80       6100         34

(二)多表查询(注:在Scott用户下查询)

1、用等值连接查询员工号为7369的员工所在的部门名称。

SQL> select d.dname from scott.emp e,scott.dept d

  2  where e.empno=7369 and e.deptno=d.deptno

  3  ;

DNAME

--------------

RESEARCH

2、用不等值查,查询出根据工资的值,列出员工姓名和等级。

SQL> select e.ename,s.grade

  2   from emp e,salgrade s

  3   where e.sal>=s.losal and e.sal<=hisal

  4  ;

ENAME           GRADE

---------- ----------

SMITH               1

JAMES               1

ADAMS               1

WARD                2

MARTIN              2

MILLER              2

TURNER              3

ALLEN               3

CLARK               4

BLAKE               4

JONES               4

SCOTT               4

FORD                4

KING                5

14 rows selected;

3、用外部连接查询员工姓名和所在部门名称。

SQL> select e.ename,d.dname from scott.emp e,scott.dept d

  2  where e.deptno(+)=d.deptno

  3  ;

ENAME      DNAME

---------- --------------

SMITH      RESEARCH

ALLEN      SALES

WARD       SALES

JONES      RESEARCH

MARTIN     SALES

BLAKE      SALES

CLARK      ACCOUNTING

SCOTT      RESEARCH

KING       ACCOUNTING

TURNER     SALES

ADAMS      RESEARCH

JAMES      SALES

FORD       RESEARCH

MILLER     ACCOUNTING

           OPERATIONS

15 rows selected

4、用自连接查询出每个员工及其经理的姓名。

SQL> select name.ename worke,manager.ename Manager

  2  from emp name,emp manager

  3  where name.mgr=manager.empno;

WORKE      MANAGER

---------- ----------

FORD       JONES

SCOTT      JONES

JAMES      BLAKE

TURNER     BLAKE

MARTIN     BLAKE

WARD       BLAKE

ALLEN      BLAKE

MILLER     CLARK

ADAMS      SCOTT

CLARK      KING

BLAKE      KING

JONES      KING

SMITH      FORD

13 rows selected

5、在表EMP中,查询工资高于员工WARD薪水的员工姓名和工资。(注:5~9为嵌套查询)

SQL> select ename,sal from emp where sal>=(select sal from emp where ename='WARD');

ENAME            SAL

---------- ---------

ALLEN        1600.00

WARD         1250.00

JONES        2975.00

MARTIN       1250.00

BLAKE        2850.00

CLARK        2450.00

SCOTT        3000.00

KING         5000.00

TURNER       1500.00

FORD         3000.00

MILLER       1300.00

11 rows selected

6、在表EMP中,列出所有WARD或者SMITH所在部门的员工姓名和部门号。

SQL> select ename,deptno from emp where deptno in(select deptno from emp  where ename='WARD' or ename='SMITH');

ENAME      DEPTNO

---------- ------

FORD           20

ADAMS          20

SCOTT          20

JONES          20

SMITH          20

JAMES          30

TURNER         30

BLAKE          30

MARTIN         30

WARD           30

ALLEN          30

11 rows selected

7、在表EMP中,列出工资低于销售人员(SALESMAN)的非销售员工姓名,职位和工资。

SQL> select ename,job,sal from emp where job!='SALESMAN' and sal<(select min(sal) from emp where job='SALESMAN');

ENAME      JOB             SAL

---------- --------- ---------

SMITH      CLERK        800.00

ADAMS      CLERK       1100.00

JAMES      CLERK        950.00

8、在表emp中,列出工资高于部门经理(MANAGER)的非经理员工姓名,职位和工资。

SQL> select ename,job,sal from emp where job!='MANAGER' and sal>any(select sal from emp where job='MANAGER');

ENAME      JOB             SAL

---------- --------- ---------

KING       PRESIDENT   5000.00

FORD       ANALYST     3000.00

SCOTT      ANALYST     3000.00

9、在表emp中,列出所有至少有一名下级职员的员工姓名和职位。

SQL> select ename,job from emp e where exists (select empno from emp where emp.mgr=e.empno);

ENAME      JOB

---------- ---------

JONES      MANAGER

BLAKE      MANAGER

CLARK      MANAGER

SCOTT      ANALYST

KING       PRESIDENT

FORD       ANALYST

6 rows selected

三、实验总结

跟以前学的查询一样,只是换了一个运用环境,所以不是很难。

实验八   视图、索引、序列和同义词

一、实验目的

1、掌握视图的创建及管理

2、掌握索引的创建及管理

3、掌握序列的创建及管理

4、掌握同义词的创建及管理

二、实验内容与过程

在hr用户下

SQL> alter user hr identified by hr123;

User altered

SQL> alter user hr account unlock;

User altered

SQL> conn hr/hr123;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as hr

1、建立部门人数的视图 DEP_VIEW

SQL> create or replace view em2(dep_id,counts) as select department_id,count(*) from employees group by department_id;

View created

2、建立部门人数、平均工资、最高工资的视图DEPV,列名分别为ECOU,EAVG,EMAX

SQL> CREATE VIEW DEPV(ECOUE,EAVG,EM) AS

  2     SELECT COUNT(*),AVG(SALARY),MAX(SALARY)

  3     FROM EMPLOYEES

  4     GROUP BY DEPARTMENT_ID;

View created

3、建立每个员工的姓名、所在部门名称及部门所在城市的视图,列名为NAME,DEPT,CITY

SQL> create view locations_view as select

  2  d.department_id, d.department_name, l.location_id, l.city from departments d,

  3  locations l  where d.location_id = l.location_id;

View created

4、查看用户定义的每个视图名称及对应的SQL命令。

DESC USER_VIEWS;

SELECT VIEW_NAME,TEXT FROM USER_VIEWS;

5、删除定义的所有视图

SQL> drop view depv;

View dropped

SQL> drop view em2;

View dropped

SQL> drop view locations_view;

View dropped

6、对LAST_NAME和FIRST_NAME建立唯一索引NAME。

SQL> CREATE TABLE BB (LAST_NAME CHAR(6), FIRST_NAME CHAR(6));

Table created

SQL> CREATE UNIQUE INDEX NAME ON BB(LAST_NAME, FIRST_NAME);

Index created

7、建立表TEST(NO n(2), name vc(10))定义序列NOS,序列值在1-4之间循环。

SQL> CREATE TABLE TEST (NO NUMBER(2), NAME VARCHAR2(10));

Table created

SQL> CREATE SEQUENCE NOS START WITH 1

  2  INCREMENT BY 1

  3  MAXVALUE 4

  4  NOCYCLE NOCACHE;

Sequence created

8、先向表TEST中用NOS插入5条记录,每插入一个查询表的内容。

SQL> INSERT INTO TEST VALUES(NOS.NEXTVAL,'电视机');

1 row inserted

SQL> select * from test;

 NO NAME

--- ----------

  1 电视机

SQL> INSERT INTO TEST VALUES(NOS.NEXTVAL,'洗衣机');

1 row inserted

SQL> select * from test;

 NO NAME

--- ----------

  1 电视机

  2 洗衣机

SQL> INSERT INTO TEST VALUES(NOS.NEXTVAL,'电脑');

1 row inserted

SQL> select * from test;

 NO NAME

--- ----------

  1 电视机

  2 洗衣机

  3 电脑

SQL> INSERT INTO TEST VALUES(NOS.NEXTVAL,'冰箱');

1 row inserted

SQL> select * from test;

 NO NAME

--- ----------

  1 电视机

  2 洗衣机

  3 电脑

  4 冰箱

5、显示NOS序列的当前值,下一个值及序列定义的最大值和最小值。

SQL> select sequence_name,min_value,max_value from user_sequences where sequence_name='NOS';

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE

------------------------------ ---------- ----------

NOS                                     1          4

6、为employees创建同义词em。

SQL> create synonym  em for hr.employees;

Synonym created

7、查询同义词em。

SQL>desc em

8、为employees创建一公共同义词ee。

SQL> conn system/manager;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

SQL> create public synonym ee for hr.employees;

Synonym created

三、实验总结

实验中仍然存在问题,例如“为employees创建一公共同义词ee“要在系统管理员帐户下,同时序列不时很懂。

实验九   SQL运算符

一、实验目的

1、掌握SQL运算符;

二、实验内容与过程

1、使用=运算符列出工资等于3000的职员的信息;

SQL> select ename,sal from scott.emp where sal=3000;

ENAME            SAL

---------- ---------

SCOTT        3000.00

FORD         3000.00

2、使用any运算符列出部门编号为20或30的职员名称及其部门编号;

SQL>  select ename,deptno from scott.emp where deptno=any(20,30);

ENAME      DEPTNO

---------- ------

SMITH          20

ALLEN          30

WARD           30

JONES          20

MARTIN         30

BLAKE          30

SCOTT          20

TURNER         30

ADAMS          20

JAMES          30

FORD           20

11 rows selected

3、使用all运算符列出其他部门中工资高于30号部门中所有人员工资的职员名称及其部门编号;

SQL> select ename,deptno from scott.emp where sal>all(select sal from scott.emp where deptno=30) and deptno<>30;

ENAME      DEPTNO

---------- ------

JONES          20

SCOTT          20

KING           10

FORD           20

4、在表emp中,以书面语言方式显示所有员工职务及工资;

SQL> Select ename || ' 工作是 ' || job from scott.emp;

ENAME||'工作是'||JOB

---------------------------

SMITH 工作是 CLERK

ALLEN 工作是 SALESMAN

WARD 工作是 SALESMAN

JONES 工作是 MANAGER

MARTIN 工作是 SALESMAN

BLAKE 工作是 MANAGER

CLARK 工作是 MANAGER

SCOTT 工作是 ANALYST

KING 工作是 PRESIDENT

TURNER 工作是 SALESMAN

ADAMS 工作是 CLERK

JAMES 工作是 CLERK

FORD 工作是 ANALYST

MILLER 工作是 CLERK

14 rows selected

5、使用成员运算符列出20和30号部门中的职员名称;

SQL> select ename,deptno from emp where deptno in(20,30);

ENAME      DEPTNO

---------- ------

SMITH          20

ALLEN          30

WARD           30

JONES          20

MARTIN         30

BLAKE          30

SCOTT          20

TURNER         30

ADAMS          20

JAMES          30

FORD           20

11 rows selected

6、使用成员运算符列出20和30号部门以外的所有部门的职员名称;

SQL> select ename,deptno from scott.emp where deptno not in(20,30);

ENAME      DEPTNO

---------- ------

CLARK          10

KING           10

MILLER         10

7、使用Between运算符,列出工资为1500~3000之间的职员姓名及实际工资;

SQL> select ename,sal from emp

  2  where sal between 1500 and 3000;

ENAME            SAL

---------- ---------

ALLEN        1600.00

JONES        2975.00

BLAKE        2850.00

CLARK        2450.00

SCOTT        3000.00

TURNER       1500.00

FORD         3000.00

7 rows selected

8、使用Between运算符,列出工资低于1500或高于3000的职员姓名及实际工资;

SQL> select ename,sal from emp

  2  where sal not between 1500 and 3000

  3  ;

ENAME            SAL

---------- ---------

SMITH         800.00

WARD         1250.00

MARTIN       1250.00

KING         5000.00

ADAMS        1100.00

JAMES         950.00

MILLER       1300.00

7 rows selected

9、查询员工奖金(comm),如果是null,输出时以0表示;

SQL> select ename,nvl(comm,0) from emp ;

ENAME      NVL(COMM,0)

---------- -----------

SMITH                0

ALLEN              300

WARD               500

JONES                0

MARTIN            1400

BLAKE                0

CLARK                0

SCOTT                0

KING                 0

TURNER               0

ADAMS                0

JAMES                0

FORD                 0

MILLER               0

14 rows selected

10、查询名称为W字符开头的职员名称;

SQL> select ename from emp

  2  where ename like'W%';

ENAME

----------

WARD

11、查询名称中包含COTT员工名称;

SQL> select ename from emp

  2  where ename like'%COTT';

ENAME

----------

SCOTT

12、查找字符串长度为5,并且以TT字符结尾的职员名称;

SQL> select ename from emp

  2  where ename like'___TT';

ENAME

----------

SCOTT

13、集合运算符

(1)列出工资高于2000的员工姓名,职位和工资;

SQL> Select  ename,job,sal from emp where sal>=2000;

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

SCOTT      ANALYST     3000.00

KING       PRESIDENT   5000.00

FORD       ANALYST     3000.00

6 rows selected

(2)列出部门经理的姓名,职位和工资;

SQL> Select ename,job,sal from emp where job='MANAGER';

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

使用UNION运算符

SQL> Select  ename,job,sal from emp where sal>=2000;

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

SCOTT      ANALYST     3000.00

KING       PRESIDENT   5000.00

FORD       ANALYST     3000.00

6 rows selected

UNION

SQL> Select ename,job,sal from emp where job='MANAGER';

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

使用UNION ALL

SQL> Select  ename,job,sal from emp where sal>=2000;

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

SCOTT      ANALYST     3000.00

KING       PRESIDENT   5000.00

FORD       ANALYST     3000.00

6 rows selected

UNION all

SQL> Select ename,job,sal from emp where job='MANAGER';

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

使用INTERSECT运算符

SQL> Select  ename,job,sal from emp where sal>=2000;

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

SCOTT      ANALYST     3000.00

KING       PRESIDENT   5000.00

FORD       ANALYST     3000.00

6 rows selected

INTERSECT

SQL> Select ename,job,sal from emp where job='MANAGER';

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

使用MINUS运算符

SQL> Select  ename,job,sal from emp where sal>=2000;

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

SCOTT      ANALYST     3000.00

KING       PRESIDENT   5000.00

FORD       ANALYST     3000.00

6 rows selected

MINUS

SQL> Select ename,job,sal from emp where job='MANAGER';

ENAME      JOB             SAL

---------- --------- ---------

JONES      MANAGER     2975.00

BLAKE      MANAGER     2850.00

CLARK      MANAGER     2450.00

三、实验总结

本次实验感觉很好,在执行的时候也没什么大问题。

实验十   PL/SQL语法基础

一、实验目的

1、掌握PL/SQL的顺序结构

2、掌握PL/SQL的选择结构

3、掌握PL/SQL的循环结构

二、实验内容与过程

1、完成教材P127页第1题。

declare

 v_empno scott.emp1.empno%type:=&v_empno;

gl int;

begin

select round((sysdate-hiredate)/365) into gl from scott.emp1

where empno=v_empno;

if gl>25 then

update emp1 set sal=sal*1.1 where empno=v_empno;

dbms_output.put_line('ok');

end if;

end;

执行结果为OK

2、完成教材P127页第2题。

declare

 v_empno emp1.empno%type:=&v_empno;

 v_ename emp1.ename%type;

begin

select ename into v_ename from emp1 where empno=v_empno and job='MANAGER';

dbms_output.put_line(v_ename);

end;

执行时输入员工号:7566执行结果为JONES

3、根据输入员工号,如果职务是CLERK提高工资1%,如果不是提高2%。

declare

 v_no emp1.empno%type:=&v_no;

 v_job emp1.job%type;

 begin

 select job into v_job from emp1

 where empno=v_no;

 if v_job='CLERK' then

 update emp1  set sal=sal*1.01  where empno=v_no;

 dbms_output.put_line('ok');

 else

 update emp1  set sal=sal*1.02   where empno=v_no;

 dbms_output.put_line('ok');

 end if;

 end;

输入员工号 7654执行结果为OK

4、显示20到50的平方根的值及它们的和。

DECLARE

    S FLOAT :=0;

BEGIN

    FOR  I  IN 20..50 LOOP

          DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQRT(I),'9.9999'));

       S:=S+SQRT(I);

    END LOOP;

    DBMS_OUTPUT.PUT_LINE('S=  '||TO_CHAR(S));

END;

执行结果为:

4.4721
 4.5826
 4.6904
 4.7958
 4.8990
 5.0000
 5.0990
 5.1962
 5.2915
 5.3852
 5.4772
 5.5678
 5.6569
 5.7446
 5.8310
 5.9161
 6.0000
 6.0828
 6.1644
 6.2450
 6.3246
 6.4031
 6.4807
 6.5574
 6.6332
 6.7082
 6.7823
 6.8557
 6.9282
 7.0000
 7.0711
S=  181.841958747100563088485447838885600426

三、实验总结

本次实验总体上做的不错,只是在第三题时忘记要复制表了,所以在执行的时候出了一点问题。

实验十一    游标

一、实验目的

1、掌握显示游标的创建及使用

二、实验内容及过程(提示:在用户Scott用户下完成)

1、用显示游标编写程序,程序的功能是查找对应的集合是表emp中所有的员工姓名。

declare

cursor c_ename is select ename from scott.emp;

 v_ename scott.emp.ename%type;

v_count binary_integer;

begin

select count(rowid) into v_count from scott.emp;

open c_ename;

for i in 1..v_count loop

fetch c_ename into v_ename;

dbms_output.put_line(v_ename);

end loop;

end;

调试后输出结果

SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

2、完成教材P149页第2题。

declare

 cursor gz  is

 select dname,avg(sal) from scott.dept,scott.emp

 where scott.dept.deptno=scott.emp.deptno

 group by dname;

 v_dname scott.dept.dname%type;

 v_sal scott.emp.sal%type;

 v_count binary_integer;

 begin

 select count(rowid) into v_count  from scott.dept;

 open gz;

 for i in 1..v_count loop

 fetch gz into v_dname,v_sal;

 dbms_output.put_line(v_dname||'平均工资是'||v_sal);

 end loop;

 end;

调试后输出结果

ACCOUNTING平均工资是2916.67
RESEARCH平均工资是2175
SALES平均工资是1566.67
SALES平均工资是1566.67

3、声明游标,对应的集合是表emp中根据输入员工号而确定的员工信息。(带参数的游标)

declare

 cursor c_emp(v_empno scott.emp.empno%type) is select ename from scott.emp where empno=v_empno;

 emp scott.emp.ename%type;

 begin

 open c_emp(7369); --如果动态的输入员工号如何做

 fetch c_emp into emp;

 DBMS_OUTPUT.PUT_LINE(emp);

 end;

调试后输出结果

SMITH

三、实验总结

对于游标而言,感觉不是很明白,而且不是很理解。

实验十二      函数

一、实验目的

1、掌握函数的创建及调用

二、实验内容与过程

1、定义函数,计算两个整数之和。

create or replace function jf(m in int,n in int)
return int as
begin
return m+n;
end;

declare
p number;
begin
p:=jf(10,55);
dbms_output.put_line(p);
end;

执行结果为:65

2、定义函数,根据输入员工号返回员工姓名。

create or replace function get_emp_by_empno(v_empno in emp.empno%type)
return emp%rowtype
as
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=v_empno;
return v_emp;
end;

declare
v_emp emp%rowtype;
begin
v_emp:=get_emp_by_empno(7788);
dbms_output.put_line(v_emp.ename);
end;

执行结果为:SCOTT

三、实验总结

只要理解了,总体上不是很难。

相关推荐