我如何在同一个会话中获取当前规则 ID,因为
select ID from rules where ID=rules_seq.currval
正在抛出错误:
ORA-02287: 此处不允许序列号
我如何在同一个会话中获取当前规则 ID,因为
select ID from rules where ID=rules_seq.currval
正在抛出错误:
ORA-02287: 此处不允许序列号
您应该在使用创建序列值时保存NEXTVAL
它。
例如,如果NEXTVAL
使用了,INSERT
则有一个RETURNING INTO
子句用于此目的。
INSERT INTO my_tab VALUES (seq.nextval, ...)
RETURNING id INTO v_id;
如果ID是主键或其他索引,您可以使用索引降序来获取最大 ID
select --+ index_desc (r)
ID
from rules r
where rownum=1
这是一个记录在案的序列限制,我们不能在 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>
也许你可以选择最高的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;