Oracle 12c中如何查询Identity列的当前值(currval)
在Oracle 12c里要获取Identity列的当前值,有几个实用的方法,我给你拆解清楚:
1. 用
IDENTITY_CURRVAL函数(专门针对Identity列) Oracle为Identity列提供了专属的IDENTITY_CURRVAL函数,但使用前你得先找到该列背后绑定的系统序列名——因为Oracle的Identity列本质是自动创建了一个序列来生成值。
先查序列名:
SELECT sequence_name FROM user_tab_identity_cols WHERE table_name = 'YOUR_TABLE_NAME' AND column_name = 'YOUR_IDENTITY_COLUMN';
⚠️ 注意:Oracle默认对象名是大写的,如果创建表/列时用了双引号区分大小写,这里也要对应写对大小写。
拿到序列名后,直接调用函数获取当前值:
SELECT identity_currval('YOUR_SEQUENCE_NAME') FROM dual;
2. 直接查询序列的
CURRVAL 既然Identity列依赖序列,你也可以像操作普通序列一样,直接用序列的CURRVAL属性:
SELECT YOUR_SEQUENCE_NAME.currval FROM dual;
这个方法和上面的本质是一样的,只是调用形式不同,看你个人习惯。
3. 插入后立即返回(适合刚执行插入的场景)
如果你刚完成一条插入操作,还在当前会话里,用RETURNING子句可以直接拿到刚生成的Identity值,不用再查序列。
比如在PL/SQL块里:
DECLARE v_id NUMBER; BEGIN INSERT INTO your_table(other_column) VALUES('test_data') RETURNING your_identity_col INTO v_id; DBMS_OUTPUT.PUT_LINE('刚生成的ID是: ' || v_id); END; /
如果是在SQL*Plus或者SQL Developer里,也可以用变量接收:
VAR new_id NUMBER; INSERT INTO your_table(other_column) VALUES('test_data') RETURNING your_identity_col INTO :new_id; PRINT new_id;
重要注意事项
CURRVAL和IDENTITY_CURRVAL都只能在当前会话中使用,而且必须先执行过NEXTVAL(也就是至少插入过一条由系统生成Identity值的记录),否则会抛出"序列未在此会话中定义"的错误。- 如果你的Identity列是
GENERATED BY DEFAULT类型(允许手动插入值),手动插入的数值不会触发序列的NEXTVAL,这时候CURRVAL还是会返回序列上次生成的值,不是你手动插入的那个数,这点要特别留意。
内容的提问来源于stack exchange,提问作者tester tester
相关产品推荐
相关产品推荐

