Java 条件SQL-设置标志的触发器

Java 条件SQL-设置标志的触发器,java,sql,oracle,oracle-sqldeveloper,Java,Sql,Oracle,Oracle Sqldeveloper,我有几个关于我为如下表创建的触发器的问题: 根据对任何状态字段所做的更改,应将标志设置为true或false。该标志将由Java应用程序读取,该应用程序将值推送到JIRA-REST-Service 我这样做的方式相当冗长,而且是一个更大触发器的一部分,因此这里有一些伪sql让您了解一下: -- Part of code that works, Selection of table, setting var_push_flag to false, and other SQL -- ... --

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

根据对任何状态字段所做的更改,应将标志设置为true或false。该标志将由Java应用程序读取,该应用程序将值推送到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)
——工作代码的一部分,选择表,将var\u push\u标志设置为false,以及其他SQL语句
-- ...
--开始我的代码部分
如果
:new.STATUS\u SERVICE\u 1:old.STATUS\u SERVICE\u 1
或
:new.STATUS\u SERVICE\u 2:old.STATUS\u SERVICE\u 2
或
....
或
:new.STATUS\u SERVICE\N:old:STATUS\u SERVICE\N
然后
var_push_标志:='true';
其他的
var_push_标志:='false';
如果结束
--结束我的代码部分
--更新表格的部分代码(工作)
请忽略此表中的所有内容都是字符串的事实,因为:

  • 不是我设计的
  • 这不是问题的一部分(尽管这是个问题)
  • 我的问题是:

  • 是否有一种较少冗余的方法来检查是否有任何字段已更改
  • 有时它确实会更改字段的值,但update标志没有设置为true。我检查了它是否是触发器中未包含的字段,但它是。我还对它进行了测试,更新了所有字段,但仍然没有结果。这只发生在一个特定的行上
  • 提前非常感谢

  • 除非您想阅读表元数据和动态SQL,否则就我所知,您拥有的是唯一的方法

  • 您的任何列都可以为空吗?如果是这样,
    :new.Foo:old.Foo
    将计算为
    未知
    ,而不是
    。您还需要检查任何可为空的列是否为空:

    :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
    
    :new.Foo:old.Foo
    或者:new.Foo为NULL,而:old.Foo不为NULL
    或者:new.Foo不为NULL,而:old.Foo为NULL
    

  • (还要确保以后确实使用了
    var\u push\u flag

    我检查了字段,它们都可以为空,但有一个值。我还需要检查空值吗?@Zanidd您确实需要检查空值,但是如果列既有值又有值,那么这就不是问题所在行的特定问题,而且肯定还有其他问题,我将无论如何修复触发器。还有其他建议吗?@Zanidd从你的片段中我看不出。也许有什么东西提前回来了?