在期待以下之一时遇到符号“}”:

时间:2013-09-20 14:13:34

标签: plsql

我正在使用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 文字:}

2 个答案:

答案 0 :(得分:3)

在PL / SQL中不使用花括号。您的代码中不需要{}个字符,并且所有字符都是语法错误。您需要删除所有这些字符。

一旦你这样做,你仍然可能会出现语法错误(因为你没有发布你的表定义,我们无法尝试修复触发器并验证它是否在我们的系统上编译)。但他们至少会有不同的错误。

仔细观察,您似乎在触发器中有一个UPDATE语句,该语句试图更新表中定义了行级触发器的行。触发器正在尝试更新terreno并在表terreno上定义(除非您在不同的模式中有两个具有相同名称的表,并且您在使用名称解析时非常棘手)。当你尝试运行它时,这会抛出一个变异表错误。您是否真的试图修改正在更新的当前行?或者您是否尝试更新表中的其他行?如果是后者,则强烈暗示数据模型不正确,因为这意味着一行中的数据依赖于同一表中违反基本规范化的其他行中的数据。

如果您只是想修改当前行中的数据,请不要使用UPDATE。只需修改:new伪记录。

:new.nomenc := nueva_nomenc;

答案 1 :(得分:2)

一些错误:

  1. {}应该删除花括号。
  2. 然后错过了其中一个IF声明。

  3. 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; 
    /