Oracle 在同一会话中此处不允许使用序列号
如何在同一会话中获取当前规则id,因为Oracle 在同一会话中此处不允许使用序列号,oracle,database-sequence,Oracle,Database Sequence,如何在同一会话中获取当前规则id,因为 select ID from rules where ID=rules_seq.currval 正在抛出错误: ORA-02287:此处不允许使用序列号 也许你可以选择最高的ID select max(ID) from rules 这还可以解决一个问题,即并非序列生成的所有数字都实际用于记录中 另一方面,如果在会话中使用了序列。为什么不呢 select rules_seq.currval from dual 最后,如果这一切都发生在PLSQL中,您可
select ID from rules where ID=rules_seq.currval
正在抛出错误:
ORA-02287:此处不允许使用序列号
也许你可以选择最高的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;
这是一个记录在案的序列限制,我们不能在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是主键或其他索引,那个么可以使用索引降序来获取最大ID
select --+ index_desc (r)
ID
from rules r
where rownum=1
使用NEXTVAL创建序列值时,应保存该序列值
例如,如果在INSERT中使用NEXTVAL,则有一个用于此目的的返回INTO
INSERT INTO my_tab VALUES (seq.nextval, ...)
RETURNING id INTO v_id;
好吧,子研究中的排除也有记录,所以我会说这很尴尬,但并不奇怪。IMO的原因是整个查询必须保证在所有调用中传递相同的NEXTVAL;这在select seq.nextval a、seq.nextval b from dual中是微不足道的,但在select*select seq.nextval a from dual、select seq.nextval b from dual中不那么微不足道。您假设序列值总是按顺序返回。他们不是。