1、oracle 中创建触发器示例

CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG"

( "FREQUENCYID" NUMBER(10,0),

"NAME" NVARCHAR2(30),

"CODE" VARCHAR2(10 CHAR),

"MNEMONICCODE" VARCHAR2(10 CHAR),

"SPELLCODE" VARCHAR2(10 CHAR),

"WBCODE" VARCHAR2(10 CHAR),

"ENGLISHNAME" NVARCHAR2(30),

"TIMESDAILY" NUMBER(5,0) DEFAULT (0),

"INTERVALDAYS" NUMBER(5,0) DEFAULT (0),

"ISWEEKLYCYCLE" NUMBER(1,0) DEFAULT (0),

"NOTE" NVARCHAR2(100),

"ISDELETED" NUMBER(1,0) DEFAULT (0),

"ROWVERSION" DATE DEFAULT SYSDATE,

"WEEKDAYSERIES" VARCHAR2(100 CHAR),

"STANDARDEXECTIMESERIES" VARCHAR2(255 CHAR),

"NONSTANDARDEXECTIMESERIES" VARCHAR2(255 CHAR),

"ENGLISHNOTE" NVARCHAR2(100),

"ORDINAL" NUMBER(10,0) DEFAULT (0),

"N_NAME" NVARCHAR2(30),

"N_CODE" VARCHAR2(10 CHAR),

"N_MNEMONICCODE" VARCHAR2(10 CHAR),

"N_SPELLCODE" VARCHAR2(10 CHAR),

"N_WBCODE" VARCHAR2(10 CHAR),

"N_ENGLISHNAME" NVARCHAR2(30),

"N_TIMESDAILY" NUMBER(5,0) DEFAULT (0),

"N_INTERVALDAYS" NUMBER(5,0) DEFAULT (0),

"N_ISWEEKLYCYCLE" NUMBER(1,0) DEFAULT (0),

"N_NOTE" NVARCHAR2(100),

"N_ISDELETED" NUMBER(1,0) DEFAULT (0),

"N_ROWVERSION" DATE DEFAULT SYSDATE,

"N_WEEKDAYSERIES" VARCHAR2(100 CHAR),

"N_STANDARDEXECTIMESERIES" VARCHAR2(255 CHAR),

"N_NONSTANDARDEXECTIMESERIES" VARCHAR2(255 CHAR),

"N_ENGLISHNOTE" NVARCHAR2(100),

"N_ORDINAL" NUMBER(10,0) DEFAULT (0),

"USERNAME" VARCHAR2(30) NOT NULL,

"IP" VARCHAR2(30) NOT NULL

) ;

/

CREATE OR replace TRIGGER concept.trg_updfrequency before UPDATE ON concept.frequency FOR each row

DECLARE

v_ip varchar2(30);

v_user varchar2(30);

BEGIN

SELECT sys_context('userenv', 'ip_address'), sys_context('userenv', 'SESSION_USER') INTO v_ip, v_user FROM dual;

--if :new.DISCHARGEON is null then

INSERT INTO "CONCEPT"."FREQUENCYMODIFYLOG" (FREQUENCYID, NAME, CODE, MNEMONICCODE, SPELLCODE, WBCODE, ENGLISHNAME, TIMESDAILY, INTERVALDAYS, ISWEEKLYCYCLE, NOTE, ISDELETED, ROWVERSION, WEEKDAYSERIES, STANDARDEXECTIMESERIES, NONSTANDARDEXECTIMESERIES, ENGLISHNOTE, ORDINAL

, N_NAME, N_CODE, N_MNEMONICCODE, N_SPELLCODE, N_WBCODE, N_ENGLISHNAME, N_TIMESDAILY, N_INTERVALDAYS, N_ISWEEKLYCYCLE, N_NOTE, N_ISDELETED, N_ROWVERSION, N_WEEKDAYSERIES, N_STANDARDEXECTIMESERIES, N_NONSTANDARDEXECTIMESERIES, N_ENGLISHNOTE, N_ORDINAL

, USERNAME, IP)

VALUES( :old.FREQUENCYID, :old.NAME, :old.CODE, :old.MNEMONICCODE, :old.SPELLCODE, :old.WBCODE, :old.ENGLISHNAME, :old.TIMESDAILY, :old.INTERVALDAYS, :old.ISWEEKLYCYCLE, :old.NOTE, :old.ISDELETED, :old.ROWVERSION, :old.WEEKDAYSERIES, :old.STANDARDEXECTIMESERIES, :old.NONSTANDARDEXECTIMESERIES, :old.ENGLISHNOTE, :old.ORDINAL,

:new.NAME, :new.CODE, :new.MNEMONICCODE, :new.SPELLCODE, :new.WBCODE, :new.ENGLISHNAME, :new.TIMESDAILY, :new.INTERVALDAYS, :new.ISWEEKLYCYCLE, :new.NOTE, :new.ISDELETED, :new.ROWVERSION, :new.WEEKDAYSERIES, :new.STANDARDEXECTIMESERIES, :new.NONSTANDARDEXECTIMESERIES, :new.ENGLISHNOTE, :new.ORDINAL, v_user, v_ip);

