面向对象数据库设计与应用 03
一、實(shí)驗(yàn)?zāi)康?/strong>
本實(shí)驗(yàn)側(cè)重點(diǎn)在于,要求掌握面向?qū)ο髷?shù)據(jù)表的創(chuàng)建,其中也包括對(duì)數(shù)據(jù)類(lèi)型的創(chuàng)建,以及插入記錄的命令的熟練運(yùn)用;
掌握整個(gè)面向?qū)ο髷?shù)據(jù)庫(kù)在ORACLE中的設(shè)計(jì)和創(chuàng)建流程,把握實(shí)驗(yàn)過(guò)程中的關(guān)鍵細(xì)節(jié),掌握面向?qū)ο髷?shù)據(jù)庫(kù)在ORACLE中記錄插入的兩種方法;
總而言之,就是要求掌握數(shù)據(jù)表類(lèi)型和數(shù)據(jù)表對(duì)象創(chuàng)建句柄的基本使用方法,熟練運(yùn)用記錄插入的命令,并能初步了解ORACLE函數(shù)的基本創(chuàng)建過(guò)程。
二、實(shí)驗(yàn)內(nèi)容
實(shí)驗(yàn)背景導(dǎo)入:
公司已經(jīng)完成數(shù)據(jù)庫(kù)的創(chuàng)建工作,接下來(lái)要求數(shù)據(jù)庫(kù)管理員對(duì)照在邏輯設(shè)計(jì)階段中對(duì)模式劃分的文檔與參考數(shù)據(jù)字典進(jìn)行數(shù)據(jù)表的創(chuàng)建,根據(jù)進(jìn)度要求完成下列需求:
① 模式的創(chuàng)建。在創(chuàng)建數(shù)據(jù)表之前,考慮到為了更好的去管理整個(gè)數(shù)據(jù)庫(kù),首先要進(jìn)行模式的創(chuàng)建。
② 數(shù)據(jù)表的創(chuàng)建。創(chuàng)建模式后,對(duì)應(yīng)數(shù)據(jù)庫(kù)的設(shè)計(jì)OOM文檔與數(shù)據(jù)字典在該模式下進(jìn)行數(shù)據(jù)類(lèi)型與數(shù)據(jù)表的創(chuàng)建。分別為會(huì)員信息表,商品類(lèi)別表,商品信息表、員工信息表、支付方式表、訂單信息表、訂單立詳情表的創(chuàng)建。
③ 對(duì)于上述建好的數(shù)據(jù)表,每張表需添加兩條以上的記錄。
出于對(duì)結(jié)構(gòu)模式明細(xì)設(shè)計(jì)的需要,在實(shí)驗(yàn)一中,將User抽象為一個(gè)超類(lèi)型對(duì)象,并且下級(jí)繼承屬性的子類(lèi)對(duì)象有:會(huì)員、商家和管理員。本實(shí)驗(yàn)綜合設(shè)計(jì)的反復(fù)性和在應(yīng)用中的算法復(fù)雜性等需求因素,現(xiàn)將OR模式調(diào)整如下:
三、實(shí)驗(yàn)平臺(tái)
軟件:WORD、ORACLE
四、實(shí)驗(yàn)步驟
① 模式的創(chuàng)建。
先創(chuàng)建用戶,再使用CREATE SCHEMA AUTHORIZATION命令,可直接授權(quán)給該用戶。
圖4-1 創(chuàng)建用戶并授權(quán)
② 數(shù)據(jù)表的創(chuàng)建。
使用CREATE TYPE命令進(jìn)行類(lèi)型的創(chuàng)建,并且使用CREATE TABLE命令創(chuàng)建數(shù)據(jù)表。
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"時(shí)"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;
③ 對(duì)于上述建好的數(shù)據(jù)表,每張表需使用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','喜歡吃臭豆腐','男','導(dǎo)師');
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','喜歡吃臭豆腐','男','學(xué)生');
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'),'北京八達(dá)嶺','1109635','53425223','98','銷(xiāo)售部門(mén)','男','北京嶺科技有限公司');
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','豆?jié){',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','豆?jié){',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', '豆?jié){', '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')));
五、運(yùn)行結(jié)果
① 模式的創(chuàng)建。
圖5-1 用戶模式創(chuàng)建成功
② 數(shù)據(jù)表的創(chuàng)建。
圖5-2 數(shù)據(jù)表創(chuàng)建成功
圖5-3 獲取時(shí)間函數(shù)執(zhí)行成功
③ 添加記錄。
圖5-4 插入數(shù)據(jù)記錄成功
六、實(shí)驗(yàn)總結(jié)
通過(guò)實(shí)驗(yàn),相關(guān)的總結(jié)和經(jīng)驗(yàn)收獲,可分點(diǎn)總結(jié)如下:
通過(guò)本實(shí)驗(yàn),已初步掌握了面向?qū)ο髷?shù)據(jù)表的創(chuàng)建方法,并且對(duì)數(shù)據(jù)類(lèi)型的創(chuàng)建也有了一定的自我理解;
本實(shí)驗(yàn)過(guò)程中遇到的問(wèn)題比前兩次都要多,例如:在對(duì)象數(shù)據(jù)庫(kù)插入數(shù)據(jù)時(shí)提示,ORA-00984列在此處不允許的錯(cuò)誤,而我的解決辦法首先就是檢查字段的數(shù)據(jù)類(lèi)型是否匹配,之所以會(huì)出現(xiàn)這種問(wèn)題的原因就是,在插入字符或字符串型字段時(shí),如果插入的數(shù)據(jù)是純數(shù)字,則不會(huì)有錯(cuò)誤;但是如果出現(xiàn)字符,就會(huì)報(bào)ORA-00984列在此處不允許異常;
對(duì)于字符型字段,在插入數(shù)據(jù)時(shí)最好在字段值兩端加上單引號(hào),就可以很好的避免ORA-00984錯(cuò)誤;
在實(shí)驗(yàn)的記錄插入過(guò)程中,發(fā)現(xiàn)對(duì)于對(duì)象數(shù)據(jù)庫(kù)的記錄插入可以有多種方法,而對(duì)于引用類(lèi)型的字段,在賦值時(shí)需得使用類(lèi)似于“(select ref(a) from RD_Order_detailss a where ORDER_DETAILS_ID='0001')”的句型,將其認(rèn)為是該字段的內(nèi)容;等。
總結(jié)
以上是生活随笔為你收集整理的面向对象数据库设计与应用 03的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 侄女和外甥女是怎么区分的
- 下一篇: 如何在不拔掉网线的情况下给电脑断网电脑如