ORA-04091: 表 发生了变化, 触发器/函数不能读它

触发器中新调用了一个存储过程.

触发器:

create or replace trigger tr_credits_wzclorder_clwzjk
    after update on app_wzclorder for each row
declare
    ...
begin
    ...
    p_integral_ticket_refund(:new.ordernumber,:new.userid);
    ...
end;

存储过程:

create or replace procedure p_integral_ticket_refund(in_ordernumber varchar2,
                                                     in_userid      varchar2) is
    ...
begin
    ...
    select count(*) into v_count4 from app_wzclorder where ordernumber = in_ordernumber;
    ...
exception
    when others then
        begin
            ...
        end;
end p_integral_ticket_refund;

报异常:ora-04091: 表 appuser.app_wzclorder 发生了变化, 触发器/函数不能读它

改存储过程:

create or replace procedure p_integral_ticket_refund(in_ordernumber varchar2,
                                                     in_userid      varchar2) is
    ...
PRAGMA AUTONOMOUS_TRANSACTION; -- 自治事务开始
begin
    ...
    select count(*) into v_count4 from app_wzclorder where ordernumber = in_ordernumber;
    ...
COMMIT; -- 自治事务结束
exception
    when others then
        begin
            ...
        end;
end p_integral_ticket_refund;
时间: 2024-10-08 13:56:31

ORA-04091: 表 发生了变化, 触发器/函数不能读它的相关文章

2013年1月18日调试触发器“表发生了变化,触发器或函数不能读它”的出现原因,以及解决方案

1.异常出现的场景. :在使用Hibernate做为项目持久层的情况下,需要对某一张表进行一个扩展,扩展操作便是在该表上创建一个触发器.将表中的数据读入到其他表中. SQL语句如下: drop table tr_table;         create table tr_table(  --触发器作用表       tab_id number primary key,       tab_name varchar2(30) NOT NULL      )         create tabl

表 XXX 发生了变化 触发器不能读它

1.创建触发器: --倘若同一个业务的某种规则黄牌的置牌时间小于预警的置牌时间,--则交换他们的置牌时间.create or replace trigger after_punish_update_time  after insert  on winf_sv_punish  for each rowdeclare  param_id  varchar2(100);--置牌ID  param_breakRule  varchar2(100);--违反规则  param_punishResult 

查看Orcale数据里的表是否有变化

由于我们公司一个数据库两个应用在使用,导致一个应用修改了数据库,另一个应用用的缓存而不知道有更新还是原来的结果.原来的处理方式是采用session缓存的方式,用户登出了就清空缓存,这样只需要重新登录一次就得到最新的快照放在缓存中了,但现在新的要求是不登出就要实时刷新改了的内容.其实这种方式最好的处理办法是一个应用改了数据库通知另一个应用去刷新缓存,但是线下应用用vb写的成熟的产品,都是一帮老员工很难让他们去改点东西来适合新应用,都是新应用去套他们的.领导本来说直接不用缓存了,每次去读数据库,我觉

触发器 函数 存储过程

触发器 函数 存储过程 Table of Contents 触发器 函数 控制语句 使用局部变量 存储过程 游标 触发器 before update after update before delete after delete before insert after insert drop table if exists test; create table test( id int ); insert into test(id) values(1), (2); create table te

Sqlserver 中系统表sysobjects、syscolumns以及函数object_id

1.sysobjects 系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等 sysobjects 重要字段解释: sysObjects ( Name sysname, --object 名称 id int, --object id xtype char(2), -- object 类型 type char(2), -- Object 类型(与xtype 似乎一模一样) uid smallint, -- object 所有者的ID ... --其他的字段不常用到. ) ?

用存储过程 给表增加序列与触发器

存储过程如下: create or replace procedure p_createseq(tablename in varchar2,key in varchar2) Authid Current_User --使用角色权限,否则无法创建序列或表 is strsql varchar2(500); t_key varchar2(500); begin --创建序列 strsql:='create sequence seq_'||tablename|| ' minvalue 1000 maxv

SQL Server 触发器例题: --次性删除course表数据,使用触发器替换删除操作,先删除外键表相关数据,再删除course。很难理解

create trigger Course_Delete on course instead of delete as declare @cno varchar(20) --定义变量 select @cno = cno from deleted --临时表里的信息是instead of 替换 delete要删除的信息 delete from score where cno = @cno --instead of 替换操作后执行的代码命令 delete from course where cno=

sql 表操作中一些常用的函数

use master --数据库内置函数 select * from sys.all_objects --聚合函数 select N'总数' = COUNT(*), N'最大值' = MAX(schema_id), N'最小值' = MIN(schema_id), N'平均值' = AVG(schema_id), N'方差' = STDEV(schema_id) from sys.all_objects go --配置函数 select N'语言标识符' = @@LANGID, N'语言名称'

Cnblogs 的 MetaWeblog 的接口发生了变化

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami