手动转发序列 - oracle sql

Jer*_*emy 9 sql oracle plsql sequence

我需要转发一组只有DML访问的序列.由于一段代码中的错误,在没有序列的情况下抓取了几个值,而是手动抓取,所以现在序列正在复制这些值.所以,我想将序列推到最大值,以便下次调用nextval时,它会给出一个高于最大值的值.我有大约50个序列,每个序列都需要前进几千个.

只有DML访问才有可能吗?如果是这样,我应该怎么做呢?

Jus*_*ave 10

您可以使用动态SQL来执行此操作.例如,这段代码将从每个序列列表中选择下一个10,000个值.

DECLARE
  l_num INTEGER;
BEGIN
  FOR seq IN (select * 
                from all_sequences
                where sequence_name in (<<list of 50 sequences>>) 
                  and sequence_owner = <<owner of sequences>>)
  LOOP
    FOR i IN 1 .. 10000
    LOOP
      execute immediate 
         'select ' || seq.sequence_owner || '.' || seq.sequence_name || '.nextval from dual'
         into l_num;
    END LOOP;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

如果您能够针对序列发出DDL,则可以使用类似的方法将其设置INCREMENT为10,000,从序列中选择一个值,然后将其设置INCREMENT为1(或现在的任何值).


Don*_*gyi 8

您应该确定序列的下一个值与所需值之间的差异.所需的值通常是主键列的最大值(让我们将其命名为ID).

DECLARE
    maxid NUMBER;
    maxseq NUMBER;
    temp NUMBER;  -- without this variable Oracle would skip to query the sequence
BEGIN
    SELECT MAX(ID) INTO maxid FROM MYTABLE;
    SELECT MYSEQ.NEXTVAL INTO maxseq FROM DUAL;
    FOR i IN maxseq .. maxid LOOP
        SELECT MYSEQ.NEXTVAL INTO temp FROM DUAL;
    END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)