如何在同一会话中获取当前规则ID,因为
select ID from rules where ID=rules_seq.currval
抛出错误:
ORA-02287:此处不允许使用序列号
答案 0 :(得分:3)
使用NEXTVAL
创建序列值时,保存。
例如,如果NEXTVAL
中INSERT
使用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;