我正在使用PL / SQL开发人员来处理这个触发器,我在某处读到它可能是Oracle的CR-LF错误解释,但这是第一次发生这种情况。代码下面是错误日志:
create or replace trigger Terreno_nomenc
before update of circ_prov,sector_prov,cod_div_prov,nro_div_prov,nro_parc_prov on adminmo.terreno
for each row
declare
circ integer:= 0;
sector integer:= 0;
cod_div integer:= 0;
nro_div integer:= 0;
nro_par integer:= 0;
nueva_nomenc varchar2(18) := ' ';
vieja_nomenc varchar2(18) := ' ';
dominio integer:= 0;
begin
vieja_nomenc:= :old.nomenc;
if (:new.circ_prov <> :old.circ_prov) then {
circ := :new.circ_prov;
}
else {
circ := :old.circ_prov;
}
end if;
if(:new.sector_prov <> :old.sector_prov) then {
sector := :new.sector_prov;
}
else {
sector := :old.sector_prov;
}
end if;
if(:new.cod_div_prov <> :old.cod_div_prov) then {
cod_div := :new.cod_div_prov;
}
else{
cod_div := :old.cod_div_prov;
}
end if;
if(:new.nro_div_prov <> :old.nro_div_prov) then {
nro_div := :new.nro_div_prov;
}
else{
nro_div := :old.nro_div_prov;
}
end if;
if(:new.nro_parc_prov <> :old.nro_parc_prov) then {
nro_par := :new.nro_parc_prov;
}
else{
nro_par := :old.nro_parc_prov;
}
end if;
if(circ > 0 and sector > 0 and cod_div > 0 and nro_div > 0) {
nueva_nomenc := to_char(circ,'999') || '-' || to_char(sector,'99') || '-' || to_char(cod_div,'99') || '-' || to_char(nro_div,'9999') || '-' || to_char(nro_par, '999');
select t.refnro into dominio
from geoimax.comodoro_ejido_dom_ref t
where t.reftex = vieja_nomenc;
update terreno set nomenc = nueva_nomenc where terreno.subsistema = :new.subsistema and terreno.partida = :new.partida;
update geoimax.Comodoro_Ejido_Dom_Ref c set c.reftex = nueva_nomenc where c.refnro = dominio;
}
end if;
end Terreno_nomenc;
错误:PLS-00103:遇到以下任何一种情况时遇到符号“{”:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
The symbol "begin was inserted before "{" to continue.
行:19 文字:if(:new.circ_prov&lt;&gt;:old.circ_prov)然后{
错误:PLS-00103:遇到以下其中一项时遇到符号“}”:
( begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
线:21 文字:}
答案 0 :(得分:3)
在PL / SQL中不使用花括号。您的代码中不需要{
或}
个字符,并且所有字符都是语法错误。您需要删除所有这些字符。
一旦你这样做,你仍然可能会出现语法错误(因为你没有发布你的表定义,我们无法尝试修复触发器并验证它是否在我们的系统上编译)。但他们至少会有不同的错误。
仔细观察,您似乎在触发器中有一个UPDATE
语句,该语句试图更新表中定义了行级触发器的行。触发器正在尝试更新terreno
并在表terreno
上定义(除非您在不同的模式中有两个具有相同名称的表,并且您在使用名称解析时非常棘手)。当你尝试运行它时,这会抛出一个变异表错误。您是否真的试图修改正在更新的当前行?或者您是否尝试更新表中的其他行?如果是后者,则强烈暗示数据模型不正确,因为这意味着一行中的数据依赖于同一表中违反基本规范化的其他行中的数据。
如果您只是想修改当前行中的数据,请不要使用UPDATE
。只需修改:new
伪记录。
:new.nomenc := nueva_nomenc;
答案 1 :(得分:2)
一些错误:
CREATE OR replace TRIGGER terreno_nomenc
BEFORE UPDATE OF circ_prov, sector_prov, cod_div_prov, nro_div_prov,
nro_parc_prov ON adminmo.terreno
FOR EACH ROW
DECLARE
circ INTEGER := 0;
sector INTEGER := 0;
cod_div INTEGER := 0;
nro_div INTEGER := 0;
nro_par INTEGER := 0;
nueva_nomenc VARCHAR2 ( 18 ) := ' ';
vieja_nomenc VARCHAR2 ( 18 ) := ' ';
dominio INTEGER := 0;
BEGIN
vieja_nomenc := :OLD.nomenc;
IF ( :NEW.circ_prov <> :OLD.circ_prov ) THEN
circ := :NEW.circ_prov;
ELSE
circ := :OLD.circ_prov;
END IF;
IF ( :NEW.sector_prov <> :OLD.sector_prov ) THEN
sector := :NEW.sector_prov;
ELSE
sector := :OLD.sector_prov;
END IF;
IF ( :NEW.cod_div_prov <> :OLD.cod_div_prov ) THEN
cod_div := :NEW.cod_div_prov;
ELSE
cod_div := :OLD.cod_div_prov;
END IF;
IF ( :NEW.nro_div_prov <> :OLD.nro_div_prov ) THEN
nro_div := :NEW.nro_div_prov;
ELSE
nro_div := :OLD.nro_div_prov;
END IF;
IF ( :NEW.nro_parc_prov <> :OLD.nro_parc_prov ) THEN
nro_par := :NEW.nro_parc_prov;
ELSE
nro_par := :OLD.nro_parc_prov;
END IF;
IF ( circ > 0
AND sector > 0
AND cod_div > 0
AND nro_div > 0 ) THEN
nueva_nomenc := To_char (circ, '999')
|| '-'
|| To_char (sector, '99')
|| '-'
|| To_char (cod_div, '99')
|| '-'
|| To_char (nro_div, '9999')
|| '-'
|| To_char (nro_par, '999');
SELECT T.refnro
INTO dominio
FROM geoimax.comodoro_ejido_dom_ref T
WHERE T.reftex = vieja_nomenc;
UPDATE terreno
SET nomenc = nueva_nomenc
WHERE terreno.subsistema = :NEW.subsistema
AND terreno.partida = :NEW.partida;
UPDATE geoimax.comodoro_ejido_dom_ref C
SET C.reftex = nueva_nomenc
WHERE C.refnro = dominio;
END IF;
END terreno_nomenc;
/