Oracle触发器使用
2015-11-19 09:36
507 查看
触发器(trigger)
应用场景:1.复杂的安全性检查;2.数据确认;3.实现审计功能;4.完成数据的备份和同步。类型:语句级触发器(针对是表)和行级触发器(针对是行, :old和:new表示一行的记录,其中:old表示操作之前的值,:new表示操作之后的值)。
基本结构
create or replace trigger 触发器名称 after【or before】 insert 【or delete or update[列名]】 on 表名称 for each row when(条件) declare begin dbms_output.put_line('触发器已经执行!'); // PL/SQL语句块 end;
案例一(非工作时间禁止插入数据,针对应用场景1、2、3原理都一样):
create or replace trigger SECURITYEMP BEFORE INSERT ON BAR3D BEGIN if to_char(sysdate,'day') in('星期六','星期日') or to_number(to_char(sysdate,'hh24')) not between 9 and 18 then raise_application_error(-20001, '禁止在非工作时间插入数据'); end if; END;
案例二(将子表汇总数据添加到主表中,针对应用场景4,数据备份与同步原理一样)
create or replace trigger "SCOTT"."CAPACITY_SUM" AFTER INSERT OR UPDATE ON "SCOTT"."MACHINE_UNIT_INFO" for each row declare PRAGMA AUTONOMOUS_TRANSACTION; capa NUMBER(10,2) := 10000; BEGIN SELECT CAPACITY into capa FROM VIEW_SECURITY_ORGANIZATION where CODE=:new.FACTORYCODE; UPDATE SECURITY_ORGANIZATION SET CAPACITY=capa WHERE CODE=:new.FACTORYCODE; COMMIT; END;
附表结构:
表SECURITY_ORGANIZATION
/* Navicat Oracle Data Transfer Oracle Client Version : 10.2.0.5.0 Source Server : 192.168.1.201ORCL Source Server Version : 100200 Source Host : 192.168.1.201:1521 Source Schema : SCOTT Target Server Type : ORACLE Target Server Version : 100200 File Encoding : 65001 Date: 2015-11-19 09:40:25 */ -- ---------------------------- -- Table structure for SECURITY_ORGANIZATION -- ---------------------------- DROP TABLE "SCOTT"."SECURITY_ORGANIZATION"; CREATE TABLE "SCOTT"."SECURITY_ORGANIZATION" ( "ORG_ID" NUMBER NOT NULL , "NAME" VARCHAR2(64 BYTE) NOT NULL , "DESCRIPTION" VARCHAR2(255 BYTE) NULL , "PARENT_ID" NUMBER NULL , "CODE" VARCHAR2(20 BYTE) NULL , "CAPACITY" NUMBER(10) NULL , "LONGITUDE" NUMBER(20,10) NULL , "LATITUDE" NUMBER(20,10) NULL , "ADDRESS" VARCHAR2(150 BYTE) NULL , "HOTAREA" NUMBER(10,2) NULL , "HOTWAYS" VARCHAR2(100 BYTE) NULL , "MINRUNWAYS" NUMBER(10,2) NULL , "DJJDATA" NUMBER(10,2) NULL , "JCDATA" NUMBER(10,2) NULL , "ISAPPLYHOT" CHAR(1 BYTE) NULL ) LOGGING NOCOMPRESS NOCACHE ; COMMENT ON TABLE "SCOTT"."SECURITY_ORGANIZATION" IS '组织结构'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."NAME" IS '组织名称'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."DESCRIPTION" IS '组织名称描述'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."CODE" IS '组织编码'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."CAPACITY" IS '总装机容量(MW)'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."LONGITUDE" IS '经度'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."LATITUDE" IS '纬度'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."ADDRESS" IS '地点'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."HOTAREA" IS '供热面积'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."HOTWAYS" IS '供热方式'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."MINRUNWAYS" IS '最小运行方式'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."DJJDATA" IS '电监局数据'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."JCDATA" IS '机测数据'; COMMENT ON COLUMN "SCOTT"."SECURITY_ORGANIZATION"."ISAPPLYHOT" IS 'Y供热?N不供热'; -- ---------------------------- -- Indexes structure for table SECURITY_ORGANIZATION -- ---------------------------- -- ---------------------------- -- Checks structure for table SECURITY_ORGANIZATION -- ---------------------------- ALTER TABLE "SCOTT"."SECURITY_ORGANIZATION" ADD CHECK ("ORG_ID" IS NOT NULL); ALTER TABLE "SCOTT"."SECURITY_ORGANIZATION" ADD CHECK ("NAME" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table SECURITY_ORGANIZATION -- ---------------------------- ALTER TABLE "SCOTT"."SECURITY_ORGANIZATION" ADD PRIMARY KEY ("ORG_ID");
<span style="font-family: 微软雅黑; font-size: 14px; line-height: 21px;">表</span>MACHINE_UNIT_INFO
/* Navicat Oracle Data Transfer Oracle Client Version : 10.2.0.5.0 Source Server : 192.168.1.201ORCL Source Server Version : 100200 Source Host : 192.168.1.201:1521 Source Schema : SCOTT Target Server Type : ORACLE Target Server Version : 100200 File Encoding : 65001 Date: 2015-11-19 09:40:42 */ -- ---------------------------- -- Table structure for MACHINE_UNIT_INFO -- ---------------------------- DROP TABLE "SCOTT"."MACHINE_UNIT_INFO"; CREATE TABLE "SCOTT"."MACHINE_UNIT_INFO" ( "ID" NUMBER NOT NULL , "FACTORYCODE" VARCHAR2(50 BYTE) NULL , "UNITCODE" VARCHAR2(50 BYTE) NULL , "UNITNAME" VARCHAR2(100 BYTE) NULL , "DESCRIPTION" VARCHAR2(255 BYTE) NULL , "CAPACITY" NUMBER(10,2) NULL , "TLGY" VARCHAR2(100 BYTE) NULL , "TXGY" VARCHAR2(100 BYTE) NULL , "CCGY" VARCHAR2(100 BYTE) NULL ) LOGGING NOCOMPRESS NOCACHE ; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."FACTORYCODE" IS '风场编码'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."UNITCODE" IS '机组编码'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."UNITNAME" IS '机组名称'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."DESCRIPTION" IS '机组描述'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."CAPACITY" IS '装机容量(MW)'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."TLGY" IS '脱硫工艺'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."TXGY" IS '脱销工艺'; COMMENT ON COLUMN "SCOTT"."MACHINE_UNIT_INFO"."CCGY" IS '除尘工艺'; -- ---------------------------- -- Indexes structure for table MACHINE_UNIT_INFO -- ---------------------------- -- ---------------------------- -- Triggers structure for table MACHINE_UNIT_INFO -- ---------------------------- CREATE OR REPLACE TRIGGER "SCOTT"."CAPACITY_SUM" AFTER INSERT OR UPDATE ON "SCOTT"."MACHINE_UNIT_INFO" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW declare PRAGMA AUTONOMOUS_TRANSACTION; capa NUMBER(10,2) := 0; BEGIN SELECT CAPACITY into capa FROM VIEW_SECURITY_ORGANIZATION where CODE=:new.FACTORYCODE; UPDATE SECURITY_ORGANIZATION SET CAPACITY=capa WHERE CODE=:new.FACTORYCODE; COMMIT; END; -- ---------------------------- -- Checks structure for table MACHINE_UNIT_INFO -- ---------------------------- ALTER TABLE "SCOTT"."MACHINE_UNIT_INFO" ADD CHECK ("ID" IS NOT NULL); -- ---------------------------- -- Primary Key structure for table MACHINE_UNIT_INFO -- ---------------------------- ALTER TABLE "SCOTT"."MACHINE_UNIT_INFO" ADD PRIMARY KEY ("ID");视图VIEW_SECURITY_ORGANIZATION
SELECT A .ORG_ID, A ."NAME", A ."DESCRIPTION", A .PARENT_ID, A .CODE, A .LONGITUDE, A .LATITUDE, A .ADDRESS, A .HOTAREA, A .HOTWAYS, A .MINRUNWAYS, A .DJJDATA, A .JCDATA, A .ISAPPLYHOT, b.CAPACITY FROM SECURITY_ORGANIZATION A --装机总容量计算 LEFT JOIN ( SELECT SUM (CAPACITY) CAPACITY, FACTORYCODE FROM MACHINE_UNIT_INFO GROUP BY FACTORYCODE ) b ON A .CODE = b.FACTORYCODE --WHERE CODE NOT LIKE '%.%.%' OR CODE IS NULL
相关文章推荐
- oracle去重
- 解决oracle 11G exp 不能导出空表问题
- Oracle+struts2实现用户登入并显示访问次数
- 什么叫做Oracle RAC中的nodename
- oracle排序,出现页数不同数据却重复问题的原因及解决办法
- oracle索引总结
- 如何让dapper支持oracle游标呢?
- oracle去重等基础问题
- ORACLE ORA22922 不存在的LOB值解决方法
- Oracle ubuntu 下快速安装
- Oracle Linux: Error "Missing Or Invalid IPv4 Prefix '0' On Linux Server" (文档 ID 1522095.1)
- 查看Oracle的实例
- Oracle 自定义结构(Record) 记录
- Oracle存储过程中的异常处理
- oracle系统包——dbms_job用法(oracle定时任务)
- PFILE和SPFILE介绍
- ORACLE PL/SQL 字符串函数、数学函数、日期函数
- Navicat V11 连接 oracle 11g 的问题
- oracle添加和查看注释
- J2EE应用中与Oracle数据库的连接