其他
IvorySQL 3.4:如何实现兼容Oracle风格的序列功能?
1
什么是序列?
2
Oracle的序列相比PG多了什么?
支持CACHE/NOCACHE、SCALE、SESSION、GLOBAL特性; 支持NEXTVAL和CURRVAL伪列实现; 支持三个序列视图,ALL_SEQUENCES、DBA_SEQUENCES、USER_SEQUENCES;
3
3.4 的设计概述
语法修改,兼容oracle序列的部分语法。 功能实现,实现兼容oracle的部分序列功能。 序列调用的兼容,支持NEXTVAL和CURRVAL伪列使用序列值。 序列相关视图的创建以及序列的备份相关内容。
4
3.4 具体特性
4.1 CACHE/NOCACHE兼容
Oracle中CAHCHE只能指定为大于1的值,而PG中可以指定大于0的值。IvorySQL采用了与Oracle相同的做法; 新增关键字NOCACHE,指定NOCACHE时cache值为1,不指定时cache值默认为20;
>>>指定nocache的情况下,cache_size的值为1。
create sequence seq_cache nocache;
select cache_size from all_sequences where sequence_name='seq_cache';
cache_size
------------
1
(1 row)
>>>不指定nocache的情况下,cache_size的默认值为20。
create sequence seq_cache;
select cache_size from all_sequences where sequence_name='seq_cache';
cache_size
------------
20
(1 row)
PG中指定cache大于1时,多个会话之间的序列值会出现间隙,间隙值为cache值,即每个会话缓存了对应序列值,后续会话会从上一个会话缓存后的序列开始计算。而oracle中不同会话中共享一个缓冲序列。IvorySQL沿用了PG的规则;
4.2 SESSION/GLOBAL实现
GLOBAL:全局序列,会话之间共用一个序列,该选项为默认选项。 SESSION:每个会话重新登录都会拥有一个起始的序列值,会话之间序列相互不影响。
4.3 RESTART语法功能支持
>>>示例:
CREATE SEQUENCE seq_restart INCREMENT BY 1 START WITH 32 MINVALUE 10 MAXVALUE 50;
select seq_restart.nextval from dual;
nextval
---------
32
(1 row)
alter sequence seq_restart restart;
Restart后序列值从初始值开始计算。
select seq_restart.nextval from dual;
nextval
---------
10
(1 row)
4.4 SCALE序列范围伸缩
>>>示例:
指定extend 的情况下,额外的6位数字添加在序列值的前面。
ivorysql=# CREATE SEQUENCE seq scale extend maxvalue 99999999;
CREATE SEQUENCE
ivorysql=# select seq.nextval from dual;
nextval
----------------
17400100000001
(1 row)
ivorysql=# DROP SEQUENCE seq;
DROP SEQUENCE
指定noextend 的情况下,额外的6位数字嵌在序列值的前部。
ivorysql=# CREATE SEQUENCE seq scale noextend maxvalue 99999999;
CREATE SEQUENCE
ivorysql=# select seq.nextval from dual;
nextval
----------
17400101
(1 row)
4.5 NEXTVAL和CURRVAL伪列实现
4.6 序列相关视图实现
>>>示例:
使用USER_SEQUENCES视图
ivorysql=# select min_value, max_value from user_sequences where sequence_name = 'seq';
min_value | max_value
-----------+-----------
1 | 99999999
(1 row)
使用ALL_SEQUENCES视图
ivorysql=# select cache_size from all_sequences where sequence_name='seq';
cache_size
------------
20
(1 row)
关注公众号,了解更多社区动态
- 我们是谁 -
lvorySQL 是由瀚高基础软件股份有限公司主导研发的,一款基于 PostgreSQL 并深度兼容 Oracle 的开源数据库系统。IvorySQL 从底层代码层面深入把握开源技术的发展趋势,基于 PostgreSQL 16.3 的最新内核进行构建,同时提供了更加全面灵活的Oracle 兼容功能,具备高度的 SQL 和 PL/SQL 兼容性,能够满足企业对于数据库系统多样化和高兼容性的需求。
IvorySQL