在Informix SQL中更新多行

时间:2015-12-30 15:43:30

标签: sql database informix

我尝试更新大约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    |
---------------------

任何帮助都会非常有帮助。

1 个答案:

答案 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