Как заменить доменное имя всей электронной почты - PullRequest
0 голосов
/ 28 сентября 2018

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

Примеры:

Before                     After
-------------------------- ---------------------------
ExampleEmail@yahoo.com     ExampleEmail@gmail.com
SecondExample@hotmail.com  SecondExample@gmail.com

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

          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;

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

LINE/ COL ERROR


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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

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

WITH
    sampledata AS
        (SELECT 'finger@doctors.com' AS eaddress FROM DUAL
         UNION ALL
         SELECT 'toe.on.foon@real.goofy.org' FROM DUAL
         UNION ALL
         SELECT 'facenose@skeleton.usa' FROM DUAL)
SELECT eaddress
     , REGEXP_REPLACE (eaddress, '^(.+@).+(\..+$)', '\1gmail\2') t
  FROM sampledata;

eaddress                     t
finger@doctors.com          finger@gmail.com
toe.on.foon@real.goofy.org  toe.on.foon@gmail.org
facenose@skeleton.usa       facenose@gmail.usa

В скобках указаны группировки, на которые можно ссылаться в строке замены с помощью \ 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
0 голосов
/ 18 октября 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;

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

0 голосов
/ 28 сентября 2018

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

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

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

regexp_replace(email, '@.+*','@bananas.com')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...