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).  显⽰游标是⽤is命令定义的游标,它可以对查询语句(select)返回的多条记录进⾏处理;隐式游标是在执⾏插⼊ (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL⾃动定义的。
3). 显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它
3. Oracle中function和procedure的区别?
1). 可以理解函数是存储过程的⼀种
2). 函数可以没有参数,但是⼀定需要⼀个返回值,存储过程可以没有参数,不需要返回值
3). 函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使⽤存储过程
4). 在sql数据操纵语句中只能调⽤函数⽽不能调⽤存储过程
4. Oracle的导⼊导出有⼏种⽅式,有何区别?
1). 使⽤oracle⼯具 exp/imp
2). 使⽤plsql相关⼯具
⽅法1. 导⼊/导出的是⼆进制的数据, 2.plsql导⼊/导出的是sql语句的⽂本⽂件
5. Oracle中有哪⼏种⽂件?
数据⽂件(⼀般后缀为.dbf或者.ora),⽇志⽂件(后缀名.log),控制⽂件(后缀名为.ctl)
7. Oracle中字符串⽤什么符号链接?
Oracle中使⽤ || 这个符号连接字符串 如 ‘abc’ || ‘d’
9. Oracle是怎样分页的?
Oracle中使⽤rownum来进⾏分页, 这个是效率最好的分页⽅法,hibernate也是使⽤rownum来进⾏oralce分页的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10
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).可对⼏乎所有数据库实体作恢复。
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 b.username,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转化字符
Ltrim 去左边空格、 rtrim去右边空格,substr取字串,add_month增加或者减掉⽉份、to_number转变为数字
20. 怎样创建⼀个存储过程, 游标在存储过程怎么使⽤, 有什么好处?
附:存储过程的⼀般格式,游标使⽤参考问题
1 .使⽤游标可以执⾏多个不相关的操作.如果希望当产⽣了结果集后,对结果集中的数据进⾏多种不相关的数据操作
2. 使⽤游标可以提供脚本的可读性
3. 使⽤游标可以建⽴命令字符串,使⽤游标可以传送表名,或者把变量传送到参数中,以便建⽴可以执⾏的命令字符串.
但是个⼈认为游标操作效率不太⾼,并且使⽤时要特别⼩⼼,使⽤完后要及时关闭
存储过程优缺点:
优点:
1. 存储过程增强了SQL语⾔的功能和灵活性。存储过程可以⽤流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
2. 可保证数据的安全性和完整性。
3. 通过存储过程可以使没有权限的⽤户在控制之下间接地存取数据库,从⽽保证数据的安全。
通过存储过程可以使相关的动作在⼀起发⽣,从⽽可以维护数据库的完整性。
3. 再运⾏存储过程前,数据库已对其进⾏了语法和句法分析,并给出了优化执⾏⽅案。这种已经编译好的过程可极⼤地改善SQL语句的性能。 由于执⾏SQL语句的⼤部分⼯作已经完成,所以存储过程能以极快的速度执⾏。
4. 可以降低⽹络的通信量, 不需要通过⽹络来传送很多sql语句到数据库服务器了
5. 使体现企业规则的运算程序放⼊数据库服务器中,以便集中控制数据库优化sql语句
当企业规则发⽣变化时在服务器中改变存储过程即可,⽆须修改任何应⽤程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放⼊应⽤程序中,则当企业规则发⽣变化时,就需要修改应⽤程序⼯作量⾮常之⼤(修改、发⾏和安装应⽤程序)。如果把体现企业规则的 运算放⼊存储过程中,则当企业规则发⽣变化时,只要修改存储过程就可以了,应⽤程序⽆须任何变化。
缺点:
1. 可移植性差
2. 占⽤服务器端多的资源,对服务器造成很⼤的压⼒
3. 可读性和可维护性不好
Create  [or replace]  procedure 过程名字(参数 …)as
vs_ym_sn_end CHAR(6);    --同期终⽌⽉份
CURSOR cur_1 IS  --定义游标(简单的说就是⼀个可以遍历的结果集)
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_sn_beg
AND ym <= vs_ym_sn_end
GROUP BY area_code,CMCODE;
BEGIN
--⽤输⼊参数给变量赋初值,⽤到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常⽤的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,"yyyymm"), -12),"yyyymm");
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,"yyyymm"), -12),"yyyymm");
--先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
--然后⽤内置的DBMS_OUTPUT对象的put_line⽅法打印出影响的记录⾏数,其中⽤到⼀个系统变量SQL%rowcount
DBMS_OUTPUT.put_line("del上⽉记录="||SQL%rowcount||"条");
INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_beg
AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line("ins当⽉记录="||SQL%rowcount||"条");
--遍历游标处理后更新到表。遍历游标有⼏种⽅法,⽤for语句是其中⽐较直观的⼀种。
FOR rec IN cur_1 LOOP
UPDATE xxxxxxxxxxx_T
SET rmb_amt_sn = b_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
END LOOP;
COMMIT;
--错误处理部分。OTHERS表⽰除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。 EXCEPTION
WHEN OTHERS THEN
vs_msg := "ERROR IN xxxxxxxxxxx_p("||is_ym||"):"||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--把当前错误记录进⽇志表。
INSERT INTO LOG_INFO(proc_name,error_info,op_date)
VALUES("xxxxxxxxxxx_p",vs_msg,SYSDATE);
COMMIT;
RETURN;
END;
21. 怎样创建⼀个⼀个索引,索引使⽤的原则,有什么优点和缺点
创建标准索引:
CREATE  INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名;
创建唯⼀索引:
CREATE unique INDEX 索引名 ON 表名 (列名)  TABLESPACE 表空间名;
创建组合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2)  TABLESPACE 表空间名;
创建反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;
索引使⽤原则:
索引字段建议建⽴NOT NULL约束
经常与其他表进⾏连接的表,在连接字段上应该建⽴索引;
经常出现在Where⼦句中的字段且过滤性很强的,特别是⼤表的字段,应该建⽴索引;
可选择性⾼的关键字 ,应该建⽴索引;
可选择性低的关键字,但数据的值分布差异很⼤时,选择性数据⽐较少时仍然可以利⽤索引提⾼效率
复合索引的建⽴需要进⾏仔细分析;尽量考虑⽤单字段索引代替:
A、正确选择复合索引中的第⼀个字段,⼀般是选择性较好的且在where⼦句中常⽤的字段上;
B、复合索引的⼏个字段经常同时以AND⽅式出现在Where⼦句中可以建⽴复合索引;否则单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where⼦句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,⼜有这⼏个字段上的复合索引,⼀般可以删除复合索引;
频繁DML的表,不要建⽴太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
有点:
1. 创建唯⼀性索引,保证数据库表中每⼀⾏数据的唯⼀性
2. ⼤⼤加快数据的检索速度,这也是创建索引的最主要的原因
3. 加速表和表之间的连接,特别是在实现数据的参考完整性⽅⾯特别有意义。
4. 在使⽤分组和排序⼦句进⾏数据检索时,同样可以显著减少查询中分组和排序的时间。
缺点:
缺点:
1. 索引创建在表上,不能创建在视图上
2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加⽽增加
3. 索引需要占物理空间,除了数据表占数据空间之外,每⼀个索引还要占⼀定的物理空间,如果要建⽴聚簇索引,那么需要的空间就会更⼤
4. 当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
22. 怎样创建⼀个视图,视图的好处, 视图可以控制权限吗?
create view 视图名 as select 列名 [别名]  …  from 表 [unio [all] select … ] ]
好处:
1. 可以简单的将视图理解为sql查询语句,视图最⼤的好处是不占系统空间
2. ⼀些安全性很⾼的系统,不会公布系统的表结构,可能会使⽤视图将⼀些敏感信息过虑或者重命名后公布结构
3. 简化查询
可以控制权限的,在使⽤的时候需要将视图的使⽤权限grant给⽤户
23. 怎样创建⼀个触发器, 触发器的定义, 触发器的游标怎样定义
CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件
 ON表名
 [FOR EACH ROW]
 BEGIN
  pl/sql语句
CURSOR  游标名 is  SELECT * FROM 表名 (定义游标)
  END
 其中:
 触发器名:触发器对象的名称。
 由于触发器是数据库⾃动执⾏的,因此该名称只是⼀个名称,没有实质的⽤途。
触发时间:指明触发器何时执⾏,该值可取:
before---表⽰在数据库动作之前触发器执⾏;
after---表⽰在数据库动作之后出发器执⾏。
触发事件:指明哪些数据库动作会触发此触发器:
  insert:数据库插⼊会触发此触发器;
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;
LOCK TABLE order_master IN SHARE MODE;
LOCK TABLE itemfile IN EXCLUSIVE MODE NOWAIT;
ORACLE锁具体分为以下⼏类:
1.按⽤户与系统划分,可以分为⾃动锁与显⽰锁
⾃动锁:当进⾏⼀项数据库操作时,缺省情况下,系统⾃动为此数据库操作获得所有有必要的锁。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。