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

 找回密码
 注册
查看: 441|回复: 14

关于Oracle 触发器向各位大神请教!

[复制链接]
论坛徽章:
0
发表于 2018-7-12 13:22 | 显示全部楼层 |阅读模式
关于oracle创建触发器:

1. 首先我要查询某台设备有没有工单(多表连接查询)
select mo.extra_mo_info9, count(wo.wo_key) count
  from work_order wo, maintenance_object mo
where mo.mo_key = wo.mo_key
   and wo.job_type = 'U'
   and mo.extra_mo_info9 <> ' '
group by mo.extra_mo_info9

查询的结果如下:
extra_mo_info9    count
2000-DF10          1
1000-BT01          2

然后我要根据上面的结果更新设备表(Maintenance_object)中的信息
比如将设备编号(mo_key)为 2000-DF10  的设备状态字段(status)变为 “停机”

论坛徽章:
0
 楼主| 发表于 2018-7-12 13:35 | 显示全部楼层
在设备表中的结构是
mo_key, status

如果上面的表中查询出的工单数量大于0 然后,将Mo_key 对应的status变为停机就可以了。

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
23
秀才
日期:2017-08-11 15:38:46秀才
日期:2018-01-02 15:17:54秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22技术图书徽章
日期:2018-01-02 15:18:30秀才
日期:2018-03-01 10:05:18秀才
日期:2018-05-22 15:21:20
发表于 2018-7-12 14:39 | 显示全部楼层
这种情况一般用视图来实现.

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2018-7-12 15:27 | 显示全部楼层
我创建了视图,但是创建触发器报错。

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2018-7-12 21:58 | 显示全部楼层
Would you please explain why we need trigger here? What's your requirement indeed?

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2018-7-12 22:00 | 显示全部楼层
Plus, please refer to the following post before you asking question, it will help both yourself and the people who willing to serve an answer.

http://www.itpub.net/thread-1348543-1-1.html

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2018-7-12 22:31 | 显示全部楼层
有两张表
一张表(work_order)记录的数据如下:
设备编码          工单号        工单类型
A0001            WO-0001              U
A0002            WO-0002              U
A0001            WO-0003              P
A0003            WO-0004              U
A0005            WO-0005              P
A0001            WO-0007              U
上述表以设备编码进行统计工单类型为“U"的工单号的数量
    select 设备编码,count(工单号) 工单数量 from work_order
    where 工单类型=‘U’
    group by 设备编码

得到的结果为
设备编码   工单数量
A00001       2
A0002        1
A0003        1
A0005        0

以上结果,如果工单数量>0 则需要更新另外一张表(Maintenance_object)中的设备状态status字段内容
另外一张表更新前的数据及结构如下:
设备编码     设备状态
A0001         在用
A0002         在用
A0003         在用
A0004         在用
A0005         在用

我需要用触发器的功能,将上面表中的设备状态进行变更(如设备对应的工单大于0则设备状态变为"停机",否则为"在用"
设备编码     设备状态
A0001         停机
A0002         停机
A0003         停机
A0004         在用
A0005         在用

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2018-7-12 22:31 | 显示全部楼层
YuBinTAMU 发表于 2018-7-12 22:00
Plus, please refer to the following post before you asking question, it will help both yourself and  ...

感谢您的提醒,我重新写了一下要求,不知道我说明白没有,谢谢啊!

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2018-7-12 22:33 | 显示全部楼层
本帖最后由 Bert_xia 于 2018-7-12 22:39 编辑

有两张表
一张表(work_order)记录的数据如下:
设备编码          工单号        工单类型
A0001            WO-0001              U
A0002            WO-0002              U
A0001            WO-0003              P
A0003            WO-0004              U
A0005            WO-0005              P
A0001            WO-0007              U
上述表以设备编码进行统计工单类型为“U"的工单号的数量
    select 设备编码,count(工单号) 工单数量 from work_order
    where 工单类型=‘U’
    group by 设备编码

得到的结果为
设备编码   工单数量
A00001       2
A0002        1
A0003        1
A0005        0

以上结果,如果工单数量>0 则需要更新另外一张表(Maintenance_object)中的设备状态status字段内容
另外一张表更新前的数据及结构如下:
设备编码     设备状态
A0001         在用
A0002         在用
A0003         在用
A0004         在用
A0005         在用

我需要用触发器的功能,将上面表中的设备状态进行变更(如设备对应的工单大于0则设备状态变为"停机",否则为"在用"
设备编码     设备状态
A0001         停机
A0002         停机
A0003         停机
A0004         在用
A0005         在用
说明:第一张工单表的work_order中的信息会随时更新,增加和删除,可以用work_order 的insert事件作为触发条件。谢谢!

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2018-7-13 02:30 | 显示全部楼层
Thanks for your re-post, it's much better now.

Below please find a solution using materialized view. It will fulfill your request with low DML frequency to table work_order.

(1) Set up the test env:
  1. create table work_order(dev_no varchar2(5) , ticket_no varchar2(10), ticket_type varchar2(1));

  2. insert into work_order values ('A0001','WO-0001','U');
  3. insert into work_order values ('A0002','WO-0002','U');
  4. insert into work_order values ('A0001','WO-0003','P');
  5. insert into work_order values ('A0003','WO-0004','U');
  6. insert into work_order values ('A0005','WO-0005','P');
  7. insert into work_order values ('A0004','WO-0006','P');
  8. insert into work_order values ('A0001','WO-0007','U');

  9. commit;

  10. alter table work_order add constraint work_order_pk primary key  ( dev_no, ticket_no );

  11. create table Maintenance_object ( dev_no varchar2(5), dev_status varchar2(1) default 'W' );
  12. -- 'W'  working status
  13. -- 'M'  Maitaining status , stopped
复制代码


(2) Create the Materialized view:
  1. create materialized view maintenance_object
  2. on prebuilt table
  3. refresh  on demand   
  4. as
  5. select dev_no
  6.          , decode( sum( decode(ticket_type, 'U',1,0)), 0, 'W','M') dev_status
  7. from work_order
  8. group by dev_no ;      
复制代码


(3) Any time you want to refresh the data in maintenance_object, just issue the following command:
  1. SQL>exec dbms_mview.refresh('maintenance_object', 'c');

  2. PL/SQL procedure successfully completed.

  3. SQL>select * from maintenance_object;

  4. DEV_N D
  5. ----- -
  6. A0001 M
  7. A0002 M
  8. A0003 M
  9. A0004 W
  10. A0005 W

  11. SQL>
复制代码


Please be noticed that it's not a good solution if the table work_order has a high volume with frequency DML.

使用道具 举报

回复

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

本版积分规则

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