create or replace trigger "KINGLOG_LOGNUM_TRG"
  after insert on "KINGLOG"
  for each row
  
when (NEW.lognum = 10)
BEGIN
  declare
    ks_lockip varchar2(4000);
    CURSOR ks_lockip_cur IS
      SELECT lockip from kingsystem where rownum = 1;
  begin
    open ks_lockip_cur;
    loop
      FETCH ks_lockip_cur
        INTO ks_lockip;
      EXIT WHEN ks_lockip_cur%NOTFOUND;
    end loop;
    close ks_lockip_cur;
  end;
    set ks_lockip = ' + @ks_lockip + ' + ' + :NEW.ip + ';   /*该句报错ORA-00922: missing or invalid option*/
  BEGIN
    UPDATE kingsystem SET lockip = ' + @ks_lockip + ';
  END;
END;

解决方案 »

  1.   

    本帖最后由 wildwave 于 2010-04-07 09:05:41 编辑
      

  2.   

    set ks_lockip = ' + @ks_lockip + ' + ' + :NEW.ip + '; /*该句报错ORA-00922: missing or invalid option*/
    ks_lockip := ks_lockip||:NEW.ip; 
      

  3.   

    连接字符串另外可以使用concat函数
    SQL> select concat('abc','def') from dual;CONCAT
    ------
    abcdefSQL> select 'abc'||'def' from dual;'ABC'|
    ------
    abcdefSQL> 
      

  4.   

    set ks_lockip =ks_lockip  || :NEW.ip ; /*该句报错ORA-00922: missing or invalid option*/
      BEGIN
      UPDATE kingsystem SET lockip = ks_lockip ;
      

  5.   

    我改成ks_lockip := ks_lockip||:NEW.ip;
    这次提示PLS-00201: identifier 'KS_LOCKIP' must be declared
    是不是我申明错了啊
    declare
        ks_lockip varchar2(4000);
        CURSOR ks_lockip_cur IS
          SELECT lockip from kingsystem where rownum = 1;
      begin
      

  6.   

    set ks_lockip = ' + @ks_lockip + ' + ' + :NEW.ip + '; /*该句报错ORA-00922: missing or invalid option*/
      BEGIN
      UPDATE kingsystem SET lockip = ' + @ks_lockip + ';
      END;sqlserver 的写法,改成:ks_lockip := ks_lockip || :NEW.ip;
      BEGIN
      UPDATE kingsystem SET lockip = ks_lockip;
      END;
      

  7.   

    create or replace trigger "KINGLOG_LOGNUM_TRG"
      after insert on "KINGLOG"
      for each row
       
    when (NEW.lognum = 10)
    BEGIN
      declare
      ks_lockip varchar2(4000);
      CURSOR ks_lockip_cur IS
      SELECT lockip from kingsystem where rownum = 1;
      begin
      open ks_lockip_cur;
      loop
      FETCH ks_lockip_cur
      INTO ks_lockip;
      EXIT WHEN ks_lockip_cur%NOTFOUND;
      end loop;
      close ks_lockip_cur;
       ks_lockip := ks_lockip ||:NEW.ip; /*该句报错ORA-00922: missing or invalid option*/
      UPDATE kingsystem SET lockip = ks_lockip ;
    END;
      

  8.   

    我改成ks_lockip := ks_lockip||:NEW.ip;
    这次提示PLS-00201: identifier 'KS_LOCKIP' must be declared
    是不是我申明错了啊
    declare
      ks_lockip varchar2(4000);
      CURSOR ks_lockip_cur IS
      SELECT lockip from kingsystem where rownum = 1;
      begin
      

  9.   

    create or replace trigger "KINGLOG_LOGNUM_TRG"
      after insert on "KINGLOG"
      for each row
        
    when (NEW.lognum = 10)
    BEGIN   --去掉
      declare
      ks_lockip varchar2(4000);
      CURSOR ks_lockip_cur IS
      SELECT lockip from kingsystem where rownum = 1;
    begin
      open ks_lockip_cur;
      loop
      FETCH ks_lockip_cur
      INTO ks_lockip;
      EXIT WHEN ks_lockip_cur%NOTFOUND;
      end loop;
      close ks_lockip_cur;
      ks_lockip := ks_lockip ||:NEW.ip; /*该句报错ORA-00922: missing or invalid option*/
      UPDATE kingsystem SET lockip = ks_lockip ;
    END;
      

  10.   

    create or replace trigger "KINGLOG_LOGNUM_TRG"
      after insert on "KINGLOG"
      for each row
       
    when (:NEW.lognum = 10)
      declare
      ks_lockip varchar2(4000);
      CURSOR ks_lockip_cur IS SELECT lockip from kingsystem where rownum = 1;
      begin
      open ks_lockip_cur;
      loop
      FETCH ks_lockip_cur INTO ks_lockip;
      EXIT WHEN ks_lockip_cur%NOTFOUND;
      end loop;
      close ks_lockip_cur;
      
      ks_lockip :=ks_lockip||:NEW.ip; /*该句报错ORA-00922: missing or invalid option*/  UPDATE kingsystem SET lockip =ks_lockip;END;
      

  11.   

    create or replace trigger "KINGLOG_LOGNUM_TRG"
      after insert on "KINGLOG"
      for each row
      when (:NEW.lognum = 10)
    declare
      ks_lockip varchar2(4000);
      CURSOR ks_lockip_cur IS
        SELECT lockip from kingsystem where rownum = 1;
    begin
      open ks_lockip_cur;
      loop
        FETCH ks_lockip_cur
          INTO ks_lockip;
        EXIT WHEN ks_lockip_cur%NOTFOUND;
      end loop;
      close ks_lockip_cur;
      ks_lockip := ks_lockip || :NEW.ip;
      UPDATE kingsystem SET lockip = ks_lockip;
    END;
    我改了以后,整个语句如上,却还是报错,实在是郁闷
    PLS-00103: Encountered the symbol "KS_LOCKIP"
    PLS-00103: Encountered the symbol "KS_LOCKIP"
    PLS-00103: Encountered the symbol ";" when expecting one of the following:
              . ( ) , * @ % & = - + < / > at in is mod remainder not rem
              <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
              LIKE4_ LIKEC_ between || indicator member SUBMULTISET_
    PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
           
              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> << close current delete fetch lock insert
              open rollback savepoint set sql execute commit forall merge
              pipe
      

  12.   

    PL/SQL中的赋值是“:=”,而不是“="
    ks_lockip :=ks_lockip||:NEW.ip; 这句最好用个连接函数concat就好了