Как заменить доменное имя всей электронной почты

Я пытаюсь заменить окончание любого электронного письма конкретным доменом электронной почты. В процедуру будут переданы две строки: первая - это исходное доменное имя, которое необходимо заменить; и Во-вторых, новое доменное имя, которое будет заменять исходное (в указанном порядке). Например, если в процедуру передаются строки «sadme.com» и «happyme.com», каждое электронное письмо в базе данных с доменным именем «sadme.com» будет изменено на «happyme.com» в качестве их доменное имя

Примеры:

Before                     After
-------------------------- ---------------------------
[email protected]     [email protected]
[email protected]  [email protected]

Это то, что у меня есть, но я получаю сообщение об ошибке

          Create Procedure PR_Q3
    (P_OldDomain Varchar2,P_NewDomain Varchar2)
    As
      Cursor C_Domains IS Select Email_Address


       From Broker 
                     where Email_Address =  '%@'||P_OldDomain;
               V_OldDomain Varchar2(50);       
          Begin
          Open C_Domains;
          Fetch C_Domains INTO V_OldDomain;
          While C_Domains%Found loop
                if C_Domains = '%@'||P_OldDomain Then
                    Update Broker
                    Set Email_Address = P_NewDomain
                    Where Email_Address = V_OldDomain;
              End if;      
          Fetch C_Domains into P_NewDomain;
          End Loop;
  Close C_Domains;
End PR_Q3;
/
Show Errors;

я получаю ошибки:

ОШИБКА ЛИНИИ / ЦВЕТА


2/29 PLS-00103: Обнаружен символ "(" при ожидании одного из следующих событий:

     := . ) , @ % default character
     The symbol ":=" was substituted for "(" to continue.

2/61 PLS-00103: Обнаружен символ "(" при ожидании одного из следующих событий:

     := . ) , @ % default character
     The symbol ":=" was substituted for "(" to continue.

Также я попытался вынуть varchar2 (50) и просто поставить Varchar2, и он дал мне ошибку:

 PLS-00403: expression 'P_NewDomain' cannot be used as an INTO-target of a SELECT/FETCH statement

Спасибо!


person mike    schedule 27.09.2018    source источник


Ответы (3)


Начиная с позиции 1, замените второй набор символов, отличных от '@', на bananas.com:

regexp_replace(email, '[^@]+', 'bananas.com', 1, 2)

или просто замените все, начиная с '@' на @bananas.com:

regexp_replace(email, '@.+*','@bananas.com')
person William Robertson    schedule 27.09.2018
comment
будет ли это работать в процедуре, у которой тоже есть курсор? - person mike; 28.09.2018
comment
Не понимаю, почему нет, это просто SQL. - person William Robertson; 28.09.2018

Я запустил следующее на Oracle 10 DB. Надеюсь, это то, что вам нужно:

WITH
    sampledata AS
        (SELECT '[email protected]' AS eaddress FROM DUAL
         UNION ALL
         SELECT '[email protected]' FROM DUAL
         UNION ALL
         SELECT '[email protected]' FROM DUAL)
SELECT eaddress
     , REGEXP_REPLACE (eaddress, '^(.+@).+(\..+$)', '\1gmail\2') t
  FROM sampledata;

eaddress                     t
[email protected]          [email protected]
[email protected]  [email protected]
[email protected]       [email protected]

Скобки - это группы, на которые в строке замены можно ссылаться с помощью \ 1 \ 2 \ 3 ...

"^"        - anchor to start of string
"(.+@)"    - take everything up to '@', we will reference this as \1
".+"       - any number of characters following the @ sign
"+(\..+$)" - everything followed by the last period, anchored to the end of the string
we will reference this with \2

"\1gmail\2" - take the first reference, follow it with "gmail", then follow that 
with the second reference
person Brian Leach    schedule 27.09.2018

Для этого вам не нужен курсор, так как ОБНОВЛЕНИЕ будет достаточно (если только вы не упускаете что-то еще). Помните, строка за строкой = медленно за медленным! Кроме того, в коде процедуры создания есть некоторые синтаксические ошибки. Это обновление выбирает только те строки, которые соответствуют критериям вашего старого домена, и заменяет их новым переданным доменом.

Create or replace Procedure PR_Q3(P_OldDomain varchar2, P_NewDomain Varchar2)
As
BEGIN
  UPDATE Broker
    Set Email_Address = regexp_replace(Email_Address, '^(.*@.*)'||P_OldDomain, '\1'||P_NewDomain)
    WHERE REGEXP_LIKE(Email_Address, '.*@.*'||P_OldDomain);
  COMMIT;
End PR_Q3;

Не забудьте добавить обработку исключений, я оставлю это вам.

person Gary_W    schedule 18.10.2018
comment
Мне нужен хотя бы один курсор, в любом случае я могу сделать это с помощью курсора и по-прежнему использовать то, как вы его написали? - person mike; 18.10.2018