使用jdbi的Oracle更新查询只更新了部分列,而不是全部列

使用jdbi的Oracle更新查询只更新了部分列,而不是全部列,oracle,transactions,jdbi,Oracle,Transactions,Jdbi,我知道这是一种奇怪的行为,但在处理oracle连接或事务时,我显然遗漏了一些东西 下面是我在jdbi中的更新查询,它试图更新4列 UPDATE TASK SET TASK_STATUS = 'closed', IS_DIRTY = 0, UPDATED_BY = :updatedBy, UPDATED_AT = sysdate WHERE SOURCE_TASK_ID = :taskId AND SOURCE_SYSTEM = :sourc

我知道这是一种奇怪的行为,但在处理oracle连接或事务时,我显然遗漏了一些东西

下面是我在jdbi中的更新查询,它试图更新4列

UPDATE TASK
   SET TASK_STATUS = 'closed',
       IS_DIRTY = 0,
       UPDATED_BY = :updatedBy,
       UPDATED_AT = sysdate
 WHERE SOURCE_TASK_ID = :taskId
   AND SOURCE_SYSTEM = :sourceSystem
update语句返回true(表示已更新)。但是,当我签入表时,仅更新了,更新了,而不是任务状态,并且是脏的(表中只存在一行)

奇怪的是,有时它会更新所有列


感谢您的帮助:)

除了有一些
触发器之外,在oracle中不可能更新某些列,也不可能更新某些列。这根本不可能

请参见下面的示例:

创建示例表:

将数据插入表:

表中截至目前的数据:

表中的正常更新:

现在从表中选择数据。

哦,所有的栏目都更新了

现在,让我们创建一个不更新某些列的情况

从表中删除和插入新记录:

现在,创建触发器来操作更新:

查看
任务状态的值
是否脏
未更改

让我们尝试使用
UPDATED\u BY='Tejash'

好的!!现在更新了。因此,有时它会更新列值,有时则不会,因为触发器中存在一些条件,在这两者之间更改值。(这一定是你所面临的奇怪行为的原因)

如果您想查看是否在您的表上创建了任何触发器,则可以在所有\u触发器视图中进行检查,如下所示:

希望,它会对你有用,并消除你的疑虑


干杯

检查该表上是否有触发器 从dba_触发器中选择*表_name='TASK'


如果Db说dba_触发器不存在,请尝试从所有_触发器进行查询

这是不可能的,所以我猜您的数据有问题。update语句完成而只更新
SET
子句中的一些列而不是所有列的可能性更小。或者您可能在表上有一些update操作触发器,将其设置回原始值。
SQL> CREATE TABLE TASK (
  2      SOURCE_TASK_ID   NUMBER,
  3      SOURCE_SYSTEM    VARCHAR2(100),
  4      TASK_STATUS      VARCHAR2(100),
  5      IS_DIRTY         NUMBER,
  6      UPDATED_BY       VARCHAR2(100),
  7      UPDATED_AT       DATE
  8  );

Table created.

SQL>
SQL>
SQL> INSERT INTO TASK VALUES (
  2      1,
  3      'SO',
  4      'open',
  5      1,
  6      NULL,
  7      NULL
  8  );

1 row created.

SQL> COMMIT;

Commit complete.

SQL>
SQL> SELECT * FROM TASK;

SOURCE_TASK_ID SOURCE_SYS TASK_STATU IS_DIRTY UPDATED_BY   UPDATED_AT
-------------- ---------- ---------- -------- ------------ ---------------
             1 SO         open            0                

SQL>
SQL> UPDATE TASK
  2  SET
  3      TASK_STATUS = 'closed',
  4      IS_DIRTY = 0,
  5      UPDATED_BY = 'Tejash',
  6      UPDATED_AT = SYSDATE
  7  WHERE
  8      SOURCE_TASK_ID = 1
  9      AND SOURCE_SYSTEM = 'SO';

1 row updated.

SQL>
SQL> COMMIT;
SQL> SELECT * FROM TASK;

SOURCE_TASK_ID SOURCE_SYS TASK_STATU IS_DIRTY UPDATED_BY   UPDATED_AT
-------------- ---------- ---------- -------- ------------ ---------------
             1 SO         closed            0 Tejash       03-JAN-20

SQL>
SQL> DELETE FROM TASK;

1 row deleted.

SQL> COMMIT;

Commit complete.

SQL> INSERT INTO TASK VALUES (
  2      1,
  3      'SO',
  4      'open',
  5      1,
  6      NULL,
  7      NULL
  8  );

1 row created.

SQL> SELECT * FROM TASK;

SOURCE_TASK_ID SOURCE_SYS TASK_STATU IS_DIRTY UPDATED_BY   UPDATED_AT
-------------- ---------- ---------- -------- ------------ ---------------
             1 SO         open              1

SQL>
SQL> CREATE OR REPLACE TRIGGER TASK_TRG BEFORE
  2      UPDATE ON TASK
  3      FOR EACH ROW
  4  BEGIN
  5      IF :NEW.UPDATED_BY <> 'Tejash' THEN -- any condition
  6          :NEW.TASK_STATUS := :OLD.TASK_STATUS;
  7          :NEW.IS_DIRTY := :OLD.IS_DIRTY;
  8      END IF;
  9  END;
 10  /

Trigger created.

SQL>
SQL> UPDATE TASK
  2  SET
  3      TASK_STATUS = 'closed',
  4      IS_DIRTY = 0,
  5      UPDATED_BY = 'Not Tejash', -- see this
  6      UPDATED_AT = SYSDATE
  7  WHERE
  8      SOURCE_TASK_ID = 1
  9      AND SOURCE_SYSTEM = 'SO';

1 row updated.

SQL>
SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM TASK;

SOURCE_TASK_ID SOURCE_SYS TASK_STATU IS_DIRTY UPDATED_BY   UPDATED_AT
-------------- ---------- ---------- -------- ------------ ---------------
             1 SO         open              1 Not Tejash   03-JAN-20

SQL>
SQL> UPDATE TASK
  2  SET
  3      TASK_STATUS = 'closed',
  4      IS_DIRTY = 0,
  5      UPDATED_BY = 'Tejash', -- see this
  6      UPDATED_AT = SYSDATE
  7  WHERE
  8      SOURCE_TASK_ID = 1
  9      AND SOURCE_SYSTEM = 'SO';

1 row updated.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM TASK;

SOURCE_TASK_ID SOURCE_SYS TASK_STATU IS_DIRTY UPDATED_BY   UPDATED_AT
-------------- ---------- ---------- -------- ------------ ---------------
             1 SO         closed            0 Tejash       03-JAN-20

SQL>
SQL> SELECT
  2      OWNER,
  3      TRIGGER_NAME,
  4      TABLE_OWNER,
  5      TABLE_NAME,
  6      TRIGGER_TYPE,
  7      TRIGGERING_EVENT
  8  FROM
  9      ALL_TRIGGERS
 10  WHERE
 11      TABLE_NAME = 'TASK';

OWNER      TRIGGER_NAME    TABLE_OWNE TABLE_NAME TRIGGER_TYPE         TRIGGERING
---------- --------------- ---------- ---------- -------------------- ----------
TEJASH     TASK_TRG        TEJASH     TASK       BEFORE EACH ROW      UPDATE

SQL>