如何使用currval查询所有序列的名称及对应当前值
序列currval批量查询实现方案
注意:Oracle 中序列的
currval仅在**当前会话已调用过对应序列的nextval**后才会返回合法值,未调用过nextval的情况下直接查询会抛出ORA-08002错误。
方案1:已知序列名称直接拼接(适配你当前3个序列的场景)
不需要复杂逻辑,直接用UNION ALL拼接三个单序列查询语句即可,一条语句直接返回结果:
SELECT 'seq1' AS sequence_name, seq1.currval AS current_value FROM dual UNION ALL SELECT 'seq2' AS sequence_name, seq2.currval AS current_value FROM dual UNION ALL SELECT 'seq3' AS sequence_name, seq3.currval AS current_value FROM dual;
如果序列不在当前登录用户的schema下,需要在序列名前加schema前缀,例如your_schema.seq1.currval。
方案2:动态查询当前用户所有序列的currval
如果序列数量不固定、不想手动拼接查询语句,可以用动态SQL能力实现自动遍历查询:
SELECT sequence_name, TO_NUMBER(extractvalue(xmltype(dbms_xmlgen.getxml('select '||sequence_name||'.currval from dual')),'/ROWSET/ROW/CURRVAL')) AS current_value FROM user_sequences;
如果需要查询其他schema下的序列,将user_sequences替换为all_sequences,并添加WHERE owner = '目标SCHEMA名称大写'的过滤条件即可。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

