一、實驗目的
- 本實驗側重點在於,要求掌握面向對象數據表的創建,其中也包括對數據類型的創建,以及插入記錄的命令的熟練運用;
- 掌握整個面向對象數據庫在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')”的句型,將其認為是該字段的內容;等。