触发器的使用

本文介绍了一个用于数据库管理系统中的触发器实现方案,该触发器在插入新记录时会根据新记录的内容更新库存表中的数据,包括增加或删除相应条目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位置:相关数据库管理系统

关键字:TRIGGER

例子:

CREATE TRIGGER 触发器名称
  AFTER INSERT
  ON 触发触发器的表
  FOR EACH ROW

  EXECUTE PROCEDURE 触发器函数();

触发器函数:

CREATE OR REPLACE FUNCTION 触发器函数()
  RETURNS trigger AS
$BODY$
DECLARE
    声明变量(触发触发器的表中没有的字段)
BEGIN
    --new代表着一个新的数据,即,触发触发器的表中没有的字段
    SELECT INTO record_count count(*) FROM sys_stock WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
           AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;


   
    changed_new_ukeharai_unit := new.unit * sys_find_ukeharai_kbn_func(new.ukeharai_class);
    
    changed_new_ukeharai_num := new.quantity * sys_find_ukeharai_kbn_func(new.ukeharai_class);
    
    if record_count > 0 THEN
--一条sql语句,查询多个字段,以逗号分隔,赋值使用空格隔开
        SELECT INTO  old_stock_num, old_unit stock_num, unit FROM sys_stock WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
                    AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;



        cal_result_stock_num := coalesce(old_stock_num, 0) + coalesce(changed_new_ukeharai_num, 0);
        cal_result_unit := coalesce(old_unit, 0) + coalesce(changed_new_ukeharai_unit, 0);


        if cal_result_stock_num = 0 AND cal_result_unit = 0 THEN

            DELETE FROM sys_stock WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
                      AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;
        else

            UPDATE sys_stock SET stock_num = (coalesce(old_stock_num, 0) + coalesce(changed_new_ukeharai_num, 0)), unit = (coalesce(old_unit, 0) + coalesce(changed_new_ukeharai_unit, 0))
            WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
            AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;
        END if;
    else

        new_uuid = uuid_generate_v4();
        new_modifier = 'sys-person_sys_admin';
        new_creator = 'sys-person_sys_admin';
        INSERT INTO sys_stock(id,location_cd, figure_num, edition, product_num, stock_num,lot_number,x_dimension,y_dimension,z_dimension,unit,item_name,location_select,arrival_day,last_processed_date,supplier_cd,supplier_select,million_single_weight
) values(new_uuid,new.location_cd, new.figure_num, new.edition, NULL, new.quantity, new.lot_number, new.x_dimension, new.y_dimension, new.z_dimension, new.unit, new.item_name, new.location_select, NULL, NULL, NULL, NULL, NULL);
        INSERT INTO basedataset(id,rev_ctrl_id,name,created,modified,deleted,remarks,modifier,creator,owner,owned_org,thread_id,parent_id,layout_id,app_id,revision,abbr) VALUES(new_uuid,NULL,NULL,now(),now(),false,NULL,new_modifier,new_creator,NULL,NULL,NULL,NULL,'sys_stock','app_production_mng',0,NULL);
    END if;
    
    return new;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值