Oracle触发器导致无限循环

Oracle触发器导致无限循环,oracle,triggers,Oracle,Triggers,我的Oracle数据库中有一个students表,其中有一个名为RECORD\u NUMBER的字段。这个字段有8个字符长,我想创建一个触发器,在插入时用0s填充左侧部分。这就是我到目前为止所做的: 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

我的Oracle数据库中有一个
students
表,其中有一个名为
RECORD\u 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;
创建或替换
触发学生\u记录\u编号\u训练
在插入或更新TBL_学生的记录编号之前
每行
开始
而长度(:新的记录编号)<9
环
:new.RECORD_NUMBER:=LPAD(:new.RECORD_NUMBER,8,'0');
端环;
无效的
结束;

但是,当我尝试插入一行时,数据库连接会锁定,我必须重新启动Oracle才能再次使用它。此触发器是否可能导致无限循环?

如果
记录\u编号
varchar2(8)
,则
长度(:new.record\u编号)
将始终小于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
这样的操作是有意义的。一般来说,我认为最好将这种表示逻辑放在视图中,因为视图对于实现表示逻辑非常有用。但是这个触发器应该按照您的要求执行。

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

似乎不起作用,它不会引发任何错误,但是当插入一行时,触发器无法填充记录编号。@JamesDawson-记录编号列的数据类型是什么?它是一个
VARCHAR2(8)
还是一个
数字