我目前正在尝试
SELECT DISTINCT * FROM FINAL TABLE
(UPDATE mainTable SET value = 'N' WHERE value2 = 'Y')
但是,我拥有的DB2版本似乎不支持这一点
SQL Error [42601]: [SQL0199] Keyword UPDATE not expected. Valid tokens: INSERT.
在DB2中是否有其他方法可以返回所需的结果?在一个查询中,我们可以在哪里更新并返回结果?
EDIT -Select叙述句应该会传回服务器应用程序要开始行程的值。发生这种情况时,会更新数据栏,以指出此数据列的行程已经开始。稍后的命令会在数据列行程完成时再次更新数据列。
ORIGINAL DATA
ROW ID | COLUMN TWO | PROCESSING FLAG
-------------------------------------------
1 | TASK 1 | N
2 | TASK 2 | N
3 | TASK 3 | N
4 | TASK 4 | N
乐观选择/更新查询之后
Data Table returned as:
ROW ID | COLUMN TWO | PROCESSING FLAG
-------------------------------------------
1 | TASK 1 | Y
2 | TASK 2 | Y
3 | TASK 3 | Y
4 | TASK 4 | Y
这是由一个.NET应用程序调用的,因此它将被转换为表对象的列表。
2条答案
按热度按时间41ik7eoe1#
在DB2 IBM i 7.3中(甚至在目前的7.4中),不能在table-reference中指定
UPDATE
,而在Db2 for LUW中可以这样做。只有
INSERT
可用。一种可能的模拟是使用动态复合语句、定位更新和临时表来保存更新行的信息。
| 识别码|列|旗标|
| - -|- -|- -|
| 一个|任务1| Y型|
| 2个|任务2| Y型|
| 三个|任务3| Y型|
| 四个|任务4| Y型|
| 识别码|
| - -|
| 一个|
| 2个|
| 三个|
oxf4rvwz2#
虽然您目前无法在DB2 for IBM i上使用
SELECT FROM FINAL TABLE(UPDATE ...)
...您可以在事务的上下文中执行
UPDATE mainTable SET value = 'Y' WHERE value2 = 'N' with RR
个SELECT * FROM mainTable WHERE value2 = 'Y'
COMMIT
使用
RR
- Repeatable read意味着整个表将被锁定,直到您发出提交为止。如果您了解/控制使用该表的任何其他进程,则可以使用较低的isolation level。或者,如果您愿意做一些额外的工作...下面的代码只锁定返回的行。
UPDATE mainTable SET value = '*' WHERE value2 = 'N' with CHG
SELECT * FROM mainTable WHERE value2 = '*'
UPDATE mainTable SET value = 'Y' WHERE value2 = '*' with CHG
COMMIT
执行此操作的直接SQL方法是通过游标和
UPDATE WHERE CURRENT OF CURSOR ....
最后,由于您使用的是.NET,我建议您查看一下IBM .NET提供程序技术参考(IBMACSWindows应用程序包的一部分)中的
iDB2DataAdapter
类您也可以在Integrating DB2 Universal Database for iSeries with Microsoft ADO .NET红皮书中找到一些有用的信息。