Plsql 遇到符号“}”&引用;当预期出现以下情况之一时:
我正在使用PL/SQLDeveloper来解释这个触发器,我在某处读到它可能是Oracle的cr-LF指令解释,但这是第一次发生这种情况。代码下面是错误日志:Plsql 遇到符号“}”&引用;当预期出现以下情况之一时:,plsql,Plsql,我正在使用PL/SQLDeveloper来解释这个触发器,我在某处读到它可能是Oracle的cr-LF指令解释,但这是第一次发生这种情况。代码下面是错误日志: 创建或替换触发器Terreno\u nomenc 在adminmo.terreno上更新保监会、部门、cod分区、nro分区、nro分区、nro分区之前 每行 声明 circ整数:=0; 扇区整数:=0; cod_div整数:=0; nro_div整数:=0; nro_par整数:=0; 努埃瓦·诺门克·瓦尔恰尔2(18):=''; v
创建或替换触发器Terreno\u nomenc
在adminmo.terreno上更新保监会、部门、cod分区、nro分区、nro分区、nro分区之前
每行
声明
circ整数:=0;
扇区整数:=0;
cod_div整数:=0;
nro_div整数:=0;
nro_par整数:=0;
努埃瓦·诺门克·瓦尔恰尔2(18):='';
vieja_nomenc varchar2(18):='';
多米尼奥整数:=0;
开始
vieja_nomenc:=:old.nomenc;
如果(:new.circ\u prov:old.circ\u prov)那么{
circ:=:new.circ\u prov;
}
否则{
circ:=:old.circ\u prov;
}
如果结束;
如果(:new.sector\u prov:old.sector\u prov)那么{
扇区:=:新的。扇区\u prov;
}
否则{
扇区:=:old.section\u prov;
}
如果结束;
如果(:new.cod\u div\u prov:old.cod\u div\u prov)那么{
cod\u div:=:new.cod\u div\u prov;
}
否则{
cod\u div:=:old.cod\u div\u prov;
}
如果结束;
如果(:new.nro\u div\u prov:old.nro\u div\u prov)那么{
nro_div:=:new.nro_div\u prov;
}
否则{
nro_div:=:old.nro_div\u prov;
}
如果结束;
如果(:new.nro_parc_prov:old.nro_parc_prov)那么{
nro_par:=:new.nro_parc_prov;
}
否则{
nro_par:=:old.nro_parc_prov;
}
如果结束;
如果(circ>0,扇区>0,cod\u div>0,nro\u div>0){
新词:=to|char(circ,'999')| |'-'| to|char(sector,'99')| |'-'| to|char(cod|div,'99')|'-'to|char(nro|div,'9999')| |-'to|char;
选择t.refnro进入dominio
来自geoimax.comodoro_ejido_dom_ref t
式中,t.reftex=vieja_nomenc;
更新terreno set nomenc=nueva_nomenc,其中terreno.subistema=:new.subistema和terreno.partida=:new.partida;
更新geoimax.com\u Ejido\u Dom\u Ref c set c.reftex=nueva\u nomenc,其中c.refnro=dominio;
}
如果结束;
结束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.
( 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
(begin case declare exit for goto if loop mod null pragma
使用时升高返回选择更新
PL/SQL中不使用花括号。代码中的{
或}
字符都是不需要的,并且都是语法错误。您需要删除所有这些字符
一旦这样做,您可能仍然会出现语法错误(因为您没有发布表定义,我们无法尝试修复触发器并验证它是否在我们的系统上编译)。但它们至少是不同的错误
仔细检查,触发器中似乎还有一个UPDATE
语句,该语句试图更新定义了行级触发器的表中的行。该触发器试图更新terreno
,并在表terreno
(除非在不同的模式中有两个名称相同的表,并且名称解析非常棘手)。当您尝试运行它时,这将引发一个变异表错误。您实际上是在尝试修改正在更新的当前行?还是在尝试更新表中的其他行?如果是后者,则强烈暗示数据模型不正确,因为这意味着一行中的数据依赖于表中其他行中的数据与基本规范化冲突的同一个表
如果您只是试图修改当前行中的数据,请不要使用更新
。只需修改:新建
伪记录即可
:new.nomenc := nueva_nomenc;
PL/SQL中不使用花括号。代码中的{
或}
字符都是不需要的,并且都是语法错误。您需要删除所有这些字符
一旦这样做,您可能仍然会出现语法错误(因为您没有发布表定义,我们无法尝试修复触发器并验证它是否在我们的系统上编译)。但它们至少是不同的错误
仔细检查,触发器中似乎还有一个UPDATE
语句,该语句试图更新定义了行级触发器的表中的行。该触发器试图更新terreno
,并在表terreno
(除非在不同的模式中有两个名称相同的表,并且名称解析非常棘手)。当您尝试运行它时,这将引发一个变异表错误。您实际上是在尝试修改正在更新的当前行?还是在尝试更新表中的其他行?如果是后者,则强烈暗示数据模型不正确,因为这意味着一行中的数据依赖于表中其他行中的数据与基本规范化冲突的同一个表
如果您只是试图修改当前行中的数据,请不要使用更新
。只需修改:新建
伪记录即可
:new.nomenc := nueva_nomenc;
两个错误:
{}应该删除大括号
然后错过了一个IF语句
创建或替换触发器terreno\u nomenc
在更新保监会、部门、cod部门、nro部门之前,
土地管理局副局长
每行
声明
circ整数:=0;
扇区整数:=0;
科德乌分区
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;
/