【问题标题】:sql trigger using two tables data使用两个表数据的sql触发器
【发布时间】:2013-05-12 18:56:08
【问题描述】:

所以我有三张桌子。前两个有 ID 列和“rank”列(一个整数)。我将在第三个表中插入两个 ID(ID1、ID2),但我需要触发器来检查它们是否是相同的等级,然后才能插入。我无法让它工作。

CREATE OR REPLACE TRIGGER TRIGGER1 
AFTER INSERT ON TABLE_C 

BEGIN
IF NOT EXISTS (
SELECT TABLE_A.id, TABLE_B.id
FROM TABLE_A JOIN TABLE_B ON TABLE_A.rank = TABLE_B.rank
WHERE TABLE_A.id = inserted.id1 AND TABLE_B.id = inserted.id2 )
THEN
PRINT 'Not the same rank'
ROLLBACK
END
END;

我正在使用 Oracle 数据库。

【问题讨论】:

  • 语法太错误了......你看过任何Oracle触发器文档吗?

标签: sql oracle triggers


【解决方案1】:

您不能在 Oracle 触发器中使用“回滚”或“提交” - please refer this

我认为您可以按如下方式修改触发器-

CREATE OR REPLACE TRIGGER Trigger1
    AFTER INSERT ON Table_c
    FOR EACH ROW
  DECLARE
    l_Count NUMBER := 0;
  BEGIN
    SELECT COUNT(*)
      INTO l_Count
      FROM Table_a
      JOIN Table_b ON Table_a.Rank = Table_b.Rank
     WHERE Table_a.Id = :NEW.Id1
       AND Table_b.Id = :NEW.Id2;
    IF l_Count = 0 THEN
      DELETE FROM Table_c
       WHERE Id1 = :NEW.Id1
         AND Id2 = :NEW.Id2;
      --PRINT 'Not the same rank'
      Dbms_Output.Put_Line('Not the same rank');
    END IF;
  END;
/

【讨论】:

  • 谢谢,这很有帮助
【解决方案2】:

触发器有两种,BEFOREAFTER 触发器。如果要在插入数据之前检查数据是否具有相同的排名,则应使用 BEFORE 触发器。

CREATE OR REPLACE TRIGGER TRIGGER1 
BEFORE INSERT ON TABLE_C

那么逻辑就会随之而来。

更新:您可以轻松raise application error。如:

IF HasSameRank == 0 THEN
    raise_application_error(-21013, 'Not the same rank');
END IF;

【讨论】:

  • 是的,对不起,我都尝试了,但还是有问题。
  • @semihyagcioglu 请建议如何使用“插入前”条件在触发器中插入失败..
  • 它说“错误(5,18):PLS-00103:在期望以下之一时遇到符号“TABLE_B”:),组有相交减去开始联合,其中连接“它说错误是 JOIN 在 TABLE_B 上的位置
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多