sql >> Database >  >> RDS >> Oracle

E-maildomeinen vervangen

Code die je hebt geschreven, heeft niet veel zin; te veel ophalen wat niet werkt (twee kolommen in een enkele variabele?).

Hier is een voorbeeld:een testtabel:

SQL> create table test (email varchar2(30));

Table created.

SQL> insert into test
  2    select '[email protected]' from dual union all
  3    select '[email protected]' from dual union all
  4    select '[email protected]' from dual union all
  5    select '[email protected]' from dual;

4 rows created.

Hoe een domeingedeelte ervan te splitsen (2e kolom van de volgende SELECT) en e-mailadressen bij te werken naar een nieuw domein (3e kolom):

SQL> select email,
  2    substr(email, instr(email, '@') + 1) domain,
  3    replace(email,
  4            substr(email, instr(email, '@') + 1),
  5            'new_domain.com'
  6           ) result
  7  from test;

EMAIL                     DOMAIN          RESULT
------------------------- --------------- -------------------------
[email protected]            hotmail.com     [email protected]_domain.com
[email protected]            net.hr          [email protected]_domain.com
[email protected]           gmail.com       [email protected]_domain.com
[email protected]        gmail.com       [email protected]_domain.com

SQL>

Laten we alleen Gmail-e-mailadressen bijwerken naar een nieuw domein:

SQL> update test set
  2    email = replace(email,
  3                    substr(email, instr(email, '@') + 1),
  4                    'new_domain.com'
  5                   )
  6  where substr(email, instr(email, '@') + 1) = 'gmail.com';

2 rows updated.

SQL> select * From test;

EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain.com
[email protected]_domain.com

SQL>

Als je het wilt omzetten naar een procedure, geen probleem:

SQL> rollback;

Rollback complete.

SQL> create or replace procedure p_change_domain
  2    (par_old_domain in varchar2,
  3     par_new_domain in varchar2)
  4  is
  5  begin
  6    update test set
  7      email = replace(email,
  8                      substr(email, instr(email, '@') + 1),
  9                      par_new_domain
 10                     )
 11    where substr(email, instr(email, '@') + 1) = par_old_domain;
 12  end;
 13  /

Procedure created.

SQL> exec p_change_domain('gmail.com', 'new_domain_2.com');

PL/SQL procedure successfully completed.

SQL> select * From test;

EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain_2.com
[email protected]_domain_2.com

SQL>

Als je wanhopig cursors wilt gebruiken (ik weet niet waarom je dat zou willen doen; het zal waarschijnlijk de meest inefficiënte optie zijn), hier ga je:

SQL> rollback;

Rollback complete.

SQL> create or replace procedure p_change_domain
  2    (par_old_domain in varchar2,
  3     par_new_domain in varchar2)
  4  is
  5  begin
  6    for cur_r in (select email from test
  7                  where substr(email, instr(email, '@') + 1) = par_old_domain
  8                 )
  9    loop
 10      update test set
 11        email = replace(email,
 12                        substr(email, instr(email, '@') + 1),
 13                        par_new_domain
 14                       )
 15        where email = cur_r.email;
 16    end loop;
 17  end;
 18  /

Procedure created.

SQL> exec p_change_domain('gmail.com', 'new_domain_3.com');

PL/SQL procedure successfully completed.

SQL> select * From test;

EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain_3.com
[email protected]_domain_3.com

SQL>

Cursor FOR-lus is gemakkelijker te onderhouden dan uw poging (een cursor en een cursorvariabele maken, de cursor openen, eruit halen, ervoor zorgen dat u de lus verlaat, de cursor sluiten).

Maar als je niet zonder kunt leven, hier ga je:

SQL> rollback;

Rollback complete.

SQL> create or replace procedure p_change_domain
  2    (par_old_domain in varchar2,
  3     par_new_domain in varchar2)
  4  is
  5    cursor c1 is
  6      select email from test
  7      where substr(email, instr(email, '@') + 1) = par_old_domain;
  8    c1r c1%rowtype;
  9  begin
 10    open c1;
 11    loop
 12      fetch c1 into c1r;
 13      exit when c1%notfound;
 14
 15      update test set
 16        email = replace(email,
 17                        substr(email, instr(email, '@') + 1),
 18                        par_new_domain
 19                       )
 20        where email = c1r.email;
 21    end loop;
 22    close c1;
 23  end;
 24  /

Procedure created.

SQL> exec p_change_domain('gmail.com', 'new_domain_4.com');

PL/SQL procedure successfully completed.

SQL> select * From test;

EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain_4.com
[email protected]_domain_4.com

SQL>

Mijn suggestie? Gebruik indien mogelijk pure SQL. Of de eerste PL/SQL-procedure. Gebruik hiervoor geen cursors.




  1. psycopg2.OperationalError:FATAL:niet-ondersteund frontend-protocol 1234.5679:server ondersteunt 2.0 tot 3.0

  2. NodeJS Hoe om te gaan met gelijktijdige verzoeken aan MySQL

  3. Zet 24-uurs geformatteerde tijd om in decimale getallen

  4. Selecteer producten op meerdere attributen, gebruik AND in plaats van OR concatenator, Datamodel EAV