1

我的 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 才能再次使用它。这个触发器是否有可能导致无限循环?

4

2 回答 2

2

如果record_number是 a 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在视图层中应用这样的事情。一般来说,我希望将这种表示逻辑放在视图中会更好,因为视图非常适合实现表示逻辑。但是这个触发器应该做你所要求的。

于 2012-12-03T15:26:12.087 回答
0

将条目保留为数字。如果需要使用填充零显示,则将其作为显示逻辑的一部分。

于 2012-12-03T15:32:26.790 回答