Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在同一会话中此处不允许使用序列号_Oracle_Database Sequence - Fatal编程技术网

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

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中,您可

如何在同一会话中获取当前规则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中,您可以将生成的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中不那么微不足道。您假设序列值总是按顺序返回。他们不是。