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 risposte

  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

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *