我對 Pl/SQL 有點陌生,我正在嘗試創建一個觸發器,該觸發器在每次插入表時都會向表中插入更多新值。例如,如果我將 12.01 插入表中,觸發器應將 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:
;
我無法弄清楚我哪里出錯了。請幫忙。謝謝!
uj5u.com熱心網友回復:
您的觸發器將導致無限回圈,因為每個插入都會導致觸發器觸發,這將執行更多插入,這將導致觸發器觸發,這將執行更多插入等。如果發生這種情況,Oracle 會注意到并終止回圈出現錯誤,盡管您可能首先超過了版本欄位的長度。但是,當您嘗試插入同一個表時,無論如何您都會在到達該點之前收到變異表錯誤。
是否可以用一個簡單的 Select 陳述句來做同樣的事情?
您可以使用一個使用分層查詢的插入陳述句來完成所有插入操作:
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,但您的觸發器只有 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<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/417695.html
標籤:
下一篇:消除SQL中相鄰的值
