как заменить почтовое имя домена - PullRequest
2 голосов
/ 20 февраля 2020

Я пытаюсь написать процедуру, которая обновляет домен электронной почты (пример: преобразование Email123@gmail.com в Email123@hotmail.com, когда я передаю 2 строки gmail.com и hotmail.com), имея курсор в моей процедуре

create of replace procedure pr_update_email
(Old_Email Varchar2, New_Email Varchar2)
    As
    V_OldDomain Varchar2(50);
      Cursor C_Domains IS Select Email_Address
                From Customer
                where Email_Address Like '%@'||Old_Email;       
          Begin
          Open C_Domains;
          Fetch C_Domains INTO V_OldDomain; 
          While C_Domains %Found loop
                    Update Customer
                    Set Email_Address = regexp_replace(Email_Address, '^(.*@.*)'||Old_Email||'\1'||New_Email)
                    WHERE Email_Address LIKE V_OldDomain;   
          Fetch C_Domains into New_Email;
          End Loop;
  Close C_Domains;
End pr_update_email;
/
Show Errors;

получение ошибок: 19/11 PL / SQL: SQL Оператор игнорируется

19/32 PLS-00403: выражение 'NEW_EMAIL' нельзя использовать в качестве цели INTO объекта Оператор SELECT / FETCH

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Вы можете напрямую обновить, не создавая Stored Procedure, но используя Regexp_Replace() и Instr() Функции:

SQL> Update Customer 
        Set Email_Address = Regexp_Replace(Email_Address,'(.*)@[gmail]+.(.*)','\1@hotmail.\2')
      Where Instr(Email_Address,'@gmail.') > 0;
SQL> Commit;

Если вы хотите создать обобщенную c структуру, чтобы иметь возможность использовать для таких других случаев, а затем передать приведенный выше оператор Update как:

SQL> Create Or Replace Procedure pr_update_email(Old_Email Varchar2, New_Email Varchar2) As
Begin
    Update Customer
       Set Email_Address = Regexp_Replace(Email_Address,'(.*)@['||Old_Email||']+.(.*)','\1@'||New_Email||'.\2')
     Where Instr(Email_Address,'@'||Old_Email||'.')>0 ;

End;
/
SQL> Begin
   pr_update_email('gmail','hotmail');
End;
/
SQL> Commit;
0 голосов
/ 20 февраля 2020

Почему вы используете cursor? Он может быть обработан с помощью простого оператора update.

Ваша процедура должна выглядеть следующим образом:

create procedure pr_update_email (p_oldemail in varchar2,
                       p_newemail in varchar2)
As
Begin

UPDATE BROKER
SET
    EMAIL_ADDRESS = REPLACE(EMAIL_ADDRESS, p_oldemail, p_newemail)
WHERE
    REGEXP_LIKE ( EMAIL_ADDRESS,'.*@'|| p_oldemail|| '$' );

Commit;

End;
/

Или, если вы действительно хотите использовать l oop, тогда

create of replace procedure pr_update_email
(Old_Email Varchar2, New_Email Varchar2)
    As
    Begin
          For i in (Select Email_Address
                From Customer
                where Email_Address Like '%@'||Old_Email) loop

             Update Customer
                Set Email_Address = Replace(Email_Address, old_email, new_email)
              WHERE Email_Address = i.Email_Address;   
          End Loop;
  Commit;
End pr_update_email;
/

Чтобы вызвать эту процедуру, вам нужно передать оба домена следующим образом:

Begin
pr_update_email('gmail.com', 'hotmail.com');
End;
/

И да, проблема в вашем коде следующая строка:

Fetch C_Domains into New_Email;

New_Email является входным параметром, и вы не можете назначить какое-либо значение входному параметру.

Cheers !!

...