Plsql 遇到符号“}”&引用;当预期出现以下情况之一时:

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

我正在使用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):='';
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; 
    /