我的Oracle数据库中有一个students
表,其中有一个名为RECORD_NUMBER
的字段。此字段长度为8个字符,我想创建一个触发器,在插入时用0
s填充左侧部分。这就是我到目前为止所做的:
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;
但是,当我尝试插入一行时,数据库连接会锁定,我必须重新启动Oracle才能再次使用它。这个触发器是否可能导致无限循环?
答案 0 :(得分:2)
如果record_number
是varchar2(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
这样的事情是有意义的。一般来说,我希望你能更好地将这种表示逻辑放在视图中,因为视图非常适合实现表示逻辑。但是这个触发器应该按照你的要求做。
答案 1 :(得分:0)
将条目保留为数字。如果需要使用填充零显示,则将其作为显示逻辑的一部分进行显示。