2015-12-30 3 views
0

Я пытаюсь обновлять примерно 20k линии для последовательности храненияОбновление нескольких строк в Informix SQL

Вот что данные выглядят как

Таблица: 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

Какая версия Informix вы используете? Это 12.10, 11.70 или какая-то другая версия? Является ли хранимая процедура приемлемым решением? –

ответ

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, но это не совсем отчетливо), затем выбирает значения последовательно и запускает инструкцию обновления один раз в строке, каждый раз корректируя порядковый номер. Это не так разрушительно для производительности, как в клиентской программе, поскольку данные не отправляются между клиентом и сервером; все это доступно на сервере.

Использование транзакционных заявлений должно быть тщательно рассмотрено. Если база данных не определена, они должны быть опущены. Если база данных зарегистрирована, то вы уже можете быть в транзакции, и в этом случае BEGIN WORK завершится с ошибкой. Вы можете использовать обработку исключений, чтобы идентифицировать это и продолжить, оставив любой код, запустивший транзакцию, чтобы завершить его (поэтому COMMIT WORK не будет выполняться, если BEGIN WORK не удалось). Вы можете использовать SAVEPOINT вместо полной транзакции. Вероятно, вам нужна какая-то обработка транзакций, чтобы изменения были отброшены, если между обработкой была часть проблемы.

Возможно, есть что-то сделать с функциями OLAP и ROW_NUMBER() - или, может быть, ROW_NUMBER() * 2 - 1 - но я не совсем уверен, как это сделать. Это должно работать с более или менее любой версией Informix, на которую вы можете положиться; функции OLAP доступны только в IDS 12.10 (и, возможно, некоторых более поздних 11.70 пакетах исправлений).

Предупреждение: код не запускается - но хранимая процедура была успешно создана, хотя база данных не содержала таблицу lc_f.

+0

Эй, я использую informix 11.50. Поэтому я могу определенно использовать это, но аргументация итераций заключается в том, что я пытаюсь сделать средний подход. поэтому все нечетные числа будут расширяться влево, а четные - вправо. Я планировал обновить последовательность за один проход. Могу ли я просто обновить ваш оператор select sql для установки параметров? например. 'SELECT Loc FROM lc_f WHERE substr (loc, 1,3) = 'BGB' и substr (loc, 6,1) in ('1', '2') INTO TEMP t_lc_f_sequence_numbers;' –

+0

Да, вы можете управлять тем, Значения Loc' обновляются путем изменения критериев, связанных с оператором SELECT ... INTO TEMP'. Вы можете настроить назначенные значения, указав start и increment (или более сложные механизмы - возможно, используя SEQUENCE).Если вам нужен другой порядок, чем исходные значения «Loc» в отсортированном порядке, вы можете добавить столбцы во временную таблицу, чтобы вы могли их заказать, а затем соответствующим образом изменить цикл FOREACH. Есть бесконечные адаптации, которые можно сделать, чтобы сделать его более точно, что вам нужно для этого. –

+0

Итак, я запускаю процедуру, и она выполняется, но не говорит, что никаких строк не затронуло. Я подумал, что, возможно, это проблема с Loc и loc, но это не решило. –

 Смежные вопросы

  • Нет связанных вопросов^_^