我尝试更新大约20k行的存储序列
这里是数据的样子
表:lc_f
-------------------
|Loc |store_seq|
|BGB011 |82600 |
|BGB012 |82610 |
|BGB021 |82640 |
|BGB022 |82650 |
|BGB031 |82680 |
|BGB032 |82690 |
---------------------
我想用一个更新查询更新所有store_seq,增量为2(为简单起见,我将从1开始)
这是我之后想要的样子。
-------------------
|Loc |store_seq|
|BGB011 |00001 |
|BGB012 |00003 |
|BGB021 |00005 |
|BGB022 |00007 |
|BGB031 |00009 |
|BGB032 |00011 |
---------------------
任何帮助都会非常有帮助。
答案 0 :(得分:0)
可能有更好的方法可以做到这一点,但这个简单的蛮力存储过程应该可以完成这项工作:
CREATE PROCEDURE update_lc_f_sequence_numbers()
DEFINE v_loc CHAR(10);
DEFINE v_seq INTEGER;
BEGIN WORK;
SELECT Loc FROM lc_f INTO TEMP t_lc_f_sequence_numbers;
LET v_seq = 1;
FOREACH SELECT Loc INTO v_loc FROM t_lc_f_sequence_numbers ORDER BY Loc
UPDATE lc_f SET Store_Seq = v_seq WHERE Loc = v_loc;
LET v_seq = v_seq + 2;
END FOREACH;
DROP TABLE t_lc_f_sequence_numbers;
COMMIT WORK;
END PROCEDURE;
任何处理的棘手部分是将序列号应用于正确排序的'loc'值。这会在临时表中创建一个loc值的副本(最初,我使用t
,但这并不是非常独特),然后按顺序选择值并每行运行一次update语句,调整序列号每一次。这不像在客户端程序中那样具有破坏性,因为数据不是在客户端和服务器之间发送的;它在服务器中都可用。
应仔细考虑使用交易声明。如果数据库未记录,则必须省略它们。如果记录了数据库,那么您可能已经处于事务中,在这种情况下,BEGIN WORK将失败。您可以使用异常处理来识别并继续,保留启动事务的任何代码来完成它(因此如果BEGIN WORK失败,则不会执行COMMIT WORK)。您可以考虑使用SAVEPOINT而不是完整事务。您可能需要某种事务处理,以便在处理过程中出现问题时回滚更改。
可能有办法对OLAP函数和ROW_NUMBER() - 或者ROW_NUMBER() * 2 - 1
做一些事情 - 但我不太清楚如何做到这一点。这应该或多或少与您可以使用的任何Informix版本一起使用; OLAP功能仅在IDS 12.10(以及稍后的11.70修订包)中可用。
警告:代码未运行 - 但存储过程已成功创建,即使数据库不包含表lc_f
。