ALTER TABLE orders ADD CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 练习7-7 创建视图
在此练习中,使用处于HR模式的数据创建一些简单视图和复杂视图。可以使用SQL*Plus,也可以使用SQL Developer。
(1) 作为用户HR连接到数据库
(2) 对EMPLOPEES和DEPSRTMENT表创建视图。删除其中的所有个人信息: CREATE VIEW emp_anon_v AS SELECT hire_date,job_id,salary,commission_pct,department_id FROM hr.employees; CREATE VIEW dept_anon_v AS SELECT department_id,department_name,location_id FROM departments; (3) 创建联接与聚合着两个简单视图的复杂视图。注意。可以在视图的基础上再创建视
图。 CREATE VIEW dep_sum_v AS SELECT E.DEPARTMENT_ID, COUNT(1) STAFF, SUM(E.SALARY) AS SALARIES, D.DEPARTMENT_NAME FROM EMP_ANON_V E JOIN DEPT_ANON_V D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID GROUP BY E.DEPARTMENT_ID, D.DEPARTMENT_NAME; (4) 通过查询确认视图有效
练习7-8 创建和使用同义词
在本练习中,将用HR模式中的对象创建和使用私有同义词。可以使用SQL*Plus或SQL Developer。
(1) 作为用户HR连接到数据库
(2) 为【练习7-7】中创建的三个视图创建同义词:
CREATE SYNONYM emp_s FOR emp_anon_v; CREATE SYNONYM dept_s FOR dept_anon_v; CREATE SYNONYM dsum_s FOR dep_sum_v; (3) 确定同义词等同于底层对象: SQL> describe emp_s; Name Type Nullable Default Comments -------------- ------------ -------- ------- -------- HIRE_DATE DATE JOB_ID VARCHAR2(10) SALARY NUMBER(8,2) Y COMMISSION_PCT NUMBER(2,2) Y DEPARTMENT_ID NUMBER(4) Y SQL> describe emp_anon_v; Name Type Nullable Default Comments -------------- ------------ -------- ------- -------- HIRE_DATE DATE JOB_ID VARCHAR2(10) SALARY NUMBER(8,2) Y COMMISSION_PCT NUMBER(2,2) Y DEPARTMENT_ID NUMBER(4) Y (4) 通过对同义词而不是视图运行【练习7-7】中的语句来确认同义词有效(甚至到产生
相同错误的程度) SELECT * FROM dsum_s; INSERT INTO dept_s VALUES(99,'Temp Dept',1800); INSERT INTO emp_s VALUES(SYSDATE,'AC_MGR',10000,0,99); UPDATE emp_s SET salary=salary*1.1; ROLLBACK; SELECT MAX(salaries/staff) FROM dsum_s; (5) 删除两个视图 DROP VIEW emp_anon_v; DROP VIEW dept_anon_v; (6) 查询基于已删除视图的复杂视图
SELECT * FROM dep_sum_v; ORA-04063: view \可以注意到查询失败。 (7) 尝试重新编译被破坏的视图 ALTER VIEW dep_sum_v COMPILE; 此次编译尝试也会失败 (8) 删除DEP_SUM_V视图 DROP VIEW dep_sum_v; (9) 查询已删除视图的同义词 SELECT * FROM emp_s;
ORA-00980: synonym translation is no longer valid 该查询会失败。 (10) 重新编译被破坏的同义词
ALTER SYNONYM emp_s COMPILE; 注意,虽然这样做不会抛出错误,而是从第(9)步开始重新运行查询。该同义词无疑仍然处于破坏状态。
(11) 通过删除同义词进行整理: DROP SYNONYM emp_s; DROP SYNONYM dept_s; DROP SYNONYM dsum_s; 练习7-9 创建和使用序列
在本练习中,创建一些序列并使用它们。需要两个并发会话,可用使用SQL Developer或者SQL*Plus。
(1) 在单独的会话中作为WEBSTORE登录到数据库两次。将其中一次登录看着A会话,
另一次看做B会话。
(2) 在A会话中,创建如下所示的序列:
CREATE SEQUENCE seql START WITH 10 NOCACHE MAXVALUE 15 CYCLE; NOCACHE的使用会降低性能。如果指定了MAXVALUE,那么有必要用CYCLE防止达到MAXVALUE时出错。
(3) 在适当的会话中按正确的顺序执行表中的命令,以观察NEXTVAL和CURRVAL的
使用以及序列的循环。 步骤 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 SELECT dual;--10 在A会话中 seql.nextval FROM SELECT dual;--11 SELECT dual;--12 seql.nextval FROM SELECT dual;--13 SELECT dual;--12 seql.currval FROM SELECT dual;--14 SELECT dual;--15 seql.nextval FROM SELECT dual;--14 SELECT dual;--1 seql.nextval FROM 在B会话中 seql.nextval FROM seql.nextval FROM seql.nextval FROM seql.currval FROM 第10步 SELECT seql.nextval FROM
dual;--2 (4) 创建一个带主键的表: CREATE TABLE seqtest ( c1 NUMBER, c2 VARCHAR2(10) ); ALTER TABLE seqtest ADD CONSTRAINT seqtest_pk PRIMARY KEY (c1); (5) 创建一个序列来生成主键值:
CREATE SEQUENCE seq_test_pk_s; = CREATE SEQUENCE seq_test_pk_s MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 20; (6) 在A会话中,向新表中插入一行并提交: INSERT INTO seqtest VALUES(seq_test_pk_s.nextval,'first'); COMMIT; (7) 在B会话中,向新表插入一行并不提交: INSERT INTO seqtest VALUES (seq_test_pk_s.nextval,’second’); (8) 在A会话中,插入第三行并提交: INSERT INTO seqtest VALUES(seq_test_pk_s.nextval,'third'); COMMIT; (9) 在B会话中,回滚第二个插入: ROLLBACK; (10) 在B会话中查看表的内容: SELECT * FROM seqtest;
这就演示了在事务控制机制外部递增序列并立即发布下一个值。 (11) 整理表和序列: DROP TABLE seqtest; DROP SEQUENCE seq_test_pk_s; DROP SEQUENCE seql; (12) 使用SQL Developer或SQL*Plus连接到WEBSTORE模式并创建三个将在后面练习
中使用的序列(必须首先以特权用户如SYSTEM的身份连接,将“CREATE SEQUENCE”权限授予WEBSTORE用户)。 CREATE SEQUENCE prod_seq; CREATE SEQUENCE cust_seq; CREATE SEQUENCE order_seq;
本章知识点回顾
分类主要的数据库对象
? 有些对象包含数据,主要是表和索引
? 编程对象(如存储过程)和函数是可执行的代码 ? 视图和同义词是能够访问其它对象的对象 ? 表是保存使用列定义的行的二维结构
? 表在模式中。模式名和表名形成唯一标识符。
列举类可用的数据类型
? 最常见的字符数据类型有VARCHAR2、NUMBER和DATE ? 还有其它许多数据类型
创建简单的表
? 可以从头开始或者使用子查询创建表
? 创建之后,可以添加、删除或者修改列定义 ? 表定义可以包含列的默认值
创建和使用临时表
? 只有插入行的会话才能够访问临时表中的行 ? 针对临时表的DML不生成重做数据 ? 临时表只存在于会话的PGA或临时段
? 临时表只在会话期间或事务期间(具体取决于创建方式)保存行 约束
? 可以在创建表时定义约束,也可以在随后添加
? 可以与列一起定义约束,或者在列之后的表级别定义约束。 ? 表级别约束可能比内联定义的约束更复杂 ? 表只能有一个主键。但可以有许多唯一键 ? 主键的功能等同于UNIQUE加上NOT NULL ? 唯一约束不阻止多个空值的插入 ? 外键约束定义表之间的关系 索引
? 要实施唯一约束和主键约束,就必须使用索引 ? B*树索引不包含NULL,但位图索引包含NULL
? B*树索引可为唯一索引,也可为非唯一索引,这些将取决于是否接受重复键值。 ? B*树索引适用于基数大的列,而位图索引适用于基数小的列。 ? 位图索引可以采用复合形式,可以基于函数,也可以降序排列。 ? B*树索引可以是唯一的、压缩的和反向键。 视图
? 简单视图有一个明细表(或基表),既不使用函数也不使用聚合
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库OCP认证考试指南全册Oracle Database 11g练习与知识点 - 图文(9)在线全文阅读。
相关推荐: