Oracle — PL/SQL 编程
📋 本文节选自《Oracle 面试题》,返回 查看全部章节
42.说下 Oracle 中有哪几种文件?
- 数据文件(一般后缀为 .dbf 或者 .ora )
- 日志文件(后缀名.log)
- 控制文件(后缀名为.c
43.说下 oracle 中 DML、DDL、DCL的使用有哪些
- DML数据操纵语言,如 select、update、delete、insert
- DDL 数据定义语言,如 create table、drop table 等等
- DCL 数据控制语言,如commit、rollback、grant、invoke等
44.说下怎样创建一个视图,视图的好处,视图可以控制权限吗?
java
create view 视图名 as select 列名 [别名] ... from 表 [unio [all] select ... ]]
好处:
- 可以简单的将视图理解为 SQL 查询语句,视图最大的好处是不占系统空间
- 一些安全性很高的系统,不会公布系统的表结构,可能会使用视图将一些敏感信息过虑或者重命名后公布结构
- 简化查询
- 视图可以控制权限的,在使用的时候需要将视图的使用权限 grant 给用户
45.说下 Oracle 的锁有几种,定义分别是什么?
- 行共享锁(ROW SHARE)
- 行排他锁(ROW EXCLUSIVE)
- 共享锁(SHARE)
- 共享行排他锁(SHARE ROW EXCLUSIVE)
- 排他锁(EXCLUSIVE)
Oracle 锁具体分为以下几类:
1.按用户与系统划分,可以分为自动锁与显示锁
- 自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。
- 显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
2.按锁级别划分,可分为共享锁与排它锁
共享锁:
共享锁使一个事务对特定数据库资源进行共享访问一一另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计 + 共享锁容易造成死锁或数据更新丢失。
排它锁:
事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
3.按操作划分,可分为 DML 锁、DDL 锁。DML 锁又可以分为,行锁、表锁、死锁
DML锁:
- 行锁: 当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。
- 表级锁: 当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行 DDL 语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用 LOCK TABLE 语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用 LOCK TABLE 显示的定义一个表级的共享锁 (LOCK TABLE具体用法请参考相关文档)。
- 死锁: 当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁。
java 如事务 1 在表A行记录3 中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务;1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。
死锁一般是因拙劣的事务设计而产生,死锁只能使用 SQL 下:alter system kill session "sid,serial#"; 或者使用相关操作系统 kill 进程的命令,如 UNlX 下 kill -9 sid ,或者使用其它工具杀掉死锁进程。
DDL锁:
DDL锁又可以分为:
排它 DDL 锁、共享 DDL 锁、分析锁
- 排它 DDL 锁: 创建、修改、删除一个数据库对象的 DDL 语句获得操作对象的排它锁。如使用 alter table 语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它 DDL 锁。
- 共享 DDL 锁: 需在数据库对象之间建立相互依赖关系的 DDL 语句通常需共享获得 DDL 锁。如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享 DDL 锁。
- 分析锁: ORACLE 使用共享池存储分析与优化过的 SQL 语句及 PL/SQL 程序,使运行相同语句的应用速度更快。在一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的 DDL 锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE 使共享池中的对象作废,下次在引用这条 SQL/PLSQL 语句时,ORACLE 重新分析编译此语句。
- 内部闩锁
内部闩锁:这是 ORACLE 中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE 首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。
46. delete 与 Truncate 区别?
- Truncate 是 DDL 语句,DELETE 是 DML 语句。
- Truncate 的速度远快于 DELETE;
原因是: 当执行 DELETE 操作时所有表数据先被 copy 到回滚表空间,数据量不同花费时间长短不一。而 TRUNCATE 是直接删除数据不进回滚表空间。 - delete 数据可以运行 Rollback 进行数据回滚。而 Truncate 则是永久删除不能回滚。
- Truncate 操作不会触发表上的 delete 触发器,而 delete 会正常触发。
- Truncate 语句不能带 where 条件意味着只能全部数据删除,而 DELETE 可带 where 条件进行删除数据。
- Truncate 操作会重置表的高水位线(High Water Mark),而 delete 不会。
47.集合操作符
- Union:不包含重复值,默认按第一个查询的第一列升序排列。
- Union ALL:完全并集包含重复值。不排序。
- Minus 不包含重复值,不排序。
48.数据库的三大范式是什么?
- 第一范式:原子性,要求每一列的值不能再拆分了。
- 第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)。
- 第三范式:所有列与主键值直接相关。
49.事务的特性(ACID)是指什么?
- 原子性(Atomic):事务中的各项操作,要么全做要么全不做,任何一项操作的失败都会导数整个事务的失败。
- 一致性(Consistent):事务结束后系统状态是一样的。
- 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态。
- 持久性(Durable):事务完成后,即使发生灾难性故障,通过日志和同步备份可以在故障发生后重建数据。
50. MySQL 数据库与 Oracle 数据库有什么区别?
- 应用方面,MySQL 是中小型应用的数据库。一般用于个人和中小型企业。Oracle 属于大型数据库,一般用于具有相当规模的企业应用。
- 自动增长的数据类型方面:MySQL 有自动增长的数据类型。Oracle 没有自动增长的数据类型。需要建立一个自增序列。
- group by 用法:MySQL 中 group by 在 SELECT 语句中可以随意使用,但在 ORACLE 中如果查询语句中有组函数,那么其他列必须是组函数处理过的或者是 group by 子句中的列,否则会报错。
- 引导方面:MySQL 中可以用单引号、双引号包起字符串,Oracle 中只可以用单引号包起字符串。
51. Oracle 跟 SQL Server 2005 的区别?
宏观上:
- 最大的区别在于平台,oracle 可以运行在不同的平台上,SQL Server 只能运行在 Windows 平台上,由于 Windows 平台的稳定性和安全性影响了 SQL Server 的稳定性和安全性
- oracle 使用的脚本语言为 PL-SQL,而SQL Server 使用的脚本为T-SQL
微观上
从数据类型,数据库的结构等等回答
52.如何使用 Oracle 的游标?
- oracle 中的游标分为显示游标和隐式游标
- 显示游标是用 cursor…is 命令定义的游标,它可以对查询语句 (select) 返回的多条记录进行处理;隐式游标是在执行插入 (insert) 、删除 (delete) 、修改 (update) 和返回单条记录的查询 (select) 语句时由 PL/SQL 自动定义的。
- 显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL 隐式地打开 SQL游标,并在它内部处理 SQL 语句,然后关闭它
53. 解释 data block,extent 和 segment 的区别?
- data block 数据块,是 oracle 最小的逻辑单位,通常 oracle 从磁盘读写的就是块
- extent 区,是由若干个相邻的 block 组成
- segment 段,是有一组区组成
- tablespace 表空间,数据库中数据逻辑存储的地方,一个 tablespace 可以包含多个数据文件
54.怎样创建一个一个索引,索引使用的原则,有什么优点和缺点
创建标准索引: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建唯一索引: CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建组合索引: CREATE INDEX 索引名 ON 表名(列名1,列名2)TABLESPACE 表空间名;
创建反向键索引: CREATE INDEX 索引名 ON 表名(列名)reverse TABLESPACE 表空间名;
索引使用原则:
- 索引字段建议建立 NOT NULL 约束
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在 where 子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
- 可选择性高的关键字,应该建立索引;
- 可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替
- 正确选择复合索引中的第一个字段,一般是选择性较好的且在 where 子句中常用的字段上;
- 复合索引的几个字段经常同时 AND 方式出现在 where 子句中可以建立复合索引;否则单字段索引;
- 如果复合索引中包含的字段经常单独出现在 where 子句中,则分解为多个单字段索引;
- 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁 DML 的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
优点:
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 大大加快数据的检索速度,这也是创建索引的最主要的原因
- 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义
- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
缺点:
- 索引创建在表上,不能创建在视图上
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
- 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
55.如何判断数据库的时区?
java
SELECT DBTIMEZONE FROM DUAL;
56.解释GLOBAL NAMES设为TRUE的用途?
GLOBAL_NAMES 指明联接数据库的方式。如果这个参数设置为 TRUE ,在建立数据库链接时就必须用相同的名字连结远程数据库
57.如何加密 PL/SQL 程序?
WRAP
58.解释 FUNCATION,PROCEDURE 和 PACKAGE 区别
function 和 procedure 是 PL/SQL 代码的集合,通常为了完成一个任务。
procedure 不需要返回任何值而 function 将返回一个值
Package 是为了完成个商业功能的一组 function 和 proceudre 的集合
59.解释TABLE Function的用途
TABLE Function 是通过 PL/SQL 逻辑返回一组纪录,用于普通的表/视图。他们也用于 pipeline 和 ETL 过程。
60.举出 3 种可以收集 three advisory statistics
Buffer Cache Advice,Segment Level Statistics,Timed Statistics
61. Audit trace 存放在哪个 oracle 目录结构中?
unix $ORACLE_HOME/rdbms/audit Windows the event viewer
62.解释 materialized views的作用
Materialized views 用于减少那些汇总,集合和分组的信息的集合数量。它们通 常适合于数据仓库和 DSS 系统。
63.当用户进程出错,哪个后台进程负责清理它
PMON
64.哪个后台进程刷新 materialized views?
The Job Queue Processes.