使用jdbi的Oracle更新查询只更新了部分列,而不是全部列
我知道这是一种奇怪的行为,但在处理oracle连接或事务时,我显然遗漏了一些东西 下面是我在jdbi中的更新查询,它试图更新4列使用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
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>