Oracle DB触发器编译时出现警告。没有错误可用

时间:2013-07-29 09:00:29

标签: sql oracle plsql triggers compilation

这是我的第一个db触发器。它编译警告,因此不起作用。我重新阅读了Oracle文档并在线搜索但无法解决我出错的地方。感谢下面对我的触发器的任何帮助。

    CREATE OR REPLACE TRIGGER oa_mhd_update AFTER
      INSERT ON men_mhd FOR EACH row WHEN (new.mhd_tktc LIKE 'OA_A_%'
        OR new.mhd_tktc LIKE 'OA_T_%'
        OR new.mhd_tktc LIKE 'OA_M_%') 
      DECLARE seq_var NVARCHAR2 (20);
      BEGIN
        SELECT (MAX (seq) + 1) into seq_var FROM oa_mhd_data;
        INSERT
        INTO oa_mhd_data
          (
            mhd_code,
            seq,
            mhd_mst1,
            mhd_mst2,
            mhd_cred,
            mhd_cret,
            mhd_tsks,
            mhd_msgs,
            mhd_tktc,
            mhd_tref,
            mhd_actn,
            mhd_eref,
            mhd_subj,
            mhd_udf1,
            mhd_udf2,
            mhd_udf3,
            mhd_udf4,
            mhd_udf5,
            mhd_udf6,
            mhd_udf7,
            mhd_udf8,
            mhd_udf9,
            mhd_udfa,
            mhd_udfb,
            mhd_udfc,
            mhd_udfd,
            mhd_udfe,
            mhd_udff,
            mhd_udfg,
            mhd_udfh,
            mhd_udfi,
            mhd_udfj,
            mhd_udfk,
            mhd_updd,
            mhd_begd,
            mhd_begt,
            mhd_endd,
            mhd_endt,
            mhd_mrcc,
            mhd_mhdc,
            mhd_mscc,
            mhd_pprc,
            mhd_ppss,
            mhd_inst
          )
          VALUES
          (
            :new.mhd_code
            seq_var,
            :new.mhd_mst1,
            :new.mhd_mst2,
            :new.mhd_cred,
            :new.mhd_cret,
            :new.mhd_tsks,
            :new.mhd_msgs,
            :new.mhd_tktc,
            :new.mhd_tref,
            :new.mhd_actn,
            :new.mhd_eref,
            :new.mhd_subj,
            :new.mhd_udf1,
            :new.mhd_udf2,
            :new.mhd_udf3,
            :new.mhd_udf4,
            :new.mhd_udf5,
            :new.mhd_udf6,
            :new.mhd_udf7,
            :new.mhd_udf8,
            :new.mhd_udf9,
            :new.mhd_udfa,
            :new.mhd_udfb,
            :new.mhd_udfc,
            :new.mhd_udfd,
            :new.mhd_udfe,
            :new.mhd_udff,
            :new.mhd_udfg,
            :new.mhd_udfh,
            :new.mhd_udfi,
            :new.mhd_udfj,
            :new.mhd_udfk,
            :new.mhd_updd,
            :new.mhd_begd,
            :new.mhd_begt,
            :new.mhd_endd,
            :new.mhd_endt,
            :new.mhd_mrcc,
            :new.mhd_mhdc,
            :new.mhd_mscc,
            :new.mhd_pprc,
            :new.mhd_ppss,
            :new.mhd_inst
          )
      END;
    /

2 个答案:

答案 0 :(得分:1)

您在values子句的前两个元素和insert语句末尾的分号之间缺少逗号:

      VALUES
      (
        :new.mhd_code
        seq_var,
        :new.mhd_mst1,
        ...
        :new.mhd_ppss,
        :new.mhd_inst
      )

......应该是:

      VALUES
      (
        :new.mhd_code,
        seq_var,
        :new.mhd_mst1,
        ...
        :new.mhd_ppss,
        :new.mhd_inst
      );

奇怪的是你无法看到错误。


顺便提一下,max(seq) + 1 from ...模式在多用户环境中不可靠。使用适当的序列生成该值会更正常(也更安全)。

答案 1 :(得分:1)

您好有两个语法错误 首先,请在插入的两个值之间添加逗号

 VALUES
      (
        :new.mhd_,
        seq_var,
        :new.mhd_mst1,...

和第二个请在插入语句末尾添加一个半冒号

 ...
 :new.mhd_pprc,
        :new.mhd_ppss,
        :new.mhd_inst
      );

希望这能解决您的问题