oracle学习

安装好后,重启电脑,否则连接可能出错。首先用管理员账户连接,账户sys密码change_on_install,使用

create user c##yuko identified by yuko;

grant connect,resource,dba to c##yuko;

来创建一个新用户,具有dba权限。必须加c##,否则创建失败。

alter user sys identified by yuko;

alter user system identified by yuko;

然后通过上述两条指令,修改重要账户的密码,不用加c##。

连接yuko数据库的时候账户需要输入c##yuko。

复杂对象的建立,比如

CREATE OR REPLACE
TYPE address_t AS OBJECT
(
street  varchar(100),
city    varchar(100),
province  varchar(100),
zip     varchar(20)
);

建立了一个地址对象,可以

create table address_table of address_t;

直接建立对应的表,也可以作为一个属性,对应表中一个值

create table test
(
username VARCHAR(30),
address address_t
);

对这个表里的复杂插入数据的时候,需要表明该属性的类型

insert into test values('lihua',address_t('as','asd','asd','asd'));

对这个属性进行操作的时候,需要给表起别名

SELECT a.address.street from test a;

ref的使用,ref相当于一个指针,但是无法从引用处修改,而是被引用的表变化时,引用的表跟着变化,其实就是引用表里的属性指向被引用的表的属性的地址。

create table test2
(
username VARCHAR(30),
addressref ref address_t
);

这样建立一个引用,插入数据时必须从被引用的表里取出数据

insert into test2 values('lihuaaa',(SELECT ref(a) from ADDRESS_TABLE a where street='as'));

这样就建立了关系,如果从引用表修改,是不成功的

update test2 a set a.addressref.city='tokyo' where a.username='lihuaaa';

但是可以从原表修改

update ADDRESS_TABLE a set city='tokyo' where a.street='as'; 

这样对应的表的数据也被修改。

聚集类型(汇集类型)

n数组类型(array)

相同类型元素的有序集合。

示例:人名数组(Annie, Bob, Jerry, Tom)

n集合类型(setof)关系类型

相同类型元素的无序集合,一个成员最多只能出现一次。

示例:课程(MATHS,PHYSICS,OS,DB)

 

 

下面是一个使用oracle完成简单图书馆里系统,包含复杂对象,多值对象,引用表,方法。

 

 

实验1:针对某一应用(至少涉及到复合属性、多值属性,属性数据类型可能是自定义类型),做如下工作:

(1)设计概念数据库(EER)

(2) 用关系模型设计逻辑结构

(3)设计对象类型、方法以及建立对象表,包括对象引用类型、数组、嵌套表等。

(4)设计插入、修改、删除、查询操作,10个以上。

(5)用ORACLE实现(3)、(4),并把命令和结果放报告中

图书管理系统

本系统为图书管理系统,用户可通过本系统对图书馆的藏书进行借阅。

  • 概念数据库设计(EER)

1、实体联系图:

oracle学习_第1张图片

 

图1 实体联系图

2、图书管理系统实体及所辖属性定义表

序号

实体名

所辖属性

主码

1

借阅人(Stu)

学号、姓名、专业、年级、已借阅书籍、手机号

学号

2

图书(Book)

编号、书名、状态、出版社、作者

编号

3

借阅单(Record)

编号、图书编号、借书人学号、借阅日期、还书日期

编号

  • 关系模型设计逻辑结构

1、借阅人表 Stu

表1 学生基本信息表

列名

数据类型

是否可为空

数据说明

stuNo

varchar(20)

NOT NULL

学号,主键

stuName

varchar(30)

NULL

学生名

major

varchar(50)

NULL

专业

grade

varchar(3)

NULL

年级

phone

varchar(100)

NULL

手机号

borrowBook1

varchar(50)

NULL

已借图书1

borrowBook2

varchar(50)

NULL

已借图书2

borrowBook3

varchar(50)

NULL

已借图书3

2、图书表 Book

表2 图书基本信息表

列名

数据类型

是否可为空

数据说明

id

varchar(30)

NOT NULL

图书编号,主键

bookName

varchar(50)

NULL

图书名称

statu

varchar(2)

NULL

图书借阅状态

publish

varchar(50)

NULL

出版社

author

varchar(20)

NULL

作者

3、借阅单表 Record

表3 借阅单基本信息表

列名

数据类型

是否可为空

数据说明

id

varchar(50)

NOT NULL

借阅编号,主键

stuNo

varchar(30)

NOT NULL

借阅人学号

bookId

varchar(30)

NULL

图书编号

borrowDate

date

NULL

借阅日期

returnDate

date

NULL

还书日期

  • 对象类型、方法及建立对象表

1、对象类型及方法

针对本系统,建立类型如下:

类型名称

类型说明

类型含义

address_t

对象类型

表示地址信息

phone_list_t

