Я думаю, что дизайн должен быть пересмотрен. Для начала, что произойдет, если некоторые строки будут удалены из tmp_cb_rcpthdr
? Запрос COUNT(*)
приведет к дублированию значений lineno
.
Даже если это процесс только для ETL, и вы можете быть уверены, что данными не будут манипулировать из других источников, производительность будет проблемой, и она будет только ухудшаться, чем больше данных у вас будет для любой комбинации компании и batch_id.
Нужно ли бельё увеличивать с нуля, или это просто для поддержания первоначального порядка загрузки? Потому что, если это последнее, поле SEQUENCE
или SERIAL
в таблице достигнет того же конца и будет лот более эффективным.
Если вы должны сгенерировать lineno
таким образом, я бы посоветовал вам создать вторую контрольную таблицу с ключом company и batch_id, которая отслеживает текущее значение lineno
, то есть: (не проверено)
CREATE PROCEDURE update_line(company CHAR(4), batch CHAR(8));
DEFINE lineno INT;
SELECT cbrh_lineno INTO lineno
FROM linenoctl
WHERE cbrh_company = company
AND cbrh_batchid = batch;
UPDATE linenoctl
SET cbrh_lineno = lineno + 1
WHERE cbrh_company = company
AND cbrh_batchid = batch;
-- A test that no other process has grabbed this record
-- might need to be considered here, ie cbrh_lineno = lineno
RETURN lineno + 1
END PROCEDURE;
Затем используйте его следующим образом:
CREATE TRIGGER tmp_cb_rcpthdr_ins INSERT ON tmp_cb_rcpthdr
REFERENCING NEW AS n
FOR EACH ROW
(
EXECUTE PROCEDURE update_line(n.company, cbrh_batchid) INTO cbrh_lineno
);
См. Документацию IDS для получения дополнительной информации об использовании вычисленных значений с триггерами.