--end if;

END trg_updfrequency;

/

2、oracle 中触发器增加存储过程commit问题

触发器无需commit

也不能写commit
触发器和触发它的DML是同一个事务
DML提交了,触发器的操作也提交了,要不就一起回滚了

当然,如果你一定要在触发器里写COMMIT
那就用自治事务
相当于一个事务里的子事务

正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。

解决办法有两种:

1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
如:

create or replace trigger UPDATE_relaction_SAMPLE
before update ON SAMPLE
REFERENCING
FOR EACH ROW

DECLARE
pragma autonomous_transaction;
verror int;
BEGIN
verror:=0;
update sample_relation t set t.status=:new.status where
t.sample_id=:new.trim_idnumeric;
if :new.status='C' and :old.status<>'C' then
proc_synch_procedure_data(:new.trim_idnumeric,verror);

end if;
commit;
END UPDATE_relaction_SAMPLE;

2.可以另外写一个方法,把dll语句传递到这个方法中去执行。

注释:
   ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
   DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。如insert,delete,update,select等都是DML

Oracle中创建触发器示例及注意事项的更多相关文章

  1. Oracle中创建自增字段方法

    oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: .创建一个表 ) prim ...

  2. 在oracle中创建空间索引

    Oracle spatial可以方便的存储空间数据,大量的空间数据必需要使用空间索引去查询.在oracle中创建空间索引必需先建立元数据,否则无法创建索引.创建元数据的代码: insert into ...

  3. oracle中创建数据库

    一.在Oracle中创建数据库之前先改一下虚拟机的IP地址,以便访问 2. 3. 3.1 3.2 3.3 3.4 创建完成:输入sqlplus sys/123456 as sysdba测试

  4. oracle中创建sequence指定起始值

    oracle中创建sequence指定起始值 DECLARE V_Area_Id NUMBER; BEGIN SELECT MAX(T.Area_Id)+10 INTO V_Area_Id FROM ...

  5. 在oracle中创建自动增长字段

    参考http://www.cnblogs.com/jerrmy/archive/2013/03/13/2958352.html http://www.jb51.net/article/43382.ht ...

  6. Oracle中创建千万级大表归纳

    从一月至今,我总共归纳了三种创建千万级大表的方案,它们是: 下面是这三种方案的对比表格: # 名称 地址 主要机制 速度 1 在Oracle中十分钟内创建一张千万级别的表 https://www.cn ...

  7. 关于oracle中创建新表时将我们要用的表的结构和数据都复制过去

    今天在oracle中遇到了一个问题,就是给我查询出来了一张表的数据,只有部分的字段,让我将这张表的结构和数据放到新的临时表中,并进行数据的查询. 我是这样做的: 如:create table tabl ...

  8. Oracle中的触发器

    创建触发器的语法: Create trigger 触发器的名字 after insert/update/delete/(select是没有触发器的) on 表名字 declare begin dbms ...

  9. Oracle中创建Job实现自动插入值操作

    在PL/SQL Developer中创建Job --临时测试表 create table test_job ( id ), c_date date ); --临时序列 create sequence ...

随机推荐

  1. Sql 2000系统表 语句查询表结构

     SQL2000系统表的应用  –1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype=’u’ and status>=0 –2:获取 ...

  2. 转 造成ORA-01843 无效的月份的一些原因

  3. hdu 3686 Traffic Real Time Query System 点双两通分量 + LCA。这题有重边!!!

    http://acm.hdu.edu.cn/showproblem.php?pid=3686 我要把这题记录下来. 一直wa. 自己生成数据都是AC的.现在还是wa.留坑. 我感觉我现在倒下去床上就能 ...

  4. phpdesigner 配置SVN

  5. Linux网路命令netstat

    Linux网路命令netstat netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息. 参数 参数 用法 详解 -a或--a ...

  6. JavaScript 获取浏览器版本

    //获取IE版本function GetIEVersions(){ var iejson={ isIE:false,safariVersion:0 }; var ua = navigator.user ...

  7. 基于Myeclipse的三大框架(SSH)整合

    文中主要基于Myeclipse进行配置,配置流程为:Hibernate --> Spring --> 整合 --> struts2 -->整合.注意:在此文中,主要讲述基于注解 ...

  8. java实现打开Windows控制台窗口

    在写Python程序的时候突发奇想了一下,能不能用java代码实现打开控制台窗口呢? 经过查询网络资料和java API文档,终于实现了: package com.primeton.cmd; impo ...

  9. iOS Block的本质(二)

    iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...

  10. dfs染色法判定二分图

    #include<iostream> #include<cstring> using namespace std; ][],color[],n; int dfs(int x,i ...