2009-09-03 59 views
4

我寫了一個PL/SQL腳本序列的值設置爲一個表的主鍵的最大值:如何在Oracle 10g PL/SQL中獲得序列的MINVALUE?

DECLARE 
    max_idn NUMERIC(18, 0); 
    seq_nextval NUMERIC(18, 0); 
    increment_amount NUMERIC(18, 0); 
BEGIN 
    SELECT MAX(mbr_idn) 
    INTO max_idn 
    FROM mbr; 

    SELECT mbr_seq.nextval 
    INTO seq_nextval 
    FROM DUAL; 

    increment_amount := max_idn - seq_nextval; 

    EXECUTE IMMEDIATE 
    'ALTER SEQUENCE mbr_seq 
    increment by ' || increment_amount; 
END; 

不過,我得到一個錯誤,如果該序列的MINVALUE比最大主鍵更大:

ORA-08004:序列MBR_SEQ.NEXTVAL低於MINVALUE和不能被實例化

ORA-06512:在第10行

說「通過increment_amount遞增序列,但不要低於MINVALUE」,最簡單的方法是什麼?

+1

呃,有沒有可能你目前的序列值高於表列中的最大值?如果不是這種情況,您可能需要將腳本更改爲僅更改序列。 – 2009-09-03 17:38:58

+1

另一件事是,請記住在選擇NEXTVAL一次後重置INCREMENT BY。 – APC 2009-09-04 08:41:53

回答

3

您可以查詢DBA_SEQUENCES表,以獲得MIN_VALUE

SELECT min_value 
    INTO l_min_value 
    FROM all_sequences 
WHERE sequence_name = 'MBR_SEQ' 
    AND owner = <<sequence owner>> 

然後,您可以將此主題融入你的代碼,即

increment_amount := GREATEST(max_idn, l_min_value) - seq_nextval; 
+0

有沒有其他方法可以做到這一點?不幸的是,我不認爲我們使用的用戶可以訪問dba_sequences視圖。 – 2009-09-03 17:16:32

+3

如果用戶可以使用序列(即具有SELECT權限),那麼它將出現在ALL_SEQUENCES視圖中。 – dpbradley 2009-09-03 17:29:35

+0

@dpbradley - 好點。修改代碼以代替使用ALL_SEQUENCES。 – 2009-09-03 19:01:06