delmatch oracle_Oracle Compound触发器 - 如何存储和“使用”已删除的行? INDEX BY表?...

这篇博客探讨了在Oracle数据库中处理DELETE触发器时遇到的问题,尤其是当需要在删除行后更新高分记录时。作者转向使用复合触发器以避免ORA-04091变异表错误,并寻求最佳方式存储已删除的行,特别是那些具有高分的行。文章讨论了使用INDEX BY表来存储这些行的可能性,并展示了如何在触发器中创建和使用此类表,以及在删除操作后更新CurrentHighScores表的示例代码。
摘要由CSDN通过智能技术生成

我正在为Oracle中的DELETE触发器进行长期斗争,在删除一行时,从剩余的行中选择一个新的MAX值并将其写入另一个表 . 在遇到烦人的ORA-04091变异表错误(在FOR EACH ROW中无法读取表)之后,我切换到了Oracle的复合触发器 .

如何最好地存储已删除的行(每行多个值,因为只有在删除的分数可能是高分时才进行进一步检查,而不是如果分数较低)?如果多个触发事件交叉发生,我担心全局临时表可能会一团糟 . “DeletedMatches”的高分更新运行实际上尚未删除,但由Before触发事件注册 .

我可以创建一个表,a)仅在本地触发器中存在b)可以像普通的DB表或临时表一样在SQL中使用吗?

每当删除匹配时,以下(伪)代码将更新CurrentHighScores表(旧的高分数消失并被最高的剩余分数替换) .

CREATE TABLE GameScores (

MatchId number not null --primary key

Player varchar(255) not null,

Game varchar(255) not null, -- PacMan, Pong, whatever...

Score number not null );

-- High score for each game:

CREATE TABLE CurrentHighScores (

HiScId number not null --primary key

Player varchar(255) not null,

Game varchar(255) not null,

HighScore number not null );

create or replace TRIGGER UpdHiScoreOnMatchDelete

FOR DELETE ON GameScores

COMPOUND TRIGGER

TYPE matchtable IS TABLE OF GameScores%ROWTYPE INDEX BY SIMPLE_INTEGER;

DeletedMatches matchtable;

MatchIndex SIMPLE_INTEGER := 0;

BEFORE EACH ROW IS -- collect deleted match scores

BEGIN

MatchIndex:= MatchIndex+ 1;

DeletedMatches(MatchIndex).Game := :old.Game;

DeletedMatches(MatchIndex).Score := :old.Score;

-- don't want to set every column value, want to

-- do like: INSERT :old INTO DeletedMatches;

-- don't want the Index either!

END BEFORE EACH ROW;

AFTER STATEMENT IS

BEGIN

UPDATE CurrentHighScores hsc

SET hsc.HighScore=(

select max(gsc.Score) from GameScores gsc

where hsc.Game=gsc.Game)

where hsc.Game IN (

select del.Game from DeletedMatches del where hsc.HighScore = del.Score)

-- won't work, how can I check within the SQL if a row

-- for this game has been deleted, or anyhow integrate

-- DeletedMatches into the SQL, without a cursor?

-- Optional further cond. in subselect, to update only

-- if deleted score equals highscore:

and exists(

select 1 from GameScores where Game=hsc.Game);

-- ignore games without remaining match scores.

-- Delete/set zero code for games without existing scores omitted here.

END AFTER STATEMENT;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值