2015-01-06 56 views
0

我對Oracle不太熟悉,但我已經爲我的應用程序編寫了一個觸發器,用於使用序列爲記錄生成編號。我遇到的問題是,這些數字可能已經在使用中,我想添加一個檢查以確保數字是否已被使用,以選擇序列中可用的下一個數字。這是否可以首先完成,如果是這樣,任何援助將非常感激?Oracle序列觸發器

DROP TRIGGER COMPLAIN_TRG_ENQUIRYNO; 
CREATE OR REPLACE TRIGGER COMPLAIN_TRG_ENQUIRYNO 
BEFORE INSERT 
ON COMPLAIN REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
DECLARE 
    l_enquiry_no_end complain.enquiry_no_end%TYPE; 
BEGIN  
    SELECT seq_enquiryno.NEXTVAL INTO l_enquiry_no_end FROM dual; 
    IF :NEW.ENQUIRY_NO_END = ' ' THEN 
     :NEW.ENQUIRY_NO_END := l_enquiry_no_end; 
    END IF;  
EXCEPTION 
    WHEN OTHERS THEN 
     -- Consider logging the error and then re-raise 
     RAISE; 
END ; 
+4

您不應該使用手動分配的ID從序列中自動分配ID。如果您有已手動分配的現有記錄,並且想要爲所有新記錄開始自動分配,則可以開始高於所有現有值的序列,因此不會有重疊。 (除非您打算處理它,否則您不應該發現異常;只需重新提升即可隱藏問題的原始位置)。 –

+0

感謝您的回覆和幫助Alex!這些號碼不僅僅作爲客戶參考號碼用作ID。你是否仍然建議不要混合,並開始在更高的數字範圍? – JaneyD

+0

如果混合,那麼手動和自動設置都必須處理衝突。只有一種機制更簡單。 –

回答

0

不要使用順序是在現有的列(數字)數據,這可能會導致重複。從空開始並使用序列,或者如果您確實卡住,請查找您擁有的最大pk並重置序列的startswith屬性。

或者,你可以使用GUID而不是GUID,它具有始終全局唯一的優勢 - 在觸發器中調用sys_guid()函數。儘管如此,它們可能會導致其他問題。