Sai*_*ash 2 toad sqlplus oracle11g
我有一个4列的表
1.msisdn
2.accountnumber
3.cardnumber
4.subscriptiondate
Run Code Online (Sandbox Code Playgroud)
我想为此表添加一个触发器.如果我插入的数据是
1.99999999
2.2
3.3298572857239
4.(this can be blank)
Run Code Online (Sandbox Code Playgroud)
并且表中当前的数据是
1.99999999
2.1
3.3298572857239
4.(this can be blank)
Run Code Online (Sandbox Code Playgroud)
触发器应该检查是否有这个msisdn 99999999已经有这个卡号的记录3298572857239.如果表中已存在记录,则触发器应删除现有条目并插入新条目.最终结果应如下所示
1.99999999
2.1
3.3298572857239
4.(this can be blank)
Run Code Online (Sandbox Code Playgroud)
我想在触发器之前和之后保持accountnumber的值相同.这是我到目前为止所尝试的但是对于这个触发器,我没有在accountnumber列中获得任何数据.请有人帮忙
DROP TRIGGER TRIG_TABLEA;
CREATE OR REPLACE TRIGGER TRIG_TABLEA
BEFORE INSERT ON TABLEA
REFERENCING OLD AS Old NEW AS New
FOR EACH ROW
BEGIN
:new.accountnumber := :old.accountnumber;
DELETE FROM TABLEA WHERE MSISDN = :new.MSISDN AND CARDNUMBER = :new.CARDNUMBER;
:new.MSISDN := :new.MSISDN;
:new.CARDNUMBER := :new.CARDNUMBER;
:new.accountnumber := :old.accountnumber;
END;
/
Run Code Online (Sandbox Code Playgroud)
不要进行删除和插入.你想要的MERGE.您的声明中唯一可以更改的是accountnumber和subscriptiondate.您没有说出数据来自何处,因此我假设这是一个以p_*作为参数的PL/SQL过程.所以你想要这样的东西:
MERGE INTO mytable trg
USING ( SELECT p_accountnumber, p_subscriptiondate FROM dual ) src
ON ( trg.msisdn = p_msisdn AND trg.cardnumber )
WHEN NOT MATCHED INSERT ( msisdn, accountnumber, cardnumber, subscriptiondate )
VALUES ( p_msisdn, p_accountnumber, p_cardnumber, p_subscriptiondate )
WHEN MATCHED SET ( cardnumber = p_cardnumber, subscriptiondate = p_subscriptiondate)
Run Code Online (Sandbox Code Playgroud)
如果行不存在,则执行插入操作;如果存在,则执行更新现有行.
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |