Как заменить все записи идентификатора электронной почты с прогрессом 4gl
The problem here is I want to update the email ids, I want to update like user@abc.com to user@xyz.com
Я выбрал все идентификаторы электронной почты, как это,
for each table where
table.email matches "*" + "@abc.com" + "*" no-lock :
Display
Я не могу использовать функцию замены, так как каждый идентификатор электронной почты будет разной длины. Можно ли изменить адреса электронной почты, как это? Пожалуйста, поделитесь со мной.
2 ответа
Замена в точности "abc" на "xyz" выполняется следующим образом:
/* You need to change NO-LOCK to EXCLUSIVE-LOCK if you want to update or change! */
FOR EACH table WHERE table.email MATHES"*" + "@abc.com" + "*" EXCLUSIVE-LOCK:
ASSIGN
table.email = REPLACE(table.email, "@abc.com", "@xyz.com").
END.
Но, может быть, вам нужно уточнить свой вопрос или это все, что вы хотите сделать?
О производительности
Этот запрос не будет очень быстрым. В Matches не используются никакие индексы, поэтому будет сканироваться вся таблица. В более поздних версиях Progress вы можете добавить TABLE-SCAN
вариант. Это увеличит скорость, но не намного. Если вы сделаете это, вам придется удалить выражение MATCHES в запросе и сделать так:
FOR EACH table EXCLUSIVE-LOCK TABLE-SCAN:
IF table.email MATCHES etcetera
END.
END.
Если это одноразовая вещь, чтобы исправить адреса электронной почты, возможно, это не должно быть так быстро? Если нет, я предлагаю вам добавить в таблицу логическое поле (table.fixed) и создать индекс с полем в нем. Тогда вы сможете очень быстро пройти все нефиксированные записи.
Я попробовал себя, и я написал так, и это сработало.
def var cmail1 as char.
def var cmail2 as char.
assign
cmail1 = "@abc.com"
cmail2 = "@xyz.com".
for each table where
exclusive-lock :
Assign
table.email = REPLACE(table.email, cmail1, cmail2).
но производительность низкая. Если у вас есть альтернатива для этого, пожалуйста, напишите.