ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 588|回复: 2

[PL/SQL] ORACLE触发器异常后insert不执行问题

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2018-7-3 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create or replace trigger HY_住院费用记录_DOCTOR_INSERT
  before INSERT
ON 住院费用记录
  FOR EACH ROW --说明创建的是行级触发器

DECLARE
  v_管床医生 病人变动记录.经治医师%TYPE;

BEGIN

--根据病人ID,主页ID获得最新的管床医生
SELECT d.经治医师 INTO v_管床医生 FROM 病人变动记录 d
WHERE d.病人id=:new.病人id and d.主页id=:new.主页id
AND d.开始时间 = (SELECT MAX(b.开始时间) FROM 病人变动记录 b WHERE b.病人id=:new.病人id and b.主页id=:new.主页id)
AND d.终止时间 IS NULL;
-- AND ROWNUM = 1;

--判断临床是否操作选择了管床医生
/*            If v_管床医生 Is NULL  then
                 SELECT nvl(a.住院医师,'未选择') INTO v_管床医生 FROM 病案主页 a WHERE a.病人id= :new.病人id and a.主页id=:new.主页id;
            END IF;
*/

--异常处理
EXCEPTION
WHEN NO_DATA_FOUND THEN

    SELECT nvl(a.住院医师,'未选择') INTO v_管床医生 FROM 病案主页 a WHERE a.病人id=:new.病人id and a.主页id=:new.主页id;

    Insert Into HY_住院费用记录
    (ID, 记录性质, NO, 记录状态, 序号, 从属父号, 价格父号, 多病人单, 记帐单ID,病人id, 主页id, 医嘱序号, 门诊标志, 记帐费用, 姓名, 性别, 年龄, 标识号, 床号, 病人病区id,
     病人科室id, 费别, 收费类别, 收费细目id, 计算单位, 付数, 发药窗口, 数次, 加班标志, 附加标志, 婴儿费, 收入项目id, 收据费目, 标准单价, 应收金额, 实收金额, 划价人,
     开单部门id, 开单人, 发生时间,  登记时间, 执行部门id, 执行人, 执行状态, 执行时间, 结论, 操作员编号, 操作员姓名, 结帐ID, 结帐金额, 保险大类id, 保险项目否, 保险编码,
     费用类型, 统筹金额, 是否上传,摘要, 是否急诊, 医疗小组id, 缴款组ID, 腔镜, 摘要1, 待转出,管床医生)
    Values
    (:NEW.ID, :NEW.记录性质, :NEW.NO, :NEW.记录状态, :NEW.序号, :NEW.从属父号,:NEW.价格父号,:NEW.多病人单,:NEW.记帐单ID,:NEW.病人id,:NEW.主页id,
     :NEW.医嘱序号, :NEW.门诊标志, :NEW.记帐费用, :NEW.姓名, :NEW.性别, :NEW.年龄, :NEW.标识号, :NEW.床号, :NEW.病人病区id,:NEW.病人科室id,:NEW.费别,
     :NEW.收费类别,:NEW.收费细目id,:NEW.计算单位, :NEW.付数,:NEW.发药窗口, :NEW.数次, :NEW.加班标志, :NEW.附加标志, :NEW.婴儿费, :NEW.收入项目id,
     :NEW.收据费目, :NEW.标准单价, :NEW.应收金额, :NEW.实收金额, :NEW.划价人, :NEW.开单部门id, :NEW.开单人, :NEW.发生时间, :NEW.登记时间, :NEW.执行部门id,
     :NEW.执行人, :NEW.执行状态, :NEW.执行时间, :NEW.结论, :NEW.操作员编号, :NEW.操作员姓名, :NEW.结帐ID, :NEW.结帐金额, :NEW.保险大类id, :NEW.保险项目否,
     :NEW.保险编码, :NEW.费用类型, :NEW.统筹金额, :NEW.是否上传, :NEW.摘要, :NEW.是否急诊, :NEW.医疗小组id, :NEW.缴款组ID, :NEW.腔镜, :NEW.摘要1,
     :NEW.待转出, v_管床医生);
--其他异常
WHEN OTHERS THEN
          --zl_ErrorCenter(SQLCode, SQLErrM);
          Raise_application_error (-20221, '未知错误!');

--无异常执行这段         
Insert Into HY_住院费用记录
    (ID, 记录性质, NO, 记录状态, 序号, 从属父号, 价格父号, 多病人单, 记帐单ID,病人id, 主页id, 医嘱序号, 门诊标志, 记帐费用, 姓名, 性别, 年龄, 标识号, 床号, 病人病区id,
     病人科室id, 费别, 收费类别, 收费细目id, 计算单位, 付数, 发药窗口, 数次, 加班标志, 附加标志, 婴儿费, 收入项目id, 收据费目, 标准单价, 应收金额, 实收金额, 划价人,
     开单部门id, 开单人, 发生时间,  登记时间, 执行部门id, 执行人, 执行状态, 执行时间, 结论, 操作员编号, 操作员姓名, 结帐ID, 结帐金额, 保险大类id, 保险项目否, 保险编码,
     费用类型, 统筹金额, 是否上传,摘要, 是否急诊, 医疗小组id, 缴款组ID, 腔镜, 摘要1, 待转出,管床医生)
    Values
    (:NEW.ID, :NEW.记录性质, :NEW.NO, :NEW.记录状态, :NEW.序号, :NEW.从属父号,:NEW.价格父号,:NEW.多病人单,:NEW.记帐单ID,:NEW.病人id,:NEW.主页id,
     :NEW.医嘱序号, :NEW.门诊标志, :NEW.记帐费用, :NEW.姓名, :NEW.性别, :NEW.年龄, :NEW.标识号, :NEW.床号, :NEW.病人病区id,:NEW.病人科室id,:NEW.费别,
     :NEW.收费类别,:NEW.收费细目id,:NEW.计算单位, :NEW.付数,:NEW.发药窗口, :NEW.数次, :NEW.加班标志, :NEW.附加标志, :NEW.婴儿费, :NEW.收入项目id,
     :NEW.收据费目, :NEW.标准单价, :NEW.应收金额, :NEW.实收金额, :NEW.划价人, :NEW.开单部门id, :NEW.开单人, :NEW.发生时间, :NEW.登记时间, :NEW.执行部门id,
     :NEW.执行人, :NEW.执行状态, :NEW.执行时间, :NEW.结论, :NEW.操作员编号, :NEW.操作员姓名, :NEW.结帐ID, :NEW.结帐金额, :NEW.保险大类id, :NEW.保险项目否,
     :NEW.保险编码, :NEW.费用类型, :NEW.统筹金额, :NEW.是否上传, :NEW.摘要, :NEW.是否急诊, :NEW.医疗小组id, :NEW.缴款组ID, :NEW.腔镜, :NEW.摘要1,
     :NEW.待转出, v_管床医生);

