1

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

select ID from rules where ID=rules_seq.currval

正在抛出错误:

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

4

4 回答 4

3

您应该在使用创建序列值时保存NEXTVAL它。

例如,如果NEXTVAL使用了,INSERT则有一个RETURNING INTO 子句用于此目的。

 INSERT INTO my_tab VALUES (seq.nextval, ...)
 RETURNING id INTO v_id;
于 2017-05-18T07:27:00.597 回答
0

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

select --+ index_desc (r)
ID 
from rules r 
where rownum=1
于 2017-05-18T06:25:45.393 回答
0

这是一个记录在案的序列限制,我们不能在 WHERE 子句中使用它们。在这里检查

有些人可能会感到惊讶的是,这延伸到子查询(也记录在案,正如@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> 
于 2017-05-18T06:13:29.830 回答
-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;
于 2017-05-18T06:02:48.460 回答