与Trigger

时间:2016-07-23 07:23:06

标签: sql oracle plsql oracle11g plsqldeveloper

我的要求是:有两个表:a)C_Table,b)Mst_Table

两者都有相同的表结构,包含三列:i)S_NO,ii)CONTENT_ID,iii)INSTANCES

Mst_Table最初有三条记录:

INSERT INTO Mst_Table Values (1, 'A1', 20);    
INSERT INTO Mst_Table Values (2, 'A2', 10);    
INSERT INTO Mst_Table Values (3, 'A3', 5);  

现在,我在表C_table中插入四条记录:

INSERT INTO C_Table Values (1, 'A1', 22);    
INSERT INTO C_Table Values (2, 'A4', 20);    
INSERT INTO C_Table Values (3, 'A5', 5);    
INSERT INTO C_Table Values (4, 'A1', 18);   

在表C_table中插入记录时,应检查列{ - 1}},CONTENT_ID是否已有任何记录。如果不是,那么插入将在Mst_Table成功完成,但如果是,那么它将检查列 - C_table

如果INSTANCES的{​​{1}}值大于INSTANCES,那么C_Table列中的C_table值应该更新为Mst_Table - INSTANCES)值。

触发器定义:

INSTANCES_Value_C_Table

1 个答案:

答案 0 :(得分:0)

这是你的意图吗?

DROP TABLE Mst_Table
GO
DROP TABLE C_Table
GO

CREATE TABLE Mst_Table 
(
    S_NO int,
    CONTENT_ID varchar(2),
    INSTANCES int
)
GO
CREATE TABLE C_Table 
(
    S_NO int identity(1,1) not null,
    CONTENT_ID varchar(2),
    INSTANCES int
)
GO

 INSERT INTO Mst_Table Values (1, 'A1', 20);
 INSERT INTO Mst_Table Values (2, 'A2', 10);
 INSERT INTO Mst_Table Values (3, 'A3', 5); 
GO

CREATE TRIGGER VCTable ON C_Table
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO C_Table (CONTENT_ID, INSTANCES)
    SELECT inserted.CONTENT_ID, isnull(C_Table.INSTANCES - inserted.INSTANCES, inserted.INSTANCES)
    FROM inserted
    LEFT JOIN C_Table ON inserted.S_NO = C_Table.S_NO
    LEFT JOIN Mst_Table on inserted.CONTENT_ID = Mst_Table.CONTENT_ID   
END
GO

INSERT INTO C_Table (CONTENT_ID, INSTANCES) Values ('A1', 22);
INSERT INTO C_Table (CONTENT_ID, INSTANCES) Values ('A4', 20);
INSERT INTO C_Table (CONTENT_ID, INSTANCES) Values ('A5', 5);
INSERT INTO C_Table (CONTENT_ID, INSTANCES) Values ('A1', 18); 

SELECT * FROM C_Table