CREATE OR REPLACE TRIGGER "TRG_T_QUERY_LIST_CATEGORY_ITEM" BEFORE
INSERT ON "T_QUERY_LIST_CATEGORY_ITEM" FOR EACH ROW
BEGIN
IF :NEW.CATEGORY_ITEM_ID > 0 THEN
NULL;
ELSE
SELECT SQE_T_QUERY_LIST_CATEGORY_ITEM.NEXTVAL
INTO :NEW.CATEGORY_ITEM_ID
FROM DUAL;
END IF;
END;
这个触发器我是用程序生成的,但编译不通过,提示
TRIGGER ZJJCJG.TRG_T_QUERY_LIST_CATEGORY_ITEM 编译错误错误: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> << close current delete fetch lock insert
          open rollback savepoint set sql execute commit forall merge
          pipe
       符号 "" 被忽略。
行:3
文本:BEGIN错误: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> << close current delete fetch lock insert
          open rollback savepoint set sql execute commit forall merge
          pipe
行:4
文本:IF :NEW.CATEGORY_ITEM_ID>0 THEN
用pl/sql直接编译提示这个错误,但打开编辑再编译就可以了,看代码是一模一样的

解决方案 »

  1.   

    关键看不出来啊哪里有特殊字符啊,在PL/SQL 按F8 编译通过,但在触发器上右键 重新编译 也出错
      

  2.   


    SELECT SQE_T_QUERY_LIST_CATEGORY_ITEM.NEXTVAL
                INTO :NEW.CATEGORY_ITEM_ID
                FROM DUAL;
    --改成
    :NEW.CATEGORY_ITEM_ID:= SQE_T_QUERY_LIST_CATEGORY_ITEM.NEXTVAL;
      

  3.   

    我试了下没问题,触发器上右键 重新编译也是好的
    create or replace
    TRIGGER "TRG_T_QUERY_LIST_CATEGORY_ITEM" BEFORE
    INSERT ON "EMP" FOR EACH ROW
    BEGIN
        IF :NEW.EMPNO > 0 THEN
            NULL;
        ELSE
            SELECT t_x_seq.NEXTVAL
                INTO :NEW.EMPNO
                FROM DUAL;
        END IF;
    END;那个,SQE_T_QUERY_LIST_CATEGORY_ITEM对吗?不是SEQ_T...?
      

  4.   

    我是用.Net写的
                    string newTirger = ("TRG_" + TableName).ToUpper();
                    sb.AppendLine("CREATE OR REPLACE TRIGGER \"" + newTirger + "\" BEFORE");
                    sb.AppendLine("INSERT ON \"" + TableName + "\" FOR EACH ROW");
                    sb.AppendLine("BEGIN");
                    sb.AppendLine(" IF :NEW."+IdentityField+" > 0 THEN");
                    sb.AppendLine(" NULL;");
                    sb.AppendLine(" ELSE");
                    sb.AppendLine(" SELECT " + newSequence + ".NEXTVAL");
                    sb.AppendLine("   INTO :NEW." + IdentityField + "");
                    sb.AppendLine("   FROM DUAL;");
                    sb.AppendLine(" END IF;");
                    sb.AppendLine("END;");
      

  5.   

    create or replace
    TRIGGER "TRG_T_QUERY_LIST_CATEGORY_ITEM" BEFORE
    INSERT ON "EMP" FOR EACH ROW
    BEGIN
        IF :NEW.EMPNO a<= 0 THEN
                   SELECT t_x_seq.NEXTVAL
                INTO :NEW.EMPNO
                FROM DUAL;
        END IF;
    END;
      

  6.   

    好像是oracle触发器名称和表名不用加引号
      

  7.   

    知道了,因为多了.net里的换行