oracle企业面试题集锦
Oracle企业面试题集锦
1. Oracle跟SQL Server 2005的区别?
宏观上:
1.最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性
2.oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-SQL
微观上: 从数据类型,数据库的结构等等回答
2. 如何使用Oracle的游标?
1. oracle中的游标分为显示游标和隐式游标
2. 显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。
3. 显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它
3. Oracle中function和procedure的区别?
1. 可以理解函数是存储过程的一种
2. 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
3. 两者都可以通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
4. 在sql数据操纵语句中只能调用函数而不能调用存储过程
4. Oracle的导入导出有几种方式,有何区别?
1. 使用oracle工具 exp/imp
2. 使用plsql相关工具
方法1. 导入/导出的是二进制的数据, 2.plsql导入/导出的是sql语句的文本文件
5. Oracle中有哪几种文件?
数据文件(一般后缀为.dbf或者.ora),日志文件(后缀名.log),控制文件(后缀名为.ctl)
6. 怎样优化Oracle数据库,有几种方式?
个人理解,数据库性能最关键的因素在于IO,因为操作内存是快速的,但是读写磁盘是速度很慢的,优化数据库最关键的问题在于减少磁盘的IO,就个人理解应该分为物理的和逻辑的优化, 物理的是指oracle产品本身的一些优化,逻辑优化是指应用程序级别的优化
物理优化的一些原则:
1. Oracle的运行环境(网络,硬件等)
2. 使用合适的优化器
3. 合理配置oracle实例参数
4. 建立合适的索引(减少IO)
5. 将索引数据和表数据分开在不同的表空间上(降低IO冲突)
6. 建立表分区,将数据分别存储在不同的分区上(以空间换取时间,减少IO)
逻辑上优化:
oracle企业面试题集锦
1. 可以对表进行逻辑分割,如中国移动用户表,可以根据手机尾数分成10个表,这样对性能会有一定
的作用
2. Sql语句使用占位符语句,并且开发时候必须按照规定编写sql语句(如全部大写,全部小写等)oracle
解析语句后会放置到共享池中
如: select * from Emp where name=? 这个语句只会在共享池中有一条,而如果是字符串的话,那就根据不同名字存在不同的语句,所以占位符效率较好
3. 数据库不仅仅是一个存储数据的地方,同样是一个编程的地方,一些耗时的操作,可以通过存储过程
等在用户较少的情况下执行,从而错开系统使用的高峰时间,提高数据库性能
4. 尽量不使用*号,如select * from Emp,因为要转化为具体的列名是要查数据字典,比较耗时
5. 选择有效的表名
对于多表连接查询,可能oracle的优化器并不会优化到这个程度, oracle 中多表查询是根据FROM字句从右到左的数据进行的,那么最好右边的表(也就是基础表)选择数据较少的表,这样排序更快速,如果有link表(多对多中间表),那么将link表放最右边作为基础表,在默认情况下oracle会自动优化,但是如果配置了优化器的情况下,可能不会自动优化,所以平时最好能按照这个方式编写sql
6. Where字句 规则
Oracle 中Where字句时从右往左处理的,表之间的连接写在其他条件之前,能过滤掉非常多的数据的条件,放在where的末尾, 另外!=符号比较的列将不使用索引,列经过了计算(如变大写等)不会使用索引(需要建立起函数), is null、is not null等优化器不会使用索引
7. 使用Exits Not Exits 替代 In Not in
8. 合理使用事务,合理设置事务隔离性
数据库的数据操作比较消耗数据库资源的,尽量使用批量处理,以降低事务操作次数
7. Oracle中字符串用什么符号链接?
Oracle中使用 || 这个符号连接字符串 如 ‘abc’ || ‘d’
8. Oracle分区是怎样优化数据库的?
Oracle的分区可以分为:列表分区、范围分区、散列分区、复合分区。
1. 增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;
2. 减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,可能比整
个大表修复花的时间更少;
3. 维护轻松:如果需要得建表,独产管理每个公区比管理单个大表要轻松得多;
4. 均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;
5. 改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速
度更快
6. 分区对用户透明,最终用户感觉不到分区的存在。
9. Oracle是怎样分页的?
Oracle中使用rownum来进行分页, 这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10
oracle企业面试题集锦
10. Oralce怎样存储文件,能够存储哪些文件?
Oracle 能存储 clob、nclob、 blob、 bfile
Clob 可变长度的字符型数据,也就是其他数据库中提到的文本型数据类型
Nclob 可变字符类型的数据,不过其存储的是Unicode字符集的字符数据
Blob 可变长度的二进制数据
Bfile 数据库外面存储的可变二进制数据
11. Oracle中使用了索引的列,对该列进行where条件查询、分组、排序、使用聚集函数,
哪些用到了索引?
均会使用索引, 值得注意的是复合索引(如在列A和列B上建立的索引)可能会有不同情况
12. 数据库怎样实现每隔30分钟备份一次?
通过操作系统的定时任务调用脚本导出数据库
13. Oracle中where条件查询和排序的性能比较?
Order by使用索引的条件极为严格,只有满足如下情况才可以使用索引,
1.order by中的列必须包含相同的索引并且索引顺序和排序顺序一致
2. 不能有null值的列
所以排序的性能往往并不高,所以建议尽量避免order by
14. 解释冷备份和热备份的不同点以及各自的优点?
冷备份发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法
热备份是在数据库运行的情况下,采用归档方式备份数据的方法
冷备的优缺点:
1.是非常快速的备份方法(只需拷贝文件)
2.容易归档(简单拷贝即可)
3.容易恢复到某个时间点上(只需将文件再拷贝回去)
4.能与归档方法相结合,作数据库“最新状态”的恢复。
5.低度维护,高度安全。
冷备份不足:
1.单独使用时,只能提供到“某一时间点上”的恢复。
2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,
数据库必须是关闭状态。
3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
4.不能按表或按用户恢复。
热备的优缺点
1.可在表空间或数据文件级备份,备份时间短。
2.备份时数据库仍可使用。
3.可达到秒级恢复(恢复到某一时间点上)。
4.可对几乎所有数据库实体作恢复。
oracle企业面试题集锦
5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的不足是:
1.不能出错,否则后果严重。
2.若热备份不成功,所得结果不可用于时间点的恢复。
3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。
15. 解释data block , extent 和 segment的区别?
data block 数据块,是oracle最小的逻辑单位,通常oracle从磁盘读写的就是块
extent 区,是由若干个相邻的block组成
segment段,是有一组区组成
tablespace表空间,数据库中数据逻辑存储的地方,一个tablespace可以包含多个数据文件
16. 比较truncate和delete命令 ?
1.Truncate 和delete都可以讲数据实体删掉,truncate 的操作并不记录到 rollback日志,所以操作
速度较快,但同时这个数据部能恢复
2.Delete操作部腾出表空间的空间
3.Truncate 不能对视图等进行删除
4.Truncate是数据定义语言(DDL),而delete是数据操纵语言(DML)
17. 解释什么是死锁,如何解决Oracle中的死锁?
简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行
解决办法:
1. 查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select http://ername,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2. 杀进程中的会话
alter system kill session 'sid,serial#';
18. 简述oracle中 dml、ddl、dcl的使用
Dml 数据操纵语言,如select、update、delete,insert
Ddl 数据定义语言,如create table 、drop table 等等
Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等
19. 说说oracle中的经常使用到得函数
Length 长度、 lower 小写、upper 大写, to_date 转化日期, to_char转化字符
oracle企业面试题集锦
Ltrim 去左边空格、 rtrim去右边空格,substr取字串,add_month增加或者减掉月份、to_number转变为数字
20. 怎样创建一个存储过程, 游标在存储过程怎么使用, 有什么好处?
附:存储过程的一般格式,游标使用参考问题
1 .使用游标可以执行多个不相关的操作.如果希望当产生了结果集后,对结果集中的数据进行多种不相
关的数据操作
2. 使用游标可以提供脚本的可读性
3. 使用游标可以建立命令字符串,使用游标可以传送表名,或者把变量传送到参数中,以便建立可以执行
的命令字符串.
但是个人认为游标操作效率不太高,并且使用时要特别小心,使用完后要及时关闭
oracle企业面试题集锦
21. 怎样创建一个一个索引,索引使用的原则,有什么优点和缺点
oracle企业面试题集锦
22. 怎样创建一个视图,视图的好处, 视图可以控制权限吗?
23. 怎样创建一个触发器, 触发器的定义, 触发器的游标怎样定义
oracle企业面试题集锦
24. oracle创建表的几种方式;应该注意些什么
不知道这个题目是不是记错了,感觉很怪
1. 使用图形工具创建表
2. 使用数据ddl语句创建表
3. 可以在plsql代码中动态创建表
应该注意: 是否有创建表的权限, 使用什么表空间等
25. 怎样将一个旧数据库数据移到一个新的数据库
1. Imp/exp将数据库中的数据导入到新的库中
2. 如果是存储迁移直接将存储设备挂到新机器上
26. 主键有几种;
字符型,整数型、复合型
27. oracle的锁又几种,定义分别是什么;
1. 行共享锁 (ROW SHARE)
2. 行排他锁(ROW EXCLUSIVE)
3 . 共享锁(SHARE)
4. 共享行排他锁(SHARE ROW EXCLUSIVE)
5. 排他锁(EXCLUSIVE)
使用方法:
SELECT * FROM order_master WHERE vencode='V002'
FOR UPDATE WAIT 5;
oracle企业面试题集锦
LOCK TABLE order_master IN SHARE MODE;
28. 在java种怎样调用oracle存储过程;
oracle企业面试题集锦
在java中使用 CallableStatement调用存储过程
oracle企业面试题集锦
} } }catch(Exception ex){ } } } } 第二种情况
:有返回值的存储过程(返回值非列表). 存储过程为: create or replace procedure test_b(param1 in varchar2,param2 out varchar2) as begin select tname into param2 from test where tid=param1; end; Java 调用代码: package com.test; import java.sql.*; import java.io.*; import java.sql.*; public class TestProcB { public TestProcB(){ } public static void main(String []args) { Connection conn = null; CallableStatement proc = null; try{ Class.forName("oracle.jdbc.driver.OracleDriver"); conn "test", "test"); proc = conn.prepareCall("{ call test_b(?,?) }"); = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test",
oracle企业面试题集锦
proc.setString(1, "1001"); proc.registerOutParameter(2, Types.VARCHAR); proc.execute(); System.out.println("Output is:"+proc.getString(2)); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(null!=proc){ proc.close(); } if(null!=conn){ conn.close(); } }catch(Exception ex){ } } } } 第三种情况:返回列表. 由于 oracle 存储过程没有返回值,它的所有返回值都是通过 out 参数来替代的,列表同样也不例外, 但由于是集合,所以不能用一般的参数,必须要用 pagkage 了.要分两部分来写: create or replace package tpackage as type t_cursor is ref cursor; procedure test_c(c_ref out t_cursor); end ; create or replace package body tpackage as procedure test_c(c_ref out t_cursor) is begin open c_ref for select * from test; end test_c; end tpackage; Java 调用代码: package com.test;
oracle企业面试题集锦
import java.sql.*; import java.io.*; import java.sql.*; public class TestProcB { public TestProcB(){ } public static void main(String []args) { Connection conn = null; CallableStatement proc = null; ResultSet rs = null; try{ Class.forName("oracle.jdbc.driver.OracleDriver"); conn "test", "test"); proc = conn.prepareCall("{? = call tpackage.test_b(?) }"); proc.registerOutParameter(1, OracleTypes.CURSOR); proc.execute(); while(rs.next()){ System.out.println(rs.getObject(1) + "\t" + rs.getObject(2)); } }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(null!=rs){ rs.close(); if(null!=proc){ proc.close(); } if(null!=conn){ conn.close(); } } = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test",
oracle企业面试题集锦
29. rowid,rownum的定义
1. rowid和rownum都是虚列
2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置
3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别。
30. oracle中存储过程,游标和函数的区别
游标类似指针,游标可以执行多个不相关的操作.如果希望当产生了结果集后,对结果集中的数据进行多 种不相关的数据操作
函数可以理解函数是存储过程的一种; 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值;两者都可以通过out参数返回值, 如果需要返回多个参数则建议使用存储过程;在sql数据操纵语句中只能调用函数而不能调用存储过程