[oracle] przekręcenie sekwencji

0

Zastanawiam się jakim zapytaniem można w Oracle przekręcić sekwencję, oczywiście oprócz bezpośredniego zwiększenia wartości sekwencji). Czy np. polecenie

connect by

może dać w jakichś określonych warunkach taki efekt?

0

Sekwencje Oracle nie udostępniają innych metod jak:
NEXTVAL - wygenerowanie kolejnej wartości sekwencji
CURRVAL - pobranie aktualnego stanu bufora sekwencji
Podana przez ciebie klauzula CONNECT BY jest elementem zapytań hierarchicznych i NIE MA nic wspólnego z sekwencjami. Istnieją trzy metody (przynajmniej taki przychodzą mi do głowy) na przesunięcie bufora sekwencji:

  1. Wywołanie metody NEXTVAL w pętli do określonej wartości. Rozwiązanie bardzo proste, nieeleganckie i nieoptymalne.
  2. Usunięcie sekwencji i utworzenie jej z pożądaną wartością przy pomocy klauzuli START WITH x. Rozwiązanie jeszcze gorsze i radykalniejsze od powyzszego.
  3. Napisanie własnej, uniwersalnej funkcji do przesuwania sekwencji do dowolnej wartości. Rozwiązanie najlepsze jakie może byc i takie proponuję wykorzystac - nie rozkompiluje obiektów i jest najbardziej optymalne. Poniżej zamieszczam źródło funkcji:

CREATE OR REPLACE PROCEDURE reset_sequence (
seq_name IN VARCHAR2
,startvalue IN PLS_INTEGER
)
AS
cval INTEGER;
inc_by VARCHAR2 (25);
BEGIN
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || seq_name || ' MINVALUE 0';

EXECUTE IMMEDIATE 'SELECT ' || seq_name || '.NEXTVAL FROM dual'
INTO cval;

cval := cval - startvalue + 1;

IF cval < 0 THEN
inc_by := ' INCREMENT BY ';
cval := ABS (cval);
ELSE
inc_by := ' INCREMENT BY -';
END IF;

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || seq_name || inc_by || cval;

EXECUTE IMMEDIATE 'SELECT ' || seq_name || '.NEXTVAL FROM dual'
INTO cval;

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || seq_name || ' INCREMENT BY 1';
END reset_sequence;
/

</email>
0

Dzięki za odpowiedź!
Tak też myślałem. Sęk jednak w tym, że sekwencja się przekręciła bez jawnego odwołania do niej, a przynajmniej nikt nie chce się do tego przyznać:P i stąd moje pytanie o "niejawne" zmienianie wartości sekwencji.

0

Jest jeszcze możliwość omyłkowego (ponownego) uruchomienia skryptu, w którym sekwencja tworzona jest następująco:

create or replace sequence .....

Wtedy zostanie utworzona na nowo z ustawieniami początkowymi.

0

... a może jakiś trigger, np przy dodawaniu rekordu?

0

sekwencja sama z siebie się nie zmienia!!! Musi to być robione z triggera/stored proc/select i ktoś to gdzieś musi wywoływać - jaki problem przeszukać źródła na obecność nazwy sekwencji?

1 użytkowników online, w tym zalogowanych: 0, gości: 1