实验4:对象管理
实验目的:
了解Oracle表和视图的概念,学习使用SQL语句Create Table创建表,学习Select语句插入,修改,删除以及查询数据,学习使用SQL语句创建视图,学习部分存储过程和触发器的使用。
实验场景:
假设有一个生产某个产品的单位,单位接受网上订单进行产品的销售。通过实验模拟这个单位的部分信息:员工表,部门表,订单表,订单详单表。
用户名:shuijingyelong_1下完成实验
实验内容:
录入数据:
要求至少有1万个订单,每个订单至少有4个详单。至少有两个部门,每个部门至少有1个员工,其中只有一个人没有领导,一个领导至少有一个下属,并且它的下属是另一个人的领导(比如A领导B,B领导C)。
序列的应用
插入ORDERS和ORDER_DETAILS 两个表的数据时,主键ORDERS.ORDER_ID, ORDER_DETAILS.ID的值必须通过序列SEQ_ORDER_ID和SEQ_ORDER_ID取得,不能手工输入一个数字。
触发器的应用:
维护ORDER_DETAILS的数据时(insert,delete,update)要同步更新ORDERS表订单应收货款ORDERS.Trade_Receivable的值。
查询数据:
1.查询某个员工的信息
2.递归查询某个员工及其所有下属,子下属员工。
3.查询订单表,并且包括订单的订单应收货款: Trade_Receivable= sum(订单详单表.ProductNum*订单详单表.ProductPrice)- Discount。
4.查询订单详表,要求显示订单的客户名称和客户电话,产品类型用汉字描述。
5.查询出所有空订单,即没有订单详单的订单。
6.查询部门表,同时显示部门的负责人姓名。
7.查询部门表,统计每个部门的销售总金额。
(一).开始建表
1. 为用户shuijingyelong_1授权
alter user shuijingyelong_1 quota unlimited on USERS001;
grant alter tablespace to shuijingyelong_1;
grant create tablespace to shuijingyelong_1;
2. 在shuijingyelong_1下建立表空间USERS001和USERS002
Create Tablespace USERS001
datafile
'/home/oracle/app/oracle/oradata/orcl/pdborcl/pdbtest_users001_1.dbf'
SIZE 100M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED,
'/home/oracle/app/oracle/oradata/orcl/pdborcl/pdbtest_users001_2.dbf'
SIZE 100M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
Create Tablespace USERS002
datafile
'/home/oracle/app/oracle/oradata/orcl/pdborcl/pdbtest_users002_1.dbf'
SIZE 100M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED,
'/home/oracle/app/oracle/oradata/orcl/pdborcl/pdbtest_users002_2.dbf'
SIZE 100M AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
3. 查看建立的表空间USERS001和USERS002
SELECT
*
FROM dba_tablespaces;
4. USERS001创建表DEPARTMENTS
CREATE TABLE DEPARTMENTS
(
DEPARTMENT_ID NUMBER(6, 0) NOT NULL
, DEPARTMENT_NAME VARCHAR2(40 BYTE) NOT NULL
, CONSTRAINT DEPARTMENTS_PK PRIMARY KEY
(
DEPARTMENT_ID
)
USING INDEX
(
CREATE UNIQUE INDEX DEPARTMENTS_PK ON DEPARTMENTS (DEPARTMENT_ID ASC)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL
)
ENABLE
)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS NO INMEMORY NOPARALLEL;
5. 创建表EMPLOYEES
CREATE TABLE EMPLOYEES
(
EMPLOYEE_ID NUMBER(6, 0) NOT NULL
, NAME VARCHAR2(40 BYTE) NOT NULL
, EMAIL VARCHAR2(40 BYTE)
, PHONE_NUMBER VARCHAR2(40 BYTE)
, HIRE_DATE DATE NOT NULL
, SALARY NUMBER(8, 2)
, MANAGER_ID NUMBER(6, 0)
, DEPARTMENT_ID NUMBER(6, 0)
, PHOTO BLOB
, CONSTRAINT EMPLOYEES_PK PRIMARY KEY
(
EMPLOYEE_ID
)
USING INDEX
(
CREATE UNIQUE INDEX EMPLOYEES_PK ON EMPLOYEES (EMPLOYEE_ID ASC)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL
)
ENABLE
)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS
NO INMEMORY
NOPARALLEL
LOB (PHOTO) STORE AS SYS_LOB0000092017C00009$$
(
ENABLE STORAGE IN ROW
CHUNK 8192
NOCACHE
NOLOGGING
TABLESPACE USERS001
STORAGE
(
INITIAL 106496
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
);
CREATE INDEX EMPLOYEES_INDEX1_NAME ON EMPLOYEES (NAME ASC)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT EMPLOYEES_FK1 FOREIGN KEY
(
DEPARTMENT_ID
)
REFERENCES DEPARTMENTS
(
DEPARTMENT_ID
)
ENABLE;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT EMPLOYEES_FK2 FOREIGN KEY
(
MANAGER_ID
)
REFERENCES EMPLOYEES
(
EMPLOYEE_ID
)
ON DELETE SET NULL ENABLE;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT EMPLOYEES_CHK1 CHECK
(SALARY>0)
ENABLE;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT EMPLOYEES_CHK2 CHECK
(EMPLOYEE_ID<>MANAGER_ID)
ENABLE;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT EMPLOYEES_EMPLOYEE_MANAGER_ID CHECK
(MANAGER_ID<>EMPLOYEE_ID)
ENABLE;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT EMPLOYEES_SALARY CHECK
(SALARY>0)
ENABLE;
6. 创建表PRODUCTS
CREATE TABLE PRODUCTS
(
PRODUCT_NAME VARCHAR2(40 BYTE) NOT NULL
, PRODUCT_TYPE VARCHAR2(40 BYTE) NOT NULL
, CONSTRAINT PRODUCTS_PK PRIMARY KEY
(
PRODUCT_NAME
)
ENABLE
)
LOGGING
TABLESPACE "USERS001"
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
);
ALTER TABLE PRODUCTS
ADD CONSTRAINT PRODUCTS_CHK1 CHECK
(PRODUCT_TYPE IN ('耗材', '手机', '电脑'))
ENABLE;
7. 创建表ORDERS
CREATE TABLE ORDERS
(
ORDER_ID NUMBER(10, 0) NOT NULL
, CUSTOMER_NAME VARCHAR2(40 BYTE) NOT NULL
, CUSTOMER_TEL VARCHAR2(40 BYTE) NOT NULL
, ORDER_DATE DATE NOT NULL
, EMPLOYEE_ID NUMBER(6, 0) NOT NULL
, DISCOUNT NUMBER(8, 2) DEFAULT 0
, TRADE_RECEIVABLE NUMBER(8, 2) DEFAULT 0
)
TABLESPACE USERS001
PCTFREE 10
INITRANS 1
STORAGE
(
BUFFER_POOL DEFAULT
)
NOCOMPRESS
NOPARALLEL
PARTITION BY RANGE (ORDER_DATE)
(
PARTITION PARTITION_BEFORE_2016 VALUES LESS THAN (TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 8388608
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS NO INMEMORY
, PARTITION PARTITION_BEFORE_2017 VALUES LESS THAN (TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
NOLOGGING
TABLESPACE USERS002
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 8388608
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS NO INMEMORY
);
--创建本地分区索引ORDERS_INDEX_DATE:
CREATE INDEX ORDERS_INDEX_DATE ON ORDERS (ORDER_DATE ASC)
LOCAL
(
PARTITION PARTITION_BEFORE_2016
TABLESPACE USERS001
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 8388608
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS
, PARTITION PARTITION_BEFORE_2017
TABLESPACE USERS002
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 8388608
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOCOMPRESS
)
STORAGE
(
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX ORDERS_INDEX_CUSTOMER_NAME ON ORDERS (CUSTOMER_NAME ASC)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE UNIQUE INDEX ORDERS_PK ON ORDERS (ORDER_ID ASC)
GLOBAL PARTITION BY HASH (ORDER_ID)
(
PARTITION INDEX_PARTITION1 TABLESPACE USERS001
NOCOMPRESS
, PARTITION INDEX_PARTITION2 TABLESPACE USERS002
NOCOMPRESS
)
NOLOGGING
TABLESPACE USERS001
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE ORDERS
ADD CONSTRAINT ORDERS_PK PRIMARY KEY
(
ORDER_ID
)
USING INDEX ORDERS_PK
ENABLE;
ALTER TABLE ORDERS
ADD CONSTRAINT ORDERS_FK1 FOREIGN KEY
(
EMPLOYEE_ID
)
REFERENCES EMPLOYEES
(
EMPLOYEE_ID
)
ENABLE;
8. 创建表ORDER_DETAILS
CREATE TABLE ORDER_DETAILS
(
ID NUMBER(10, 0) NOT NULL
, ORDER_ID NUMBER(10, 0) NOT NULL
, PRODUCT_NAME VARCHAR2(40 BYTE) NOT NULL
, PRODUCT_NUM NUMBER(8, 2) NOT NULL
, PRODUCT_PRICE NUMBER(8, 2) NOT NULL
, CONSTRAINT ORDER_DETAILS_PK PRIMARY KEY
(
ID
)
USING INDEX
(
CREATE UNIQUE INDEX ORDER_DETAILS_PK ON ORDER_DETAILS (ID ASC)
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 2
STORAGE
(
BUFFER_POOL DEFAULT
)
NOPARALLEL
)
ENABLE
)
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 1
STORAGE
(
BUFFER_POOL DEFAULT
)
NOCOMPRESS
NO INMEMORY
NOPARALLEL;
ALTER TABLE ORDER_DETAILS
ADD CONSTRAINT ORDER_DETAILS_FK1_001 FOREIGN KEY
(
ID
)
REFERENCES ORDER_DETAILS
(
ID
)
ENABLE;
(二).开始测试
1. 查
查某个员工信息
select * FROM employees WHERE employee_id=1
递归查询某个员工及其所有下属,子下属员工
SELECT * FROM employees START WITH EMPLOYEE_ID = 1 CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID;
查询订单表,并且包括订单的订单应收货款
select *
FROM orders
查询订单详表,要求显示订单的客户名称和客户电话,产品类型用汉字描述
select o.customer_name,o.customer_tel, p.product_type AS 产品类型
FROM orders o,order_details d,products p
where o.order_id=d.order_id
and d.product_name=p.product_name
查询出所有空订单,即没有订单详单的订单
select *
from orders
where order_id NOT in(SELECT o.order_id from orders o,order_details d WHERE o.order_id=d.order_id)
查询部门表,同时显示部门的负责人姓名
select d.*,e.name
from departments d,employees e
where d.department_id=e.department_id
and e.manager_id=d.department_id
查询部门表,统计每个部门的销售总金额
select d.department_name,SUM(sum1)
FROM (
select (d.product_num*d.product_price) sum1
from order_details d,orders o,departments d,employees e
WHERE d.department_id=e.department_id
and o.employee_id = e.employee_id
and o.order_id=d.order_id
),departments d
group by d.department_name
查视图
select * from VIEW_ORDER_DETAILS where order_id=5;
分区查订单
select * from ORDERS partition(PARTITION_BEFORE_2017) WHERE order_id=1373;
查询我的表空间情况
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
and (a.tablespace_name='USERS001'
OR a.tablespace_name='USERS002')
2. 改
UPDATE order_details SET product_price=12.1 WHERE id=766
3. 删
delete from orders WHERE order_id=1372;
4. 增
INSERT INTO employees(employee_id,name,hire_date,salary) VALUES(2,'水景叶龙','19-10月 -29',50000);
5. 为用户shuijingyelong_1授权可以创建视图
GRANT CREATE VIEW TO shuijingyelong_1 WITH ADMIN OPTION;
6. 创建视图
CREATE OR REPLACE FORCE EDITIONABLE VIEW "VIEW_ORDER_DETAILS" ("ID", "ORDER_ID", "CUSTOMER_NAME", "CUSTOMER_TEL", "ORDER_DATE", "PRODUCT_TYPE", "PRODUCT_NAME", "PRODUCT_NUM", "PRODUCT_PRICE") AS
SELECT
d.ID,
o.ORDER_ID,
o.CUSTOMER_NAME,o.CUSTOMER_TEL,o.ORDER_DATE,
p.PRODUCT_TYPE,
d.PRODUCT_NAME,
d.PRODUCT_NUM,
d.PRODUCT_PRICE
FROM ORDERS o,ORDER_DETAILS d,PRODUCTS p where d.ORDER_ID=o.ORDER_ID and d.PRODUCT_NAME=p.PRODUCT_NAME;
7. 触发器
CREATE OR REPLACE EDITIONABLE TRIGGER "ORDERS_TRIG_ROW_LEVEL"
BEFORE INSERT OR UPDATE OF DISCOUNT ON "ORDERS"
FOR EACH ROW
declare
m number(8,2);
BEGIN
if inserting then
:new.TRADE_RECEIVABLE := - :new.discount;
else
select sum(PRODUCT_NUM*PRODUCT_PRICE) into m from ORDER_DETAILS where ORDER_ID=:old.ORDER_ID;
if m is null then
m:=0;
end if;
:new.TRADE_RECEIVABLE := m - :new.discount;
end if;
END;
8. 存储过程-向PRODUCTS中插入数据
CREATE OR REPLACE Procedure products_insert
(
sNAME in VARCHAR2,
sType in VARCHAR2
)
is
begin
Insert into PRODUCTS( product_name, product_type)
values(sname,stype);
end products_insert;
9. 测试存储过程
begin
products_insert('paper4','耗材');
commit;
end;
来源:CSDN
作者:Java使我强大
链接:https://blog.csdn.net/abc_123_abc_123_/article/details/102776749