在Oracle的触发器中执行DDL语句
2008-05-15 00:12
323 查看
触发器无需commit
也不能写commit
触发器和触发它的DML是同一个事务
DML提交了,触发器的操作也提交了,要不就一起回滚了
当然,如果你一定要在触发器里写COMMIT
那就用自治事务
相当于一个事务里的子事务
正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。
解决办法有两种:
1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
如:
CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_RCatalogue
for each row
DECLARE
pragma autonomous_transaction;
NRDSId varchar(500):='';
begin
2.可以另外写一个方法,把dll语句传递到这个方法中去执行。
注释:
ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。如insert,delete,update,select等都是DML.
也不能写commit
触发器和触发它的DML是同一个事务
DML提交了,触发器的操作也提交了,要不就一起回滚了
当然,如果你一定要在触发器里写COMMIT
那就用自治事务
相当于一个事务里的子事务
正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。
解决办法有两种:
1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
如:
CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_RCatalogue
for each row
DECLARE
pragma autonomous_transaction;
NRDSId varchar(500):='';
begin
2.可以另外写一个方法,把dll语句传递到这个方法中去执行。
注释:
ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。如insert,delete,update,select等都是DML.
相关文章推荐
- 执行oracle中的job报错:ORA-12011:无法执行作业1存储过程执行DDL语句提示ORA-01031错误:权限不足
- Oracle 过程中执行动态 SQL 或 DDL 语句
- 创建一个指定IP才能执行DDL语句的触发器
- oracle在存储过程中执行DDL语句
- Oracle中的一些查询语句及其执行顺序
- ORACLE-Kill 杀死正在执行的Oracle存储过程和死锁语句
- DDL触发器设置导致DDL无法执行(二)
- Oracle中SQL语句学习四(DDL语句)
- 2014.08.27oracle sql语句执行顺序
- oracle下wm_concat源码(ps:如果有些版本的oracle不支持此函数,只要执行下下面的语句即可)
- Oracle的sql语句执行过程
- oracle中如何得到一条SQL语句的执行时间
- Oracle存储过程执行update语句不报错不生效问题
- oracle sql语句执行顺序
- Oracle操作的部分ddl语句
- Oracle正在执行和执行过的SQL语句
- oracle 查看执行的sql语句
- oracle ora-01403 找不到数据/ ORA-24338: 未执行语句句柄
- 执行Oracle的insert或update语句时同时返回插入或更新后的字段值
- Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程