一、实验目的
- 本实验侧重点在于,要求掌握面向对象数据表的创建,其中也包括对数据类型的创建,以及插入记录的命令的熟练运用;
- 掌握整个面向对象数据库在ORACLE中的设计和创建流程,把握实验过程中的关键细节,掌握面向对象数据库在ORACLE中记录插入的两种方法;
总而言之,就是要求掌握数据表类型和数据表对象创建句柄的基本使用方法,熟练运用记录插入的命令,并能初步了解ORACLE函数的基本创建过程。
二、实验内容
实验背景导入:
公司已经完成数据库的创建工作,接下来要求数据库管理员对照在逻辑设计阶段中对模式划分的文档与参考数据字典进行数据表的创建,根据进度要求完成下列需求:
① 模式的创建。在创建数据表之前,考虑到为了更好的去管理整个数据库,首先要进行模式的创建。
② 数据表的创建。创建模式后,对应数据库的设计OOM文档与数据字典在该模式下进行数据类型与数据表的创建。分别为会员信息表,商品类别表,商品信息表、员工信息表、支付方式表、订单信息表、订单立详情表的创建。
③ 对于上述建好的数据表,每张表需添加两条以上的记录。
出于对结构模式明细设计的需要,在实验一中,将User抽象为一个超类型对象,并且下级继承属性的子类对象有:会员、商家和管理员。本实验综合设计的反复性和在应用中的算法复杂性等需求因素,现将OR模式调整如下:
三、实验平台
软件:WORD、ORACLE
四、实验步骤
① 模式的创建。
先创建用户,再使用CREATE SCHEMA AUTHORIZATION命令,可直接授权给该用户。
图4-1 创建用户并授权
② 数据表的创建。
使用CREATE TYPE命令进行类型的创建,并且使用CREATE TABLE命令创建数据表。
create or replace type RD_Member as object( Member_ID varchar(11), Member_Password varchar(50), Member_name varchar(11), Birth date, Address varchar(20), Mobile varchar(11), WeChat varchar(11), Reputation varchar(15), Hobby varchar(50), Sex varchar(20), Jobe varchar(30)); create or replace type RD_Employee as object( Employee_ID varchar(11), Employee_Password varchar(50), Employee_name varchar(11), Birth date, Address varchar(20), Mobile varchar(11), WeChat varchar(11), Reputation varchar(15), department varchar(50), Sex varchar(20), company varchar(30) ); create or replace type RD_Payment_type as object( Payment_type_ID varchar(11), Payment_type varchar(11) ); create or replace type RD_Commodity_type as object( Commodity_type_ID varchar(11), status varchar(10), Commodity_type varchar(10) ); create or replace type RD_Good as object( Good_ID varchar(11), Discount varchar(5), Goods varchar(100), Unit_Price number, Purchase_Date varchar(10), Good_type ref RD_Commodity_type ); create or replace type RD_Order_details as object( Order_details_id varchar(11), Order_details varchar(11), Good_info ref RD_Good, Payment_type_info ref RD_Payment_type, Employee_info ref RD_Employee, Member_info ref RD_Member); create or replace type RD_Order as object( Order_ID varchar(11), Goods_Number number, Total_price number, Setup_time varchar(20), Order_details ref RD_Order_details); CREATE OR REPLACE FUNCTION cur_datetime RETURN VARCHAR IS BEGIN RETURN TO_CHAR(sysdate, ‘YYYY"年"MM"月"DD"日"HH24"时"MI"分"SS"秒"‘); END; create or replace function Calculated_price(para1 in number, para2 in number) return number as begin if para1 > para2 then return para1; else return para2; end if; end Calculated_price; create or replace FUNCTION login RETURN VARCHAR2 IS BEGIN RETURN TO_CHAR(‘用户已登录!!‘); END;
create table RD_Commodity_types OF RD_Commodity_type;
create table RD_Goods of RD_Good;
create table RD_Payment_types of RD_Payment_type;
create table RD_Employees of RD_Employee;
create table RD_Members of RD_Member;
create table RD_Order_detailss of RD_Order_details;
create table RD_Orders of RD_Order;
③ 对于上述建好的数据表,每张表需使用INSERT INTO命令添加两条以上的记录。
Insert into C##RD.RD_MEMBERS (MEMBER_ID,MEMBER_PASSWORD,MEMBER_NAME,BIRTH,ADDRESS,MOBILE,WECHAT,REPUTATION,HOBBY,SEX,JOBE) values (‘0001‘,‘123456‘,‘昊哥‘,to_date(‘18-11月-19‘,‘DD-MON-RR‘),‘广西南宁‘,‘1008611‘,‘10010‘,‘100‘,‘喜欢吃臭豆腐‘,‘男‘,‘导师‘); Insert into C##RD.RD_MEMBERS (MEMBER_ID,MEMBER_PASSWORD,MEMBER_NAME,BIRTH,ADDRESS,MOBILE,WECHAT,REPUTATION,HOBBY,SEX,JOBE) values (‘0002‘,‘123456‘,‘小弟‘,to_date(‘18-11月-19‘,‘DD-MON-RR‘),‘广西藤县‘,‘10010‘,‘1008611‘,‘100‘,‘喜欢吃臭豆腐‘,‘男‘,‘学生‘); Insert into C##RD.RD_EMPLOYEES (EMPLOYEE_ID,EMPLOYEE_PASSWORD,EMPLOYEE_NAME,BIRTH,ADDRESS,MOBILE,WECHAT,REPUTATION,DEPARTMENT,SEX,COMPANY) values (‘0001‘,‘123456‘,‘张三‘,to_date(‘03-3月 -19‘,‘DD-MON-RR‘),‘北京八达岭‘,‘1109635‘,‘53425223‘,‘98‘,‘销售部门‘,‘男‘,‘北京岭科技有限公司‘); Insert into C##RD.RD_EMPLOYEES (EMPLOYEE_ID,EMPLOYEE_PASSWORD,EMPLOYEE_NAME,BIRTH,ADDRESS,MOBILE,WECHAT,REPUTATION,DEPARTMENT,SEX,COMPANY) values (‘0002‘,‘123456‘,‘李四‘,to_date(‘03-3月 -19‘,‘DD-MON-RR‘),‘杭州西湖边‘,‘1109635‘,‘53425223‘,‘98‘,‘作坊‘,‘男‘,‘西湖臭豆腐西施作坊‘); Insert into RD_PAYMENT_TYPES (PAYMENT_TYPE_ID,PAYMENT_TYPE) values (‘0001‘,‘支付宝‘); Insert into RD_PAYMENT_TYPES (PAYMENT_TYPE_ID,PAYMENT_TYPE) values (‘0002‘,‘微信‘); Insert into RD_COMMODITY_TYPES (COMMODITY_TYPE_ID,STATUS,COMMODITY_TYPE) values (‘0001‘,‘1‘,‘推荐‘); Insert into RD_COMMODITY_TYPES (COMMODITY_TYPE_ID,STATUS,COMMODITY_TYPE) values (‘0002‘,‘0‘,‘推荐‘); Insert into C##RD.RD_GOODS (GOOD_ID,DISCOUNT,GOODS,UNIT_PRICE,PURCHASE_DATE,GOOD_TYPE) values (‘0001‘,‘0.8‘,‘豆浆‘,23.5,‘2017-32-23‘, (select ref(a) from RD_COMMODITY_TYPES a where COMMODITY_TYPE_ID=‘0001‘)); Insert into C##RD.RD_GOODS (GOOD_ID,DISCOUNT,GOODS,UNIT_PRICE,PURCHASE_DATE,GOOD_TYPE) values (‘0002‘,‘0.8‘,‘豆浆‘,23.5,‘2017-32-23‘, (select ref(a) from RD_COMMODITY_TYPES a where COMMODITY_TYPE_ID=‘0001‘)); INSERT INTO RD_GOODS VALUES (RD_GOOD(‘0003‘, ‘0.8‘, ‘豆浆‘, ‘23.5‘, ‘2017-32-23‘, (select ref(a) from RD_COMMODITY_TYPES a where COMMODITY_TYPE_ID=‘0001‘))); Insert into C##RD.RD_ORDER_DETAILSS (ORDER_DETAILS_ID,ORDER_DETAILS,GOOD_INFO,PAYMENT_TYPE_INFO,EMPLOYEE_INFO,MEMBER_INFO) values (‘0001‘,‘es‘,(select ref(a) from RD_Goods a where GOOD_ID=‘0001‘),(select ref(a) from RD_PAYMENT_TYPES a where PAYMENT_TYPE_ID=‘0001‘),(select ref(a) from RD_EMPLOYEES a where EMPLOYEE_ID=‘0001‘),(select ref(a) from RD_MEMBERS a where MEMBER_ID=‘0001‘)); Insert into C##RD.RD_ORDER_DETAILSS (ORDER_DETAILS_ID,ORDER_DETAILS,GOOD_INFO,PAYMENT_TYPE_INFO,EMPLOYEE_INFO,MEMBER_INFO) values (‘0002‘,‘es‘,(select ref(a) from RD_Goods a where GOOD_ID=‘0001‘),(select ref(a) from RD_PAYMENT_TYPES a where PAYMENT_TYPE_ID=‘0001‘),(select ref(a) from RD_EMPLOYEES a where EMPLOYEE_ID=‘0001‘),(select ref(a) from RD_MEMBERS a where MEMBER_ID=‘0001‘)); Insert into C##RD.RD_ORDERS (ORDER_ID,GOODS_NUMBER,TOTAL_PRICE,SETUP_TIME,ORDER_DETAILS) VALUES (‘0001‘,4,23,‘2017-23-07‘,(select ref(a) from RD_Order_detailss a where ORDER_DETAILS_ID=‘0001‘)); INSERT INTO RD_ORDERS VALUES (RD_ORDER(‘0002‘,4,23,‘2017-23-07‘,(select ref(a) from RD_Order_detailss a where ORDER_DETAILS_ID=‘0001‘)));
五、运行结果
① 模式的创建。
图5-1 用户模式创建成功
② 数据表的创建。
图5-2 数据表创建成功
图5-3 获取时间函数执行成功
③ 添加记录。
图5-4 插入数据记录成功
六、实验总结
通过实验,相关的总结和经验收获,可分点总结如下:
- 通过本实验,已初步掌握了面向对象数据表的创建方法,并且对数据类型的创建也有了一定的自我理解;
- 本实验过程中遇到的问题比前两次都要多,例如:在对象数据库插入数据时提示,ORA-00984列在此处不允许的错误,而我的解决办法首先就是检查字段的数据类型是否匹配,之所以会出现这种问题的原因就是,在插入字符或字符串型字段时,如果插入的数据是纯数字,则不会有错误;但是如果出现字符,就会报ORA-00984列在此处不允许异常;
- 对于字符型字段,在插入数据时最好在字段值两端加上单引号,就可以很好的避免ORA-00984错误;
- 在实验的记录插入过程中,发现对于对象数据库的记录插入可以有多种方法,而对于引用类型的字段,在赋值时需得使用类似于“(select ref(a) from RD_Order_detailss a where ORDER_DETAILS_ID=‘0001‘)”的句型,将其认为是该字段的内容;等。