首页 > 解决方案 > Oracle 复合触发器:尝试获取日期列的最大值时遇到 PLS-00103

问题描述

我正在尝试构建一个触发器,当表 A 的相应 end_date 更新时,该触发器将使用 Max value end_date 列更新表 B。

这样我就可以计算并保存在此之前保存的日期与我希望从表 A 中不断更新的最大结束日期之间的日期差异。

到目前为止,复合触发器似乎是一个有效的解决方案,因为我的行触发器并未完全涵盖所有用例,但是,我得到了标题中所述的错误。

完整错误:

PLS-00103:在预期以下情况之一时遇到符号“)”:当前删除之前存在

我试图找出我可能忽略的任何语法错误,但到目前为止我无法取得进展。

数据库版本似乎也是正确的,因为我使用的是应该支持复合触发器的 oracle 11g。

这是前面提到的 SQL:

CREATE OR REPLACE TRIGGER DATE_DIFF_CALC_A
FOR UPDATE OR INSERT OF END_ON ON TABLE_A
COMPOUND TRIGGER
   TYPE temp_record IS RECORD (
      COUNTER           NUMBER,
      B_ID             TABLE_B.id%TYPE,
      U_ID             TABLE_B.U_ID%TYPE,
      U_TYPE           TABLE_B.U_TYPE%TYPE,
      U_VOL_NO         TABLE_B.U_VOL_NO%TYPE,
      MAX_DATE         TABLE_B.MAX_DATE%TYPE,
   ); 

   TYPE temp_table IS TABLE OF temp_record INDEX BY PLS_INTEGER; 

   row_record temp_table;

   AFTER EACH ROW IS
     COUNTER NUMBER;
     MAX_DATE DATE;
     B_ID NUMBER;
   BEGIN
      SELECT COUNT(*), MAX_DATE, ID
      INTO COUNTER,
           MAX_DATE,
           B_ID
      FROM TABLE_B
      WHERE U_ID = :NEW.U_ID
        AND U_TYPE = :NEW.TYPE AND U_VOL_NO = :NEW.U_VOL_NO GROUP BY ID, MAX_DATE;
-- Tool I am using for query tells me there is an error in this line, but there's nothing here :(
      row_record(row_record.COUNT + 1).COUNTER := COUNTER;
      row_record(row_record.COUNT).MAX_DATE := MAX_DATE;
      row_record(row_record.COUNT).B_ID := B_ID;
      row_record(row_record.COUNT).U_ID := :NEW.U_ID;
      row_record(row_record.COUNT).U_TYPE := :NEW.TYPE;
      row_record(row_record.COUNT).U_VOL_NO := :NEW.U_VOL_NO;
   END AFTER EACH ROW; 

   AFTER STATEMENT IS 
      new_max_enddate   TABLE_B.MAX_DATE%TYPE;
   BEGIN
      FOR indx IN 1 .. row_record.COUNT
      LOOP
         SELECT MAX(a.end_on)
          INTO new_max_enddate
          from TABLE_A a, TABLE_C C 
          where a.c_id = c.id and UPPER(c.place_name) not like 'XTEST%'
          and a.status not in ('1', '2', '3', '4')
          and a.U_ID = row_record(indx).U_ID
          and a.TYPE = row_record(indx).U_TYPE
          and a.U_VOL_NO = row_record(indx).U_VOL_NO;

        IF row_record(indx).COUNTER = 1 THEN
           IF new_max_enddate > row_record(indx).MAX_DATE THEN 
              UPDATE TABLE_B 
                 SET MAX_DATE = new_max_enddate 
                WHERE U_ID = :NEW.U_ID
                AND U_TYPE = :NEW.TYPE
                AND U_VOL_NO = :NEW.U_VOL_NO;
           END IF;
        END IF;
      END LOOP; 
   END AFTER STATEMENT; 
END DATE_DIFF_CALC_A;

我评论了我正在使用的工具告诉我错误所在的代码行,如果它有帮助的话。

如果这个问题很容易解决,请原谅我;我对 PL/SQL 还不是很熟悉,很想了解更多。

标签: sqloracleplsqloracle11gdatabase-trigger

解决方案


请去掉后面的逗号TABLE_B.MAX_DATE%TYPE

还,

FOR UPDATE OR INSERT OF END_ON ON TABLE_A应该FOR UPDATE OF END_ON OR INSERT ON


推荐阅读