创建触发器以将新值插入 table

Create trigger to insert new values into table

我是 Pl/SQL 的新手,我正在尝试创建一个触发器,在每次插入 table 时都会将更多新值插入 table。 例如,如果我将 12.01 插入 table,触发器应将 12.01A、12.01B、12.01C 插入其中。

这看起来很简单,我创建了以下触发器,但我遇到了很多错误。

create or replace trigger "BUILDRELEASEVERSIONS_T1" 
AFTER 
insert or update on "BUILDRELEASEVERSIONS" 
for each row 
begin 
DECLARE  
i number(1); 
v_version BuildReleaseVersions.version%TYPE; 
BEGIN  
v_version := :NEW.version; 
FOR i IN 1..5  
LOOP  
Insert into BuildReleaseVersions values  
(case  
when i=1 then concat(v_version,'B') 
when i=2 then concat(v_version,'C') 
end); 
end LOOP; 
end; 
end;

我得到的错误是:

Errors: TRIGGER BUILDRELEASEVERSIONS_T9
Line/Col: 8/1 PL/SQL: SQL Statement ignored
Line/Col: 12/7 PL/SQL: ORA-00933: SQL command not properly ended
Line/Col: 14/3 PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
;

我不知道我哪里出了问题。请帮忙。谢谢!

您的触发器将导致无限循环,因为每次插入都会导致触发器触发,这将执行更多插入,这将导致触发器触发,这将执行更多插入,等等。如果发生这种情况,Oracle 将注意并以错误终止循环,尽管您可能首先超过了版本字段的长度。但是当你试图插入同一个 table 时,你会在到达那个点之前得到变异的 table 错误。

is it possible to do this same thing with a simple Select statement?

您可以使用一个使用分层查询的插入语句完成所有插入:

insert into buildreleaseversions (version)
select '12.01' || case level when 1 then null else chr(63 + level) end
from dual
connect by level <= 4

查询生成4行,从级别限制;对于每一行,它都会根据级别向基本“12.01”值附加一些内容 - 对于级别,它不附加任何内容,对于其余部分,它会根据 ASCII 范围内的偏移量生成一个字母。 'A'为字符65,B为66,C为67;所以这些可以通过将级别 (2, 3, 4) 添加到固定值 63.

你的问题是后缀A到C,但是你的trigger只有B和C;如果你不想要 A 那么稍微调整一下:

insert into buildreleaseversions (version)
select '12.01' || case level when 1 then null else chr(64 + level) end
from dual
connect by level <= 3

db<>fiddle