Newsgroup: it.comp.lang.delphi
Titolo: Sequenza Oracle

Salve a tutti,
il mio problema riguarda l'utilizzo di una sequenza oracle come
contatore.
Allora, con delphi 6, ho creato un servizio che, con un timer, riparte
ogni giorno per fare dei recuperi di file da un server, controlla la
dimensione dei file copiati e li inserisce in un dvd fino al
raggiungimento della dimensione del dvd: quando la raggiunge "chiude"
il dvd vecchio e ne crea uno nuovo.
Con una sequenza Oracle gestisco il nome del dvd del tipo "DVDn" dove n
è la sequenza.
La sequenza è usata in una stored procedure per creare il nuovo nome
del dvd:
PROCEDURE        "CREATEDVD" (  aParola in varchar2  //variabile non
usata
)
as
begin
declare
a number;
begin
  SELECT DVDLABEL_SEQ.nextval into a FROM dual;
  Insert into DVD(LABEL) values ('DVD'||a);
end;
end;
Il problema è che, fino a quando il servizio lavora di continuo, il
nome è gestito correttamente e si incrementa bene (DVD1, DVD2, DVD3
....).
Quando il servizio termina il lavoro del giorno, alla ripartenza del
giorno successivo tramite timer, il nuovo nome sarà errato. Avviene un
salto al primo valore della decina pari successiva: se ero a DVD1 (o 2
o 3 ...) avrò DVD21, se ero a DVD21 (o 22 o 23 ...) diventa DVD41, se
ero a DVD41 diventa DVD61 e così via.
Utilizzo i componenti ODBCExpress e accedo ad Oracle con un driver
Microsoft ODBC per Oracle.
Qualcuno ha mai incontrato un comportamento di questo tipo? Sapete
indirizzarmi verso una soluzione (ad esempio mi conviene abbandonare la
sequenza e usare "a mano" un contatore?
Grazie mille
Saluti
Matteo

sequenza e usare "a mano" un contatore?
Le sequenze non devono mai essere usate per scopi in cui sia
indispensabile non avere interruzioni.  Il sistema è difatti libero di
scegliere come generare il prossimo numero (che non deve
necessariamente essere l'ultimo+1).  Difatti, le "sequence" vengono
perlopiù usate per *identificare*, non per *numerare*.  Quindi la
risposta è: sì, devi usare un tuo contatore.
In ogni caso la tua domanda non ha nulla a che vedere con Delphi; il
fatto che tu abbia sviluppato il programma in Delphi 6 non giustifica
l'aderenza del tuo problema al "topic" del gruppo. La prossima volta
fai un po' più di attenzione.

 sequenza e usare "a mano" un contatore?
Imho, questo modo di pensare è errato...
La spinta al cambiamento deve venir da qualcosa di valido e oggettivo,
non da un comportamento anomalo che potrebbe essere spiegato da un bug
del tuo codice.
Io proverei a loggare ogni chiamata alla stored procedure, al fine di
verificare se il tuo servizio la richiama + volte di cio che tu ti
aspetti.
inoltre, 6 sicuro che quella particolare sequence sia utilizzata solo
dal tuo servizio?
Dulcis in fundo, hai verificato se la tecnologia che utilizzi per
accedere al db è compatibile con la versione di oracle che stai
utilizzando?
Ricordo che i doa per 8i facevano cose strane se li usavi su 9i....
A.

Grazie ad entrambi.
In effetti il post era sicuramente un po' fuori tema e + inerente ad un
newsgroup sui db e su oracle, mi scuso.
Per il resto la decisione di cambiare, per di più ora giustificata da
quanto detto da Andrea, era già motivata dall'aver monitorato da un
po' il problema. Non ho mai trovato chiamate supplementari alla stored
procedure, la sequenza è usata solo dal mio servizio e soprattutto il
tipo di "salto" mi ha convinto che il problema non sia un bug del mio
sw. Per la tecnologia di accesso diciamo che non mi fido per altri
errori "strani" del driver Microsoft ODBC ma anche con il driver della
Oracle ho incontrato problemi (l'accesso via ODBC me lo devo al momento
tenere a meno di grosse revisioni, per ora infattibili).
Grazie ancora
Saluti
Matteo

sw.
Attenzione al fatto che le sequence, in Oracle, possono essere create
con un'opzione CACHE.  In questo caso, il sistema precalcola i valori
della sequence.  In caso di problemi di qualsiasi tipo, i valori
precalcolati vengono "bruciati", per cui il sistema inizia a
rinumerare lasciando un "gap" nella sequenza.

Verissimo!! In effetti ho controllato ed era impostata (di default,
diciamo che non sapevo neanche cosa fosse...) l'opzione della cache
predefinita che è di 20 valori: ecco perchè i salti a 21, poi 41, poi
61...
Grazie mille, si impara sempre qualcosa con voi!
Saluti
Matteo