2012-12-03 22 views
1

我在我的Oracle數據庫中有一個students表,它有一個名爲RECORD_NUMBER的字段。這個字段的長度是8個字符,我想創建一個觸發器,在插入時使用0 s填充左側部分。這是我到目前爲止有:導致無限循環的Oracle觸發器

create or replace 
TRIGGER STUDENTS_RECORD_NUMBER_TRG 
BEFORE INSERT OR UPDATE OF RECORD_NUMBER ON TBL_STUDENTS 
FOR EACH ROW 
BEGIN 
    WHILE length(:new.RECORD_NUMBER) < 9 
    LOOP 
     :new.RECORD_NUMBER := LPAD(:new.RECORD_NUMBER,8,'0'); 
    END LOOP; 
    NULL; 
END; 

然而,當我嘗試插入一行數據庫連接鎖起來,我必須重新啓動甲骨文再次使用它。這個觸發器可能導致無限循環嗎?

回答

2

如果record_numbervarchar2(8),那麼length(:new.record_number)將始終小於9,並且您的循環將無止境地迭代。但你並不需要一個循環這裏,只需撥打LPAD

create or replace TRIGGER STUDENTS_RECORD_NUMBER_TRG 
    BEFORE INSERT OR UPDATE OF RECORD_NUMBER 
    ON TBL_STUDENTS 
    FOR EACH ROW 
BEGIN 
    :new.RECORD_NUMBER := LPAD(:new.RECORD_NUMBER,8,'0'); 
END; 

這是假設,當然,它真的是有道理的墊物理存儲在數據庫中,而不是做類似應用LPAD數據在視圖層。一般來說,我認爲你最好在視圖中放置這種表示邏輯,因爲視圖對於實現表示邏輯非常有用。但是這個觸發器應該做你所問的。

+0

似乎不起作用,但是當插入一行時,它不會引發任何錯誤,觸發器無法填充記錄號。 –

+0

@JamesDawson - 「record_number」列的數據類型是什麼?它是「VARCHAR2(8)」還是「NUMBER」? –

0

將條目留爲數字。如果需要使用填充的零來顯示,則將其作爲顯示邏輯的一部分。