Как заменить все записи идентификатора электронной почты с прогрессом 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).

но производительность низкая. Если у вас есть альтернатива для этого, пожалуйста, напишите.

Другие вопросы по тегам