如何在Oracle触发器中将:new作为参数传递给自定义函数
核心问题说明
Oracle触发器内置的:new属于伪记录类型,和表定义的%rowtype类型不兼容,无法直接赋值或作为参数传递。你现有代码还存在两处语法/逻辑错误:myrow:=:new语句后缺少分号,UPDATE语句中sum_evaluation=sum_evaluation没有实际修改效果。
修正方案(保留原有函数定义)
只需修改触发器逻辑,手动将:new的字段逐个赋值给%rowtype变量即可:
create or replace trigger tg_insert_attend_j301 after insert on t_attend_j301 for each row declare total number; myrow t_attend_j301%rowtype; begin -- 按表字段顺序逐个赋值,以下为示例,请补全你表中所有字段 myrow.sno := :new.sno; myrow.class12 := :new.class12; myrow.class34 := :new.class34; myrow.class56 := :new.class56; myrow.class78 := :new.class78; myrow.class90 := :new.class90; -- 调用自定义函数 total := sum_evaluation_onerow(myrow); -- 修正更新逻辑,累加计算得到的考勤总分 update u_j301.t_stud_j301 set sum_evaluation = sum_evaluation + total where sno = :new.sno; end; /
可选简化方案
如果表字段较多,逐个赋值效率低,可以修改函数的入参设计,直接接收需要计算的字段,无需传递整行:
-- 调整后的函数定义 create or replace function sum_evaluation_onerow( p_class12 t_attend_j301.class12%type, p_class34 t_attend_j301.class34%type, p_class56 t_attend_j301.class56%type, p_class78 t_attend_j301.class78%type, p_class90 t_attend_j301.class90%type ) return number as total number := 0; begin total := trans_attend_type(p_class12) + total; total := trans_attend_type(p_class34) + total; total := trans_attend_type(p_class56) + total; total := trans_attend_type(p_class78) + total; total := trans_attend_type(p_class90) + total; dbms_output.put_line(total); return total; end; / -- 简化后的触发器代码 create or replace trigger tg_insert_attend_j301 after insert on t_attend_j301 for each row declare total number; begin total := sum_evaluation_onerow(:new.class12, :new.class34, :new.class56, :new.class78, :new.class90); update u_j301.t_stud_j301 set sum_evaluation = sum_evaluation + total where sno = :new.sno; end; /
内容的提问来源于stack exchange,提问作者lightelf forest
相关产品推荐
相关产品推荐

