0

我正在创建一个触发器来更新列 TEST 如果列receipt_on = Quarterly Interest Then If 如果是这样,它应该在列receipt_amount 中找到总和,并从表receipt_history 中的r_app_file_id 列中的表Loan 中的列l_app_file_id 中加入另一个表贷款以及列中的月份名称表receipt_history 中的receipt_date 应该与当前月份相同,但是我不确定如何完全构建此触发器

-- Trigger DDL Statements
DELIMITER $$

USE `lms`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `lms`.`updateloan`
BEFORE UPDATE ON `lms`.`receipt_history`
FOR EACH ROW
BEGIN

if new.receipt_on='Quarterly Interest' then 
    SET new.TEST=SUM(receipt_amount)
    join loan l on 
    l.l_app_file_id=r.r_app_file_id
    WHERE r_app_file_id=l_app_file_id
    and monthname(receipt_date)=MONTHNAME(now())
    end if;    

  END$$
4

1 回答 1

1

正如您现在所知,您不能加入set声明。
您需要为此使用 select 语句。
这个结构会起作用,但是set i:= (select sum(x) from a);
我个人更喜欢SELECT something INTO avariable语法,但这只是个人喜好问题。

DELIMITER $$

USE `lms`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `lms`.`updateloan`
BEFORE UPDATE ON `lms`.`receipt_history`
FOR EACH ROW
BEGIN
  DECLARE itest integer;

  if new.receipt_on='Quarterly Interest' then 
    SELECT SUM(r.receipt_amount) INTO itest FROM receipt_history r
    INNER JOIN loan l ON (l.l_app_file_id=r.r_app_file_id)
    WHERE monthname(r.receipt_date)=MONTHNAME(now());
    SET new.test = itest;
  end if;    

  END$$

请注意:
连接标准已经是一个(种类)where子句,因此您不必在where子句中重复它。
触发器中的每条语句都需要以;.

于 2012-04-12T18:51:56.710 回答