oracle序,Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)-Oracle

Oracle 序列

Oracle序列的概念: 序列是一 数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主码值(类似于MySQL中的主键auto_increment属性)

有时候我们定义某张表其中某一列为主键,当我们往标中插入数据的时候,对于主键字段的赋值要求唯一性,我们希望能有个自增类型的数据库对象,我们每获取一次它就自动增长,保证下次获取的时候肯定是不一样的值,序列既是这种Oracle对象。 create sequence sequence_name [increment by n1, start with n2 ,maxvalue n3, cache n , nocache …..] 从序列取值:sequence_name.CURRVAL(取当前值) sequence_name.NEXTVAL(取下一条值) 更改序列的定义: alter sequence_name sequence definition;

属性cache的指定:

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。 cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort) cache中的Sequence就会丢失。 举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。 如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。 不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件 主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache sequence,还会导致如下问题: 由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下 会对基于sequence生成的列创建的索引造成实例间大量索引块争用。基于以上问题,避免创建nocache sequence。

创建序列的语法,序列是和表一样的对象要指定它的用户 CREATE SEQUENCE sequence [INCREMENT BY n] — 自增的公差,默认为1 [START WITH n] — 起始值 [{MAXVALUE n | NOMAXVALUE}] — 最大值 [{MINVALUE n | NOMINVALUE}] — 最小值 [{CYCLE | NOCYCLE}] — 循环 [{CACHE n | NOCACHE}]; — 缓存

从序列取值: CURRVAL 取当前值, NEXTVAL取下一个值

更改序列的定义: ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE;

Oracle RUNNUM

对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between…and,只能用以上符号(,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样。

rownum是伪列,意思就是数据库中并不存在的列,它是只有在显示了第一行时才给出一个值 1,下一行则在上一行的值上加1,所以如果rownum>2 则不会有任何匹配的记录。由于rownum>2不匹配第一行记录,所以第一行不显示,记录跳到第二行,第二行又会被rownum重新写上值 1,这样第二行又不匹配。以此类推造成每行记录输出的rownum值永远停在1上,并由于条件rownum>2造成所有行都不被显示。(先有结果集才有rownum,

任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1) 如果你想分页就必需将伪列转化为实际列,即将有伪列的查询做为子查询处理,简单的作为两次查询就可以了。 例如:select c.* from( select a.*,

rownum rm from employees a) c where c.rm between 1 and 10 — 分页查询前十条记录

rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。

另外还要注意:rownum不能以任何基表的名称作为前缀。

通过rowid分页查询 select * from employees where rowid in ( –这里选择要查询出的字段 select rid from (select rownum rn, rid from (select rowid rid, salary from employees order by salary desc) –这里进行表排序 where rownum < 8 –这里是上限 ) where rn > 5 –这里是下限 ) order by salary desc –这里再次排序

Oracle 同义词(synonyms )

同义词概念

Oracle的同义词(synonyms) 从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系。它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;它扩展了数据库 的使用范围,能够在不同的数据库用户之间实现无缝交互;Oracle数据库中提供了同义词管理的功能。同义词是数据库对象的一个别名,经常用于简化对象访 问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典 中保存了同义词的定义。

Oracle同义词有两种类型,分别是Oracle公用同义词与Oracle私有同义词。普通用户创建的同义词一般都是私有同义词,公有同义词一般由DBA创建,普通用户如果希望创建同义词,则需要CREATE PUBLIC SYNONYM这个 系统权限。

1)Oracle公用同义词:由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。公用同义词往往用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。

2)Oracle私有同义词:它是跟公用同义词所对应,他是由创建他的用户所有。当然,这个同义词的创建者,可以通过授权控制其他用户是否有权使用属于自己的私有同义词。

同义词作用

1) 多用户协同开发中,可以屏蔽对象的名字及其持有者。public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别 名访问这个数据库对象,还要看是否已经为这个用户授权。

2)为分布式数据库的远程对象提供位置透明性。

4)Oracle同义词在数据库链接中的作用,数据库链接是一个命名的对象,说明一个数据库到另一个数据库的路径,通过其可以实现不同数据库之间的通信。

Create database link 数据库链名 connect to user名 identified by 口令 using ‘Oracle连接串’; 访问对象要通过 object名@数据库链名。同义词在数据库链中的作用就是提供位置透明性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值