数组类型

存储多部电话号码

user_t

对象类型

定义用户对象表

commodity_t

对象类型

定义商品对象表

line_item_t

对象类型

定义嵌套表结构

line_item_list_t

嵌套表类型

存储订单商品信息

purchase_t

对象类型

定义订单对象表

delivery_t

对象类型

定义快递对象表

具体定义实现如下:

(1)建立表示图书的对象类型

create or replace type book as object

(

id    varchar(30),

bookName   varchar(50),

statu      varchar(2),

publish  varchar(50),

author   varchar(20)

);

(2)建立一个多值对象,其中每一个值都是对book对象的引用

create or replace type borrowBook AS VARRAY(5) OF REF book;

(3)建立学生对象类型

create or replace type stu as object

(

stuNo    varchar(20),       

stuName      varchar(30),

major    varchar(50),

grade     varchar(3),         

phone   varchar(100),

borrowBooks borrowBook

);

(4)建立日期对象类型

create or replace type dateob as object

(

borrowDate  date,     

returnDate   date,

member function gettime return VARCHAR2

);

CREATE OR REPLACE TYPE BODY dateob

AS

    member function gettime return VARCHAR2

    IS

      time VARCHAR2(100);

    BEGIN

      time := '借书时间:'||to_char(borrowDate,'yyyy-mm-dd')||' '||'还书时间:'||to_char(returnDate,'yyyy-mm-dd');

      return time;

    END gettime;

END;

(5)建立借阅图书记录对象类型

create or replace type record as object

(

id    varchar(50),

stuNo    varchar(30),

book_ref ref book,

date_ob dateob

);

2、建立对象表

(1)建立图书表

create table book_t of Book

(id primary key);

 

(2)建立学生表

create table stu_t of stu

(stuNo primary key);

 

(3)建立借阅图书记录表

create table record_t of record

(id primary key);

 

 

数据表创建结果:

 

3、插入、修改、删除、查询操作

(1)向图书表中插入数据

insert into book_t values(book('1','gone with the wind','1','publisher','Margaret Mitchell'));

insert into book_t values(book('2','OS','1','publisher','author'));

insert into book_t values('3','Oracle','no','Springer','Author');

insert into book_t values('4','MatrixAnalysis','no','Levine','Author');

insert into book_t values('5','诡秘之主','no','起点','爱潜水的乌贼');

insert into book_t values('6','雪中悍刀行','no','起点','烽火戏诸侯');

insert into book_t values('7','PRML','no','Springer','Bishop');

insert into book_t values('8','Harrypoter','no','Levine','JKRowling');

 

(2)向stu_t中插入数据

insert into stu_t values('Z19070032','zhuangzihao','computer','y1','12345678910',borrowBook((select ref(a) from book_t a where id='1'),(select ref(a) from book_t a where id='2')));

 

insert into stu_t values('1','lisa','math','2','17660448080',borrowBook((select ref(a) from book_t a where id='1'),(select ref(a) from book_t a where id='3')));

 

(3)查询学号为1的学生所借图书

SELECT * FROM table(SELECT borrowBooks from stu_t  where stuNo='Z19070032');

 

(4)将记录表中插入数据

insert into record_t values('1','Z19070032',(select ref(b) from book_t b where id='1'),dateob(to_date('2019-07-05','yyyy-mm-dd'),to_date('2019-10-05','yyyy-mm-dd')));

INSERT INTO record_t VALUES('2','1',(select ref(a) from book_t a where id='1'),dateob(to_date('20191014','yyyymmdd'),to_date('20191030','yyyymmdd')))

 

 

(5)查询还书日期

select r.date_ob.returnDate from record_t r where stuNo='1';

 

(6)查询学号为1的学生借书时长

select ROUND(TO_NUMBER(r.date_ob.returnDate - r.date_ob.borrowDate)) from record_t r where stuNo='1';

 

(7)学号为‘2’的学生学号改为‘4’

update  stu_t set stuNo='4' where stuNo='2';

 

(8)把图书作者为‘Bishop’的图书作者改为‘jiang’

update  book_t set author='jiang' where author='Bishop';

 

 

(9)查询出版社为起点的图书

SELECT * FROM book_t t WHERE publish='起点';

 

(10)删除图书表中id为3的图书信息

delete from book_t where id=3;

(11)调用创建的函数输出日期

CREATE OR REPLACE

PROCEDURE "test" AS

time dateob;

reDate date;

boDate date;

BEGIN

       -- routine body goes here, e.g.

        select r.date_ob.returnDate into reDate from RECORD_T r where id='1';

select r.date_ob.borrowDate into boDate from RECORD_T r where id='1';

time:=dateob(boDate,reDate);

dbms_output.put_line(time.gettime);

END;

 

 

你可能感兴趣的:(oracle学习)