Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ईमेल डोमेन बदलना

आपके द्वारा लिखा गया कोड ज्यादा समझ में नहीं आता है; बहुत अधिक फ़ेचिंग जो काम नहीं करेगा (एक चर में दो कॉलम?)।

यहां एक उदाहरण दिया गया है:एक परीक्षण तालिका:

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.

इससे डोमेन भाग को कैसे विभाजित करें (निम्नलिखित चयन का दूसरा कॉलम) और ई-मेल पते को एक नए डोमेन (तीसरा कॉलम) में अपडेट करें:

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>

आइए केवल Gmail ई-मेल पतों को नए डोमेन में अपडेट करें:

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>

यदि आप इसे एक प्रक्रिया में बदलना चाहते हैं, तो कोई बात नहीं:

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>

यदि आप सख्त रूप से कर्सर का उपयोग करना चाहते हैं (मुझे नहीं पता कि आप ऐसा क्यों करना चाहेंगे; यह शायद सबसे अक्षम विकल्प होगा), तो आप यहां जाएं:

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>

लूप के लिए कर्सर आपके प्रयास की तुलना में बनाए रखना आसान है (कर्सर और कर्सर वैरिएबल बनाना, कर्सर खोलना, उससे लाना, लूप से बाहर निकलने का ध्यान रखना, कर्सर को बंद करना)।

लेकिन, अगर आप इसके बिना नहीं रह सकते हैं, तो यहां जाएं:

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>

मेरा सुझाव? यदि संभव हो तो शुद्ध एसक्यूएल का प्रयोग करें। या पहली पीएल/एसक्यूएल प्रक्रिया। इस उद्देश्य के लिए कर्सर का प्रयोग न करें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रत्येक विभाग में पहले दो वेतन

  2. क्या कोई डेटाबेस इंजन है जो RegEx द्वारा निर्दिष्ट क्वेरी करने योग्य फ़ील्ड बाधा की अनुमति देता है?

  3. अपवाद होने पर डेटाबेस कनेक्शन को बंद करने के लिए सर्वश्रेष्ठ डिज़ाइन पैटर्न

  4. ओरेकल के लिए DBMS_SCHEDULER जॉब बनाना

  5. SQL क्वेरी 00904. 00000 - %s:अमान्य पहचानकर्ता