在创建序列的语法中,有一个子句为 cache,它的用处是缓存指定个数的序列值。比如你设置的 cache 是20,那么在获取 nextval 时,Oracle 会直接从 cache 中取下一个序列值,如果 cache 中缓存的序列值没有了(比如 cache 中的序列值用完了,或者被手工清空了),那么 Oracle 会再次产生20个序列值,并放置 cache 中供使用,这样有助于提高序列值的获取速度。
-------------------------------
下面为测试:
01.SQL> select * from v$version;
02.
03.BANNER
04.----------------------------------------------------------------
05.Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
06.PL/SQL Release 10.2.0.1.0 - Production
07.CORE 10.2.0.1.0 Production
08.TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
09.NLSRTL Version 10.2.0.1.0 - Production
10.
11.SQL> create sequence SEQ_TEST1
12. 2 minvalue 1
13. 3 maxvalue 1000
14. 4 start with 1
15. 5 increment by 1
16. 6 cache 20
17. 7 order;
18.
19.序列已创建。
20.
21./*这里需要注意的是用dual得到的是一个值,但是用USER_SEQUENCES得到的是cache里的缓存的序列集合*/
22.-- //刚刚创建的序列必须先用 nextval 来获取一个初始值
23.SQL> select SEQ_TEST1.currval from dual;
24.select SEQ_TEST1.currval from dual
25. *
26.ERROR 位于第 1 行:
27.ORA-08002: 序列 SEQ_TEST1.CURRVAL 尚未在此会话中定义
28.
29.
30.SQL> select SEQ_TEST1.nextval from dual;
31.
32. NEXTVAL
33.----------
34. 1
35.
36.SQL> select SEQ_TEST1.currval from dual;
37.
38. CURRVAL
39.----------
40. 1
41.
42.-- //清空 cache 中缓存的序列值
43.SQL> alter system flush shared_pool;
44.
45.系统已更改。
46.
47.-- //查询当前值,没有变化,仍是1
48.SQL> select SEQ_TEST1.currval from dual;
49.
50. CURRVAL
51.----------
52. 1
53.
54.-- //查询下一个值:Oracle 发现 cache 中的序列值没有了,会再次产生20个序列值供使用。
55.-- //所以这里得到的结果不是2,而是21。
56.SQL> select SEQ_TEST1.nextval from dual;
57.
58. NEXTVAL
59.----------
60. 21
61.
62.-- 再试一次
63.SQL> alter system flush shared_pool;
64.
65.系统已更改。
66.
67.SQL> select SEQ_TEST1.currval from dual;
68.
69. CURRVAL
70.----------
71. 21
72.
73.SQL> select SEQ_TEST1.nextval from dual;
74.
75. NEXTVAL
76.----------
77. 41
78.
79.-- //问题:Oracle 下一次取的20个值是从哪里开始计算的呢,是 currval + 20,
80.-- //还是每个 cache + 20 呢?我们试验一下。
81.SQL> select SEQ_TEST1.nextval from dual;
82.
83. NEXTVAL
84.----------
85. 42
86.
87.-- //现在序列的当前值是42。如果是用 currval + 20 来计算,那么清空 cache 后,
88.-- //获得的 nextval 应该是62;如果是 cache + 20,那应该是 61。
89.-- //看看实验结果吧:
90.SQL> alter system flush shared_pool;
91.
92.系统已更改。
93.
94.SQL> select SEQ_TEST1.currval from dual;
95.
96. CURRVAL
97.----------
98. 42
99.
100.SQL> select SEQ_TEST1.nextval from dual;
101.
102. NEXTVAL
103.----------
104. 61
分享到:
相关推荐
### Oracle中的Sequence...通过以上步骤,我们可以看到Sequence在Oracle数据库中的强大功能和广泛用途,不仅能够方便地实现主键自增,还能灵活生成各种类型的序列号。这对于日常的数据处理工作来说是非常实用的工具。
#### 一、Sequence 的概念及用途 在 Oracle 数据库中,`Sequence` 是一种用于生成一系列唯一数值的对象。这些数值可以按照特定的规则递增或递减,并且可以设定是否循环以及是否缓存等特性。`Sequence` 常用于自动...
Dual表的主要用途是: 1. 查看当前用户:可以在 SQL Plus 中执行以下语句来查看当前用户: ``` select user from dual; ``` 2. 调用系统函数:可以使用Dual表来调用系统函数,例如: ``` select to_char(sysdate, '...
主要用途在于提供模式独立性,即用户可以通过同义词访问其他模式下的表,而无需指定完整的模式名。 ##### 使用场景 - **模式独立性**:简化对其他模式下表的引用。 - **安全性**:可以用于隐藏实际表的位置。 ####...
- **语法**:`CREATE SEQUENCE sequence_name [INCREMENT BY increment] [MINVALUE minvalue] [MAXVALUE maxvalue] [START WITH start] [CACHE cache_size | NOCACHE];` - **示例**:`CREATE SEQUENCE seq_emp ...
数据库对象包括各种类型,如表、同义词、序列、视图、索引等,它们都有特定的功能和用途。 1. **表**:表是最基本的数据库对象,用于存储数据。它由列和行组成,列定义了数据类型和约束,行则包含实际的数据。 2. ...
CYCLE/CACHE cache_size NOCACHE; ``` 序列对于自动化数据插入非常有用,特别是在大数据量和多用户的环境下。 视图的限制包括不能选取`Currval`和`Nextval`伪列,以及在某些特定查询结构中不能执行DML操作,例如...
- **sequence**:该字段未在示例中出现,推测可能用于记录CDEF表达式中各项的顺序。 **用途**:存储CDEF表达式中的具体项信息,每个项都与一个CDEF表达式关联,用以实现数据处理逻辑。 --- 接下来是其他重要表的...
**Level 2 Cache 二级缓存** - **中文含义**:CPU的第二级缓存。 - **用途**:提高处理器性能,减少访问主内存所需时间。 ##### 4. **System Memory 系统内存** - **中文含义**:安装在计算机上的RAM总量。 ...
- **创建序列**:`CREATE SEQUENCE sequence_name START WITH start_value INCREMENT BY increment_value MAXVALUE max_value MINVALUE min_value CYCLE|NOCYCLE CACHE cache_size NOCACHE;` - **查看序列**:`...
Level2Cache 二级缓存 - **定义**: CPU中的第二层高速缓存,用于暂时存储频繁访问的数据,以提高处理速度。 - **用途**: 调整二级缓存的大小可以优化CPU性能,特别是在多任务处理和大型数据集处理方面。 #### 4. ...
1. 序列的概念与用途 序列是一种数据库对象,它能生成唯一的、有序的整数值。在Oracle中,序列可以是连续的或者有间隔的,可以递增或递减,并且可以在不进行任何插入操作的情况下预生成值。序列主要用于自动生成表中...
CACHE 20 CYCLE ORDER; ``` 3. **创建触发器** 使用`BEFORE INSERT`触发器,在插入新记录前自动填充`TID`字段。 ```sql CREATE OR REPLACE TRIGGER scott.trg_test BEFORE INSERT ON scott.test_table ...
**序列的用途** 序列是Oracle数据库中用来生成连续整数的一种对象。通常用于自动生成主键或唯一标识符。 **创建序列** 创建序列的基本语法如下: ```sql CREATE SEQUENCE sequence_name INCREMENT BY increment_...
此外,题目中还包括一些判断题和名词解释题,涉及USB设备的热插拔特性、IDE接口的用途、AGP接口的定义、CPU微制造工艺、计算机性能评估、购买电脑的注意事项、元件接口清洁、内存条操作、显卡核心部件、驱动程序的...
上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: item_index:...
9. **名称的选择** 应该清晰地反映其用途,避免使用保留词、简写或非标准缩写,例如`nums_layers`、`nums_channels`。 ### 注释标准 1. **行尾注释** 如`EXPIRE = 3600 # 空格调用方指定的时间数值`,保持简洁明了...
序列的主要用途在于为表提供一个默认的唯一标识符。在PostgreSQL中,序列通过CREATE SEQUENCE语句创建。该语句允许用户自定义序列的起始值、增量、最小值、最大值以及是否循环等特性。例如,我们可以创建一个从1开始...
在本例中,通过`CREATE SEQUENCE HARD_SEQ`创建了一个名为`HARD_SEQ`的序列。具体参数说明如下: - `MINVALUE`: 序列最小值,默认为1。 - `MAXVALUE`: 序列最大值,默认无限制。在此示例中设置为极大值。 - `START ...