创建触发器以将新值插入 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
我是 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