sql - Oracle触发器-更新同一张表后更新记录
问题描述
我想在 oracle 数据库中触发。当有人更改状态时,其状态再次变为未付款,以便其他用户可以使用相同的号码进行付款。我已经写了下面的代码,但它不会改变状态。请在这方面帮助我。谢谢你。
CREATE OR REPLACE TRIGGER PAY.TRG_UPDATE_NUMBER
AFTER UPDATE ON PAY.MYBILL
BEGIN
UPDATE PAY.MYBILL
SET STATUS='U'
WHERE MYNUMBER='123456789';
END;
解决方案
您需要一个触发器来确保特定数字的状态永远不会改变并且始终保持“U”。
为此,您需要一个BEFORE UPDATE
触发器。然后,Oracle 中的触发器旨在直接操作更新数据,而不是通过更新语句。你需要FOR EACH ROW
,所以你可以对单行的更新做出反应。
在更新触发器中,旧值可通过 访问:old
,新值可通过访问:new
。
CREATE OR REPLACE TRIGGER pay.trg_update_number
BEFORE UPDATE OF status ON pay.mybill
FOR EACH ROW
BEGIN
IF :new.mynumber = 123456789 THEN
:new.status := 'U'; -- or :new.status := :old.status;
END IF;
END trg_update_number;
代替IF
/THEN
你也可以使用一个WHEN
子句:
CREATE OR REPLACE TRIGGER pay.trg_update_number
BEFORE UPDATE OF status ON pay.mybill
FOR EACH ROW
WHEN (new.mynumber = 123456789)
BEGIN
:new.status := 'U'; -- or :new.status := :old.status;
END trg_update_number;
推荐阅读
- apache-flink - 是否可以使用 Apache Flink 在多台机器上分发 MapState 值?
- neo4j - “此查询在断开连接的模式之间构建笛卡尔积”警告
- php - Hello World PHP 示例,用于存储和读取来自 Google Apps Engine 的免费 Google Cloud Storage 存储桶中的文件
- mysql - INFORMATION_SCHEMA.TABLE_CONSTRAINTS 缺少在 MySQL 中显示为 SHOW INDEX 的索引
- continuous-integration - ML 模型部署 CI/CD
- r - 如何更改跟踪中段的颜色?
- acumatica - 如何在 BQL 中使用“喜欢”
- php - 如何将属性添加到其他数组中的对象?
- android - 返回的响应错误代码:500 - Expo 和 React
- keras - 步幅的长度应为 1、1 或 3,但为 2