如何在Oracle触发器中使用查询语句

通常情况下,Oracle数据库禁止在行级触发器或行级触发器所调用的子程序中使用查询语句。但是,面对复杂的业务逻辑,不可避免的要使用查询语句。

当在行级触发器中使用查询语句时,Oracle数据库会抛出ORA-04091异常。

Oracle官方文档中对ORA-04091异常的说明如下:

ORA-04091: table string.string is mutating, trigger/function may not see it

Cause: A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.

如果必须要在Trigger中使用查询语句,Oracle也提供了一种途径。

下面以简单的代码为例做说明:

 1 CREATE OR REPLACE TRIGGER TRG_TEST
 2     BEFORE INSERT OR UPDATE OR DELETE ON SCOTT.EMP
 3     FOR EACH ROW -- 行级触发器
 4 DECLARE
 5     PRAGMA AUTONOMOUS_TRANSACTION; -- 解决行级触发器不能使用查询语句的关键
 6
 7     V_COUNT PLS_INTEGER;
 8 BEGIN
 9     SELECT COUNT(*) INTO V_COUNT FROM SCOTT.EMP;
10     IF V_COUNT > 0 THEN
11         -- DO SOMETHING
12         NULL;
13     END IF;
14
15     COMMIT; -- 提交
16 EXCEPTION
17     WHEN OTHERS THEN
18         ROLLBACK; -- 回滚
19 END TRG_TEST;

如上面代码所示:在定义Trigger时,声明其事务的提交模式为PRAGMA AUTONOMOUS_TRANSACTION

但是,用户必须自己提交或回滚事务。

对于PRAGMA AUTONOMOUS_TRANSACTION的说明请参考Oracle官方文档

原文地址:https://www.cnblogs.com/yitouniu/p/11470665.html

时间: 2024-10-10 16:25:15

如何在Oracle触发器中使用查询语句的相关文章

oracle物理体系相关查询语句

1.查看SGA和PGA 这里看到SGA和PGA大小为0是因为在oracle 11g中,推出了memory_target这个参数,memory_target参数指定的内存会自动分配内存给SGA与PGA: 查看memory_target: sga_max_size=3200M表示当数据库运行是的内存超过sga_target的大小时,操作系统OS能够分配再分配内存给SGA,但大小不能超过3200M: 2.查看共享池与数据缓冲区 共享池与数据缓冲区大小为0是因为oracle设置为SGA自动管理,共享池与

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第4/5套:Oracle SQL语言之查询语句.主要学习Oracle数据库SQL查询限制排序.Oracle SQL联接查询.Oracle SQL子查询等. 视频学习地址: http://edu.51cto.com/course/course_id-8047.html Oracle SQL语

如何在oracle 12c中创建普通用户

-------如何在oracle 12c中创建普通用户------- [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sun Nov 29 21:43:50 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edit

Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句&#39;&#39; &quot;&quot;作用

//方法一,可以验证登录,但方法不实用.package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class Logi

Django Admin Cookbook-8如何在Django admin中优化查询

8.如何在Django admin中优化查询? 如果你的Admin后台中有很多计算字段,那么你需要对每个对象运行多个查询,这会使你的Admin后台变得非常慢.要解决此问题,你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段. 以下示例为Origin模型的中ModelAdmin管理模型: @admin.register(Origin) class OriginAdmin(admin.ModelAdmin): list_display = ("name&q

Oracle中分页查询语句

Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE

oracle中简单查询语句的格式及执行顺序分析

一条简单的查询sql格式如下: SELECT ... FROM .... [WHERE ...] --过滤单行 [GROUP BY ...   [HAVING ...]]--GROUP BY对前面where条件过滤后的结果进行分组,HAVING过滤行组 [ORDER BY ...]--对结果进行排序 eg: 现在有个exchangetime表,表结构如下 名称                                            是否为空? 类型 ----------------

一起ORACLE数据库中数据查询结果不一致问题的排查过程

一.问题描述 在某软件开发项目中,需要在ORACLE数据库中建立十张类型相同的员工信息表tb_employeeinfo0~tb_employeeinfo9,并建立向这十张表中插入数据的存储过程.ORACLE数据库安装在Linux操作系统下. 为了操作上的方便性,开发人员在PL/SQL Developer软件(ORACLE数据库开发软件)上实现了建表和建存储过程的操作.之后,开发人员利用SQL语句在在PL/SQL Developer软件上实现了向某个数据表中插入数据的操作.利用select语句查询

mybatis中的查询语句in用法的相关问题

在开发的时候,mybatisl中使用in的时候会遇到一些问题,如果我们传的参数是String类型,以“,”来进行隔开的,例如:参数是0,1,2字符串,mybatis中的语句如下 <select id="findByName" parameterType="string" resultType="com.domain.Factory"> SELECT * FROM FACTORY WHERE ID IN (#{ids}) </se