您的位置:首页 > 数据库 > Oracle

Oracle知识点

2016-03-02 18:57 549 查看
在接下来的三篇关于oracle文章,是在上学期写好的,当时怕忘记,都是一些关于oracle的细节以及易错点,现在贴上来

知识点:

delete与truncate的区别:

Delete是DMl(data mutipulation language)语言,truncate是 DDL(data defination language)语言,dml语言可以回滚(rollback),ddl不能

Delete是逐条删除,truncate是先把整个表删除了再重建

使用delete删除数据不会释放空间,但truncate会

Delete语句会产生碎片,truncate不会

Delete可以闪回(flashback),truncate不能

事务的提交与回滚:

提交:commit(显式提交) /遇到DML语句(隐式提交)

回滚:rollback(显式回滚)/[掉线/宕机](隐式回滚)

事务种类

本地事务(只对数据库进行操作):

拿转账作为例子

Try{

1.扣钱

2.目标账户加钱

3.提交

}catch(Exception e){

1.处理事务

a)回滚

}

全局事务(Java中对于全局事务支持的框架有JTA,tomcat只支持本地事务,WebLogic和WebSphere都支持全局事务):

拿转账作为例子

Try{

1.扣钱

2.目标账户加钱

3.在提交之前,有些用户喜欢在到账之前给目标用户短信提醒

4.提交

}catch(Exception e){

1.处理事务

a)回滚

}

Oracle的隔离级别

先来数据库的事务隔离级别:



Oracle一共有3种隔离级别:read commited 、read only(多线程)、serializable(同步、单线程)

序列的不连续原因:

序列是公共对象,所以有可能有多张表在同时操作序列,所以造成序列的不连续:Table a :1,2,3,5,7

Table b:4,6

掉电,因为序列在内存中,一掉电就消失,比如我们当前序列指向3,如果现在掉电,那么下一次使用序列从21开始。

回滚

索引



那么 什么情况下需要创建索引?

列表中数据值分布范围很广

该列经常出现在where语句中

要访问的表数据量很大,但是我们要查找的内容只占表的2%-4%

那么什么情况不需要创建索引?

表中的数据很少

不经常出现在where语句中

查询的数据大于2%-4%

该表经常更新

同义词:synonym

为数据库对象创建一个别名。(表,视图,序列,索引)

在远程查询其他用户的表内容,需要目标(要查询的表)赋予发出查询指令表权利

Grant select on 表名 to 用户名

如果要为某一个用户表创建同义词的话,需要dba权限,要在dba用户下授权给要查询的用户:比如说我要在Scott表创建hr用户下employees表的同义词
Grant create synonmy to scott
,Scott拥有了创建同义词的权限之后,在其用户下创建hr员工表的同义词
Create synonmy 同义词名 for hr.employees
也就是说,以后我们查询的数据,可能是来自表,可能是来自视图,也可能来自数据库其他对象,或者来自其他用户下的表

Oracle的事务隔离机制

使用Pl/SQL语句对表中的数据进行操作时,例如给员工涨工资。多个用户对同一张表的操作时,要考虑到Oracle的事务隔离机制,它默认是read commited, 也就是说当操作的用户进行了commit之后,其他用户才能看见修改。



当我在sqlDeveloper中执行代码时,控制台输出了Ok之后,我立刻在cmd中以Scott身份登录数据库,并且查询用户的薪水:



可以发现,工资并没有涨。在考虑到事务隔离机制之后,我在函数开头使用了rollback,是为了返回刚刚的操作,并且在函数末尾进行了一次commit



然后再进行查询:



可以看到涨工资后的员工.

注意:一般情况下,不在存储过程和存储函数中commit,而是谁调用,谁提交

存储过程,存储函数的区别:

存储函数可以通过return语句来返回值,但是存储过程不能,在其他方面二者一致

在out参数出来以后,好像存储函数变得没什么用处,

当我们有一个返回值 的时候,使用存储函数,当我们有多个或者0个返回值的时候使用存储过程。

再加上一个原因,因为存储函数是老版本中出现的,在Oracle后面的版本升级中,要注意的向之前版本的兼容,不能升级版本的时候,以前写好的程序跑不起来了。

thread dump:

使用thread dump可以对java程序进行故障分析(死锁) 和瓶颈调优

b)Win环境:CTRL+break

c)Linux: kill -3

d)Win环境下的部分截图:


语句级触发器和行级触发器

语句级触发器不用加 for each row

old 和:new只对行级触发器起作用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle