【问题标题】:Issue related to Trigger与触发器相关的问题
【发布时间】:2016-11-27 02:44:40
【问题描述】:

我的要求是:有两个表: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 中时,它应该检查列 - CONTENT_IDMst_Table 是否已经有任何记录。如果不是,则插入将在 C_table 中成功完成,但如果是,则它将检查列 - INSTANCES

如果C_TableINSTANCES 值大于Mst_Table,则在INSTANCES 列的C_table 值中应使用(INSTANCES_Value_C_Table - INSTANCES_Value_Mst_Table) 值进行更新。

触发器定义:

create or replace trigger ANALYTICS_UPDATE_COUNT 
    after insert on C_Table referencing old as old new as new 
    for each row 

    DECLARE -- variable declarations 
    v_instance number; 
    v_count number; 

BEGIN 
    insert into temp_logger (log_text) 
    values ('-------------BEGIN-------------'); 

    -- trigger code 
    BEGIN 
         select distinct INSTANCES 
         into v_instance 
         from Mst_Table 
         where CONTENT_ID = :new.CONTENT_ID; 

    EXCEPTION 
          WHEN OTHERS 
              THEN 
                NULL; 
    END; 

    insert into temp_logger (log_text) values ('Count for ' || :new.CONTENT_ID|| ' is : '|| v_instance); 
    insert into temp_logger (log_text) values ('Difference between new and existing: ' || (:new.INSTANCES - v_instance)); 

    if ((:new.INSTANCES - v_instance) <=0 ) then 
        v_count := 0; 
    else 
        v_count := (:new.INSTANCES - v_instance); 
    end if; 

    insert into temp_logger (log_text) values ('v_count variable: ' ||v_count); 

    if v_count = 0 then 
        insert into temp_logger (log_text) values ('Inside IF'); 
        DELETE from C_Table where CONTENT_ID = :new.CONTENT_ID; 
        COMMIT; 
    else 
        insert into temp_logger (log_text) values ('Inside ELSE'); 
        UPDATE C_Table 
        set INSTANCES = v_count 
        where CONTENT_ID = :new.CONTENT_ID; 

   COMMIT; 
    end if; 

EXCEPTION 
     WHEN OTHERS 
           THEN 
              NULL; 

END;

【问题讨论】:

  • 您是在 SQL Server、MySQL 和 Oracle 上开发这个吗?如果不是,请删除不需要的标签。这些不像社交媒体上的哈希标签。
  • @JonathonOgden:感谢您的编辑和建议,是的,我将删除哈希标签。另外,我需要理解一件事,我需要添加以下内容,但没有得到编辑代码的代码工具栏:
  • 已添加(可能是一些语法问题)。请删除 cmets。
  • @JonathonOgden:完成。谢谢

标签: sql oracle plsql oracle11g plsqldeveloper


【解决方案1】:

这是你的意图吗?

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

【讨论】:

  • 是的,你已经接近我的要求了。但是我对您创建的触发器确实有一些疑问:1)表的结构是什么 - “插入”? 2) ISNULL 和 NULLIF 相同吗? 3)我没看懂: 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在插入的.CONTENT_ID = Mst_Table.CONTENT_ID
  • 另外,4)我的要求基本上是,当我在 C_Table 中进行插入时,它会检查 MST_Table 中是否已经存在 content_id,如果是,则会检查 Instances 的值,如果值 (Instance_C_Table > Instance_Mst_Table),则 C_Table 中的值将更新为 -- (Instance_C_Table - Instance_Mst_Table)。如果在任何时候我不清楚,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2021-06-05
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多