Oracle中创建触发器示例及注意事项

Oracle中创建触发器示例及注意事项

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

原文地址:https://www.cnblogs.com/yaoyangding/p/12048138.html

时间: 2024-10-10 01:26:07

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

Oracle中创建自增字段方法

oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: 1.创建一个表 create table t_client (id number(4) primary key, pid number(4) not null, name varchar2(30) not null, client_id varchar2(10), client_level char(3), bank_acc

Oracle中创建自增字段(序列sequence)方法

oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: 1.创建一个表 create table t_client (id number(4) primary key, pid number(4) not null, name varchar2(30) not null, client_id varchar2(10), client_level char(3), bank_acc

Oracle中的触发器

Oracle中的触发器,布布扣,bubuko.com

ORACLE中创建表空间,创建表,修改表,授权

创建表空间 /*分为四步 */ /*第1步:创建临时表空间  */ create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' size 50m autoextend on next 50m maxsize 20480m   //如果最大值没有上限,则使用unlimited extent management local;  //extent 表示区间  设置区间管理方式是本地

在oracle中创建空间索引

Oracle spatial可以方便的存储空间数据,大量的空间数据必需要使用空间索引去查询.在oracle中创建空间索引必需先建立元数据,否则无法创建索引.创建元数据的代码: 1 insert into user_sdo_geom_metadata(table_name,COLUMN_NAME, DIMINFO, SRID) 2 values( 3 'CHINA_TRACK', 4 'TRACK_MBR', 5 MDSYS.SDO_DIM_ARRAY( 6 MDSYS.SDO_DIM_ELEME

ORACLE中创建表空间,创建表,改动表,授权

创建表空间 /*分为四步 */ /*第1步:创建暂时表空间  */ create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' size 50m autoextend on next 50m maxsize 20480m   //假设最大值没有上限,则使用unlimited extent management local;  //extent 表示区间  设置区间管理方式是本地

在oracle中创建自动增长字段

参考http://www.cnblogs.com/jerrmy/archive/2013/03/13/2958352.html oracle在创建表时和其他的数据库有点不一样,如SQL SERVER可以在int类型的字段后加上identity(1,1),该字段就会从1开始,按照+1的方式自增,将这个字段设置为主键,有利于我们进行数据的插入操作.MySql中可以使用"auto_increment"即可.但是oracle有点麻烦,需要使用序列和触发器达到目的. 首先我们创建一个员工表. c

Oracle中创建视图教程学习

分享下oracle数据库中创建视图的方法. Oracle的数据库对象分为五种:表,视图,序列,索引和同义词. 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表. 视图是存储在数据字典里的一条select语句. 通过创建视图可以提取数据的逻辑上的集合或组合. oracle视图的优点: 1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分. 2.用户通过简单的查询可以从复杂查询中得到结果. 3.维护数据的独立性,试图可从多

《MySQL必知必会》中创建触发器代码的“错误”

<MySQL必知必会>中使用触发器一章中的创建触发器的代码在MySQL5.7.20中报错:ERROR 1415 (0A000): Not allowed to return a result set from a trigger. 因为我不知道这是不是版本问题,所以给错误打上了双引号. 这是书中的原话: 报错:触发器不能返回结果集 网上查资料看到,可以将字符串赋给变量 原文地址:https://www.cnblogs.com/yxqxx/p/8963382.html