END HY_住院费用记录_DOCTOR_INSERT;






如果--根据病人ID,主页ID获得最新的管床医生
SELECT d.经治医师 INTO v_管床医生 FROM 病人变动记录 d
WHERE d.病人id=:new.病人id and d.主页id=:new.主页id
AND d.开始时间 = (SELECT MAX(b.开始时间) FROM 病人变动记录 b WHERE b.病人id=:new.病人id and b.主页id=:new.主页id)
AND d.终止时间 IS NULL;

这段sql查询不到数据触发NO_DATA_FOUND异常
查询到数据则执行

--无异常执行这段         
Insert Into HY_住院费用记录
    (ID, 记录性质, NO, 记录状态, 序号, 从属父号, 价格父号, 多病人单, 记帐单ID,病人id, 主页id, 医嘱序号, 门诊标志, 记帐费用, 姓名, 性别, 年龄, 标识号, 床号, 病人病区id,
     病人科室id, 费别, 收费类别, 收费细目id, 计算单位, 付数, 发药窗口, 数次, 加班标志, 附加标志, 婴儿费, 收入项目id, 收据费目, 标准单价, 应收金额, 实收金额, 划价人,
     开单部门id, 开单人, 发生时间,  登记时间, 执行部门id, 执行人, 执行状态, 执行时间, 结论, 操作员编号, 操作员姓名, 结帐ID, 结帐金额, 保险大类id, 保险项目否, 保险编码,
     费用类型, 统筹金额, 是否上传,摘要, 是否急诊, 医疗小组id, 缴款组ID, 腔镜, 摘要1, 待转出,管床医生)
    Values
    (:NEW.ID, :NEW.记录性质, :NEW.NO, :NEW.记录状态, :NEW.序号, :NEW.从属父号,:NEW.价格父号,:NEW.多病人单,:NEW.记帐单ID,:NEW.病人id,:NEW.主页id,
     :NEW.医嘱序号, :NEW.门诊标志, :NEW.记帐费用, :NEW.姓名, :NEW.性别, :NEW.年龄, :NEW.标识号, :NEW.床号, :NEW.病人病区id,:NEW.病人科室id,:NEW.费别,
     :NEW.收费类别,:NEW.收费细目id,:NEW.计算单位, :NEW.付数,:NEW.发药窗口, :NEW.数次, :NEW.加班标志, :NEW.附加标志, :NEW.婴儿费, :NEW.收入项目id,
     :NEW.收据费目, :NEW.标准单价, :NEW.应收金额, :NEW.实收金额, :NEW.划价人, :NEW.开单部门id, :NEW.开单人, :NEW.发生时间, :NEW.登记时间, :NEW.执行部门id,
     :NEW.执行人, :NEW.执行状态, :NEW.执行时间, :NEW.结论, :NEW.操作员编号, :NEW.操作员姓名, :NEW.结帐ID, :NEW.结帐金额, :NEW.保险大类id, :NEW.保险项目否,
     :NEW.保险编码, :NEW.费用类型, :NEW.统筹金额, :NEW.是否上传, :NEW.摘要, :NEW.是否急诊, :NEW.医疗小组id, :NEW.缴款组ID, :NEW.腔镜, :NEW.摘要1,
     :NEW.待转出, v_管床医生);


现在的问题是编译通过了,但是HY_住院费用记录中就是没有同步过来数据,请前辈给分析下问题在哪里。
万分感谢!

论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:53
2#
发表于 2018-7-3 22:35 | 只看该作者
你这个所谓的“--无异常执行这段 ” 竟然是写在WHEN OTHERS里面的,也就是说那个 INSERT 永远执行不到,因为在INSERT之前你已经Raise_application_error了。
你要把那个有可能引发NO_DATA_FOUND的SELECT语句单独写一个匿名块,用BEGIN ... EXCPETION WHEN NO_DATA_FOUND ... END; 的结构。

使用道具 举报

回复
论坛徽章:
0
3#
 楼主| 发表于 2018-7-4 07:31 | 只看该作者
newkid 发表于 2018-7-3 22:35
你这个所谓的“--无异常执行这段 ” 竟然是写在WHEN OTHERS里面的,也就是说那个 INSERT 永远执行不到,因 ...

明白了,谢谢版主!!!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
http://www.vxiaotou.com