安装好后,重启电脑,否则连接可能出错。首先用管理员账户连接,账户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),并把命令和结果放报告中
图书管理系统
本系统为图书管理系统,用户可通过本系统对图书馆的藏书进行借阅。
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;