可以通过在 SQL 语句中使用 NEXTVAL 或 CURRVAL 运算符来访问序列的值。必须用以 sequence.NEXTVAL 或 sequence.CURRVAL 格式驻留在同一个数据库中的序列名称(或同义词)来限定 NEXTVAL 或 CURRVAL。表达式也可以用所有者名来限定序列
在符合 ANSI 的数据库中,如果您不是所有者,必须用所有者名(owner.sequence)限定序列名。
要对序列使用 NEXTVAL 或 CURRVAL,必须对序列具有选择权限或对数据库具有 DBA 权限。关于序列级权限的信息,请参阅 GRANT 语句。
使用 NEXTVAL
第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。第一次引用 NEXTVAL,返回序列的初始值。后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值。
在一个 SQL 语句中只能对给定的序列增加一次。即使在一个语句中多次指定 sequence.NEXTVAL,序列也只增加一次,所以每次 sequence.NEXTVAL 出现在同一 SQL 语句中返回相同的值。
除了在同一语句中多次出现这种情况以外,每个 sequence.NEXTVAL 表达式都会增加序列,无论后来是否提交或回滚当前事务。
如果在最终回滚的事务中指定 sequence.NEXTVAL,某些序列数可能被跳过。
使用 CURRVAL
任何对 CURRVAL 的引用返回指定序列的当前值,该值是最后一次对 NEXTVAL 的引用所返回的值。用 NEXTVAL 生成一个新值以后,可以继续使用 CURRVAL 访问这个值,不管另一个用户是否增加这个序列。
如果 sequence.CURRVAL 和 sequence.NEXTVAL 都出现在一个 SQL 语句中,则序列只增加一次。在这种情况下,每个 sequence.CURRVAL 和 sequence.NEXTVAL 表达式都返回相同的值,不管在语句中 sequence.CURRVAL 和 sequence.NEXTVAL 的顺序。
序列的并发访问
序列总是在数据库中生成唯一值,即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。
当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如 1、4、6 和 8,而另一个用户并发地从同一序列生成值 2、3、5 和 7。
限制
NEXTVAL 和 CURRVAL 只在 SQL 语句中有效,并不在 SPL 语句中直接有效。(但是使用 NEXTVAL 和 CURRVAL 的 SQL 语句可用于 SPL 例程。)以下限制应用于 SQL 语句中的这些运算符:
必须对序列有选择权限。
在 CREATE TABLE 或 ALTER TABLE 语句中,在下列上下文中不能指定 NEXTVAL 或 CURRVAL:
在 DEFAULT 子句中
在检查约束中。
在 SELECT 语句中,下列上下文中不能指定 NEXTVAL 或 CURRVAL:
使用 DISTINCT 关键字时在投影列表中。
在 WHERE、GROUP BY 或 ORDER BY 子句中
在子查询中
在 UNION 运算符结合 SELECT 语句时。
在下列这些上下文中也不能指定 NEXTVAL 或 CURRVAL:
在分段存储表达式中
在对另一个数据库中的远程序列对象的引用中。
示例
在下面的例子中,假设没有其它用户并发地访问序列并且用户连续执行语句。
示例基于下列序列和表:
CREATE SEQUENCE seq_2
INCREMENT BY 1 START WITH 1
MAXVALUE 30 MINVALUE 0
NOCYCLE CACHE 10 ORDER;
CREATE TABLE tab1 (col1 int, col2 int);
INSERT INTO tab1 VALUES (0, 0);
可以在 INSERT 语句的 values 子句中使用 NEXTVAL(或 CURRVAL),如以下示例中所示:
INSERT INTO tab1 (col1, col2)
VALUES (seq_2.NEXTVAL, seq_2.NEXTVAL)
在前面的例子中,数据库服务器把一个增加后的值(或序列的初始值,即 1)插入到表的 col1 和 col2 列。
可以在 UPDATE 语句的 SET 子句中使用 NEXTVAL(或 CURRVAL),如以下示例中所示:
UPDATE tab1
SET col2 = seq_2.NEXTVAL
WHERE col1 = 1;
在前面的例子中,seq_2 序列增长以后的值,即 2,替换了 col2 中 col1 等于 1 的值。
以下示例显示了如何在 SELECT 语句的 Projection 子句中使用 NEXTVAL 和 CURRVAL:
SELECT seq_2.CURRVAL, seq_2.NEXTVAL FROM tab1;
在前面的示例中,数据库服务器从 CURRVAL 和 NEXTVAL 表达式返回两行增加后的值,3 和 4。对 tab1 的第一行,数据库服务器返回 CURRVAL 和 NEXTVAL 增加后的值 3;对 tab1 的第二行,它返回增加后的值 4。
原文:http://1985wanggang.blog.163.com/blog/static/776383320108291649524/
分享到:
相关推荐
- **CURRVAL 和 NEXTVAL**: 主要用于序列对象,例如 `NEXTVAL` 用来获取序列的下一个值。 - **LEVEL**: 用于生成行号。 - **ROWID**: 提供每个表中每行的唯一标识。 - **ROWNUM**: 返回行号,常用于分页查询。 ####...
##### NEXTVAL 和 CURRVAL NEXTVAL生成序列的下一个值,CURRVAL返回序列的当前值。 ```sql SELECT my_sequence.NEXTVAL AS next_val, my_sequence.CURRVAL AS curr_val FROM dual; ``` 这将返回序列的下一个值和...
- 伪列:Oracle系统自动生成的特殊列,如`ROWNUM`用于为查询结果集分配唯一的数字,`ROWID`是记录的唯一标识,`CURRVAL`和`NEXTVAL`与序列号生成有关,`LEVEL`在递归查询中表示层次。 - 伪表:DUAL表是一个特殊的...
- `CURRVAL`和`NEXTVAL`与序列号相关,用于生成唯一标识。 - `LEVEL`在层次查询中使用,表示当前行在树状结构中的层级。 4. 数字函数: - 包括数学运算函数如`ABS()`返回绝对值,`MOD()`求余数,`SQRT()`计算...
- `CURRVAL`和`NEXTVAL`在Oracle中处理序列,SQL Server中使用`IDENT_CURRENT`和`IDENTITY`属性。 - `NULLIF`在Oracle和SQL Server中用于比较并返回NULL。 - `UID`、`SUSER_ID`、`USER_ID`、`USER`、`CURRENT_...
视图的限制包括不能选取`Currval`和`Nextval`伪列,以及在某些特定查询结构中不能执行DML操作,例如包含连接、集合运算符、组函数或分组语句的视图。此外,不推荐在视图上再创建视图,因为这可能会导致查询效率下降...
2. **伪列**:在SQL中,伪列如`currval`和`nextval`用于序列管理,提供当前或下一个序列值。`ROWID`是Oracle数据库中表示数据行精确存储位置的特殊列,通常用于定位特定的数据行。 3. **别名的使用**:别名可以为列...
§12.5 运算符和表达式(数据定义) 243 §12.5.1 关系运算符 243 §12.5.2 一般运算符 244 §12.5.3 逻辑运算符 244 §12.6 变量赋值 245 §12.6.1 字符及数字运算特点 245 §12.6.2 Boolean 赋值 245 §12.6.3 ...
在Oracle中,序列(sequence)用于生成一系列唯一的数字,常见的操作有序列的当前值(CURRVAL)和下一个值(NEXTVAL)。序列通常被用在主键字段的自增上。 6. Oracle的字符转换函数: 在Oracle中,字符转换函数如...
- `CURRVAL` 和 `NEXTVAL` 与序列号生成有关,用于获取当前值或下一个序列号。 - `LEVEL` 在递归查询中表示层次级别。 - `CONNECT_BY_ROOT` 在层次查询中用于标记根节点。 在实际使用中,理解并熟练掌握这些...
14. 序列对象:在Oracle中,序列是自动递增的数值,currval返回当前值,nextval递增并返回新值。ROWNUM是行号,不适用于序列,ROWID是行标识符。不使序列值增加的查询是(C)。 15. 游标属性:PL/SQL中的游标有%NOT...
- 使用序列:`NEXTVAL`获取下一个值;`CURRVAL`获取当前值。 3. **视图(View)**:虚拟表,基于一个或多个实际表或视图。 - 创建视图:`CREATE VIEW vw_x AS SELECT * FROM tbx [WITH CHECK OPTION];` - 删除...
- **使用序列**:使用`NEXTVAL`和`CURRVAL`获取序列的下一个值和当前值。 - **更改序列**:使用`ALTER SEQUENCE`语句修改序列属性。 以上内容覆盖了数据库整套开发技术的主要方面,从基本的数据查询到复杂的表...
在Oracle数据库编程中,简单表达式(Simple Expressions)...在实际应用中,简单的表达式经常与函数、运算符和条件语句结合,以满足更复杂的需求。熟悉并熟练掌握这些基本概念对于进行高效的Oracle数据库编程至关重要。
- **使用序列**:`SELECT 序列名.NEXTVAL FROM DUAL;` 或 `SELECT 序列名.CURRVAL FROM DUAL;` - **索引** - **索引的概念和分类**:索引用于加快数据检索速度,主要分为B树索引、位图索引等。 - **创建索引**:...
- **使用序列**:通过`NEXTVAL`和`CURRVAL`获取序列值。 - **删除序列**:使用`DROP SEQUENCE sequence_name;`删除序列。 #### 23. 存储过程、触发器和游标 - **存储过程**:预编译的SQL代码块,可以接受参数,返回...
日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...