在同一会话中不允许使用序列号

时间:2017-05-18 05:54:33

标签: oracle database-sequence

如何在同一会话中获取当前规则ID,因为

select ID from rules where ID=rules_seq.currval

抛出错误:

  

ORA-02287:此处不允许使用序列号

4 个答案:

答案 0 :(得分:3)

使用NEXTVAL创建序列值时,保存

例如,如果NEXTVALINSERT使用RETURNING INTO,就会出现 INSERT INTO my_tab VALUES (seq.nextval, ...) RETURNING id INTO v_id; clause

import anotherscript

anotherscript.<function>("<user_input>")

答案 1 :(得分:0)

这是序列的文档限制,我们不能在WHERE子句中使用它们。 Check it here

有些人可能会感到惊讶的是,这延伸到子查询(也记录在案,如@MarmiteBomber指出的那样):

SQL> select * from t23
  2  where t23.id = (select s23.currval from dual)
  3  /
where t23.id = (select s23.currval from dual)
                           *
ERROR at line 2:
ORA-02287: sequence number not allowed here


SQL> 

当然总有PL / SQL,但不太方便。

SQL> set serveroutput on
SQL> declare
  2      n pls_integer;
  3      x pls_integer;
  4  begin
  5       n := s23.currval;
  6      select id into x
  7      from t23
  8      where id = n;
  9      dbms_output.put_line('x='||x);
 10  end;
 11  /
x=5

PL/SQL procedure successfully completed.

SQL> 

答案 2 :(得分:0)

如果 ID 主键或其他索引,您可以使用索引降序来获取最大ID

select --+ index_desc (r)
ID 
from rules r 
where rownum=1

答案 3 :(得分:-1)

也许您可以选择最高ID。

select max(ID) from rules

这也可以解决这个问题,即序列生成的所有数字都不会在记录中实际使用。

另一方面,如果在您的会话中使用了序列。为什么不

select rules_seq.currval from dual

最后,如果这一切都发生在PLSQL中,您可以将生成的ID返回到变量中:

declare
   l_id rules.id%type;
begin
  insert into rules (id) 
   values (rules_seq.nextval) 
  returning id into l_id;
end;

或在插入之前将序列值分配给变量。

declare
       l_id rules.id%type;
    begin
      l_id := rules_seq.nextval;
      insert into rules (id) 
       values (l_id);
    end;