Come verificare Oracle sequenze

Abbiamo un cliente che fa {qualcosa}, e dopo che alcuni dei nostri sequenze sono di ritorno numeri che sono già stati utilizzati. Mentre lungo termine risposta sarebbe per loro di smettere di fare {qualcosa}, ho bisogno di un modo semplice per controllare le sequenze contro le tabelle in cui vengono utilizzate.

Posso query user_sequences per ottenere il last_number per ogni sequenza e posso ottenere il max(id_number) per ogni tabella. Ma quando cerco di fare entrambe nella stessa query ottengo valori null indietro.

Mio rotto SQL è:

select max(last_number) , max(id_number) from user_sequences,
squiggly.ACCOUNT_CODE_DEFINITION where sequence_name = 'ACCOUNT_CODE_DEFINITION_SEQ' 
and sequence_owner = 'SQUIGGLY' ;
Io odio quando i clienti non {qualcosa}. E la mancanza di un motivo per farlo!
Forse si potrebbe fare, {qualcosa} per il cliente, più volte, fino a quando smettono di fare {qualcosa}.

OriginaleL’autore Jon Strayer | 2011-01-04

4 Replies
  1. 4

    si può ottenere il massimo da entrambe le tabelle con questa query:

    SELECT (SELECT last_number
              FROM all_sequences
             WHERE sequence_name = 'ACCOUNT_CODE_DEFINITION_SEQ'
               AND sequence_owner = 'SQUIGGLY') max_sequence,
           (SELECT MAX(id_number) 
              FROM squiggly.ACCOUNT_CODE_DEFINITION) max_id_number
      FROM dual
    Grazie Vincent, che era esattamente quello che mi serviva.
    Non ci può essere più di una sequenza, con lo stesso nome e lo stesso proprietario, senza necessità di MAX per last_number.
    Così si potrà restituire la stessa risposta ? 🙂 corretto

    OriginaleL’autore Vincent Malgrat

  2. 4

    Vorrei suggerire di non fidarsi mai dei “last_number” di user_sequences perché se la Cache è attivata durante la creazione della sequenza , quindi il last_number è probabile che contengono un valore superiore al valore corrente di sequenza.

    Beh ,ho usato i passaggi qui sotto

    1) select <seq_name>.nextval from dual;
    
    2) select <seq_name>.currval from dual;

    Dal momento che u non può eseguire currval solo per la prima volta , così ho eseguito nextval prima.

    SQL> create sequence seq;
    
    Sequence created.
    
    SQL> select last_number from user_sequences;
    
    LAST_NUMBER
    -----------
              1
    
    SQL> select seq.nextval from dual;
    
       NEXTVAL
    ----------
             1
    
    SQL> select seq.currval from dual;
    
       CURRVAL
    ----------
             1
    
    SQL> select last_number from user_sequences;
    
    LAST_NUMBER
    -----------
             21
    
    SQL> select seq.currval from dual;
    
       CURRVAL
    ----------
             1
    Se le lacune nella sequenza causare problemi, quindi c’è già qualcosa di sbagliato nella progettazione dell’applicazione.

    OriginaleL’autore rishwinger

  3. 1

    seq.nextval funzionerà, ma anche incrementare la sequenza. Se hai già chiamato nextval nella sessione corrente è possibile chiamare seq.currval.

    Se si chiama currval prima di chiamare nextval verrà generata un’eccezione.

    Farei:

    select last_number from user_sequences where sequence_name = 'seq'

    OriginaleL’autore ssedano

  4. 0

    tenta di utilizzare seq.nextval 🙂

    Occhiata qui : http://www.techonthenet.com/oracle/sequences.php

    Non è una buona pratica di utilizzare Max (nel caso dell’ultima riga sono beed eliminati !).

    -1: NEXTVAL vi anticipo la sequenza — si desidera utilizzare CURRVAL, ma questo non significa che qualcuno non eseguire qualcosa per far avanzare la sequenza intorno allo stesso tempo.

    OriginaleL’autore ykatchou

Lascia un commento