Там могут быть лучшие способы сделать это, но это простодушный скотина процедура сила сохраняется должна сделать работу:
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
.
Какая версия Informix вы используете? Это 12.10, 11.70 или какая-то другая версия? Является ли хранимая процедура приемлемым решением? –