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?
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?
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:
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;
/
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.
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.
... a może jakiś trigger, np przy dodawaniu rekordu?
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?