条件SQL-触发器设置标志

时间:2017-11-10 10:53:25

标签: java sql oracle oracle-sqldeveloper

关于我为表格创建的触发器,我有几个问题:

Table with the trigger

应根据对任何状态字段所做的更改将标志设置为true或false。 Java-Application将读取此标志,该值将把值推送到JIRA-REST-Service。

我做的方式相当冗长,是一个更大的触发器的一部分,所以这里有一些伪sql给你一个想法:

-- Part of code that works, Selection of table, setting var_push_flag to false, and other SQL
-- ...
-- BEGIN MY Part of Code
IF
    :new.STATUS_SERVICE_1 <> :old.STATUS_SERVICE_1
    or
    :new.STATUS_SERVICE_2 <> :old.STATUS_SERVICE_2
    or
    ....
    or
    :new.STATUS_SERVICE_N <> :old:STATUS_SERVICE_N
THEN
    var_push_flag := 'true';
ELSE
    var_push_flag := 'false';
END IF
-- END MY Part of Code
-- Part of the code that updates the table (works)

请忽略此表中的所有内容都是字符串的事实,因为:

  1. 我没有设计它
  2. 这不是问题的一部分(虽然这是一个问题)
  3. 我的问题是:

    1. 是否有一种不那么冗余的方法来检查是否有任何字段发生了变化?
    2. 有时它会更改字段的值,但update-flag不会设置为true。我检查了它是否是一个未包含在触发器中的字段,但确实如此。我还测试了更新所有字段但仍然没有结果。这只发生在一个特定的行上。
    3. 非常感谢你!

1 个答案:

答案 0 :(得分:1)

  1. 除非您想阅读表格元数据和动态SQL,否则您所拥有的只是我所知道的唯一方式。

  2. 您的任何列都可以为空吗?如果是,:new.Foo <> :old.Foo将评估为UNKNOWN,而不是TRUE。您还需要检查任何可为空的列的空值:

    :new.Foo <> :old.Foo 
    OR :new.Foo IS NULL and :old.Foo IS NOT NULL
    OR :new.Foo IS NOT NULL and :old.Foo IS NULL
    
  3. (同时确保var_push_flag确实实际上在以后使